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
- Equipment – no need expensive machine for programmer to run all services
- Business and IP – no one have access to all code
- Security – Hacker need to access to all microservices
Tools :
- Jenkins – obsolete
- Gitlab, Bitbucket – Most company
- Github action – Newest
- Gitee – Chinesecompany mostly use.
Process :
- Build – Check image is running or not
- Test – Check integration packages like pip selenium and run app
- 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