Devops Learning Day – 4

Continuos Integration Continuos Delivery

Grab – Have more than 22 Microservices

developer need to confirm each commit update, will not break any other services

Benefit CICD

  1. Equipment – no need expensive machine for programmer to run all services
  2. Business and IP – no one have access to all code
  3. Security – Hacker need to access to all microservices

Tools :

  1. Jenkins – obsolete
  2. Gitlab, Bitbucket – Most company
  3. Github action – Newest
  4. Gitee – Chinesecompany mostly use.

Process :

  1. Build – Check image is running or not
  2. Test – Check integration packages like pip selenium and run app
  3. Deploy – Supervisor will deploy if both above pass

Gitlab :

Gitlab -> build -> Pipelines ->
Select Docker ->
Pipeline Editor ->
.gitlab-ci.yml

Add .env variables to CICD process :

Because .env not push to repo, then we need to add .env to CICD settings variables

gitlab -> setting -> cicd

Notes :

Usually tester will have to write their test using selenium.

Use selenium to test full stack app
chrome ext selenium IDE

& using pytest to test it

record then export test_app.py, save at project dir

Sample CI file :

# This example is for testing Django with MySQL.
#
# The test CI/CD variables MYSQL_DB, MYSQL_USER and MYSQL_PASS can be set in the project settings at:
#     Settings --> CI/CD --> Variables
#
# The Django settings in settings.py, used in tests, might look similar to:
#
#  DATABASES = {
#      'default': {
#         'ENGINE': 'django.db.backends.mysql',
#         'NAME': os.environ.get('MYSQL_DATABASE'),
#        	'USER':  os.environ.get('MYSQL_USER'),
#        	'PASSWORD': os.environ.get('MYSQL_PASSWORD'),
#       	'HOST': 'mysql',
#     	  'PORT': '3306',
#         'CONN_MAX_AGE':60,
#      },
#  }
#
# It is possible to use '--settings' to specify a custom settings file on the command line below or use an environment
# variable to trigger an include on the bottom of your settings.py:
#   if os.environ.get('DJANGO_CONFIG')=='test':
#       from .settings_test import *
#
# It is also possible to hardcode the database name and credentials in the settings.py file and in the .gitlab-ci.yml file.
#
# The mysql service needs some variables too. See https://hub.docker.com/_/mysql for possible mysql env variables
# Note that when using a service in GitLab CI/CD that needs environment variables to run, only variables defined in
# .gitlab-ci.yml are passed to the service and variables defined in the GitLab UI are not.
# https://gitlab.com/gitlab-org/gitlab/-/issues/30178

variables:
  # DJANGO_CONFIG: "test"
  MYSQL_DATABASE: $MYSQL_DB
  MYSQL_ROOT_PASSWORD: $MYSQL_PASS
  MYSQL_USER: $MYSQL_USER
  MYSQL_PASSWORD: $MYSQL_PASS

default:
  image: ubuntu:20.04
  #
  # Pick zero or more services to be used on all builds.
  # Only needed when using a docker container to run your tests in.
  # Check out: https://docs.gitlab.com/ee/ci/services/index.html
  services:
    - mysql:8.0
  #
  # This folder is cached between builds
  # http://docs.gitlab.com/ee/ci/yaml/README.html#cache
  cache:
    paths:
      - ~/.cache/pip/
  before_script:
    - apt -y update
    - apt -y install apt-utils
    - apt -y install net-tools python3.8 python3-pip mysql-client libmysqlclient-dev
    - apt -y upgrade
    - pip3 install -r requirements.txt


migrations:
  stage: build
  script:
    - python3 manage.py makemigrations
    # - python3 manage.py makemigrations myapp
    - python3 manage.py migrate
    - python3 manage.py check


django-tests:
  stage: test
  script:
    # The MYSQL user only gets permissions for MYSQL_DB, so Django can't create a test database.
    - echo "GRANT ALL on *.* to '${MYSQL_USER}';"| mysql -u root --password="${MYSQL_ROOT_PASSWORD}" -h mysql
    # use python3 explicitly. see https://wiki.ubuntu.com/Python/3
    - python3 manage.py test

deploy:
  stage: deploy
  script: echo "Define your deployment script!"
  environment: production
Share the Post:

Related Posts