We are already know who is the first human landed on the moon; it's Neil Armstrong, right? But, can you tell me who is the second person who steps his/her foot on the moon?
Being the first in the market is what matter. But, being the first does not means delivering unfinished product. The product that we launch should have value and usable for the target user. Both of this thing can be achieved with CI.
Continuous Integration (CI) is the way to automate the process of integrating frequent changes from multiple developers. Changes in the source code will be tested and build automatically. The usual steps in CI/CD is shown as the following:
- Developers commit changes to GIT repository
- CI will test the code first
- if the tests passed, the current changes may be deployed
- if the tests fails, the current changes will not be deployed until it fixed on the next committed changes.
If you are using Gitlab, you might familiar with
gitlab-ci.yml. This file is written in YAML and contains the instruction of what should it execute.
stages: - test - analysis - deploy test: stage: test image: python:3.6 before_script: - python -V - pip install -r requirements.txt services: - mongo variables: MONGO_URI: 'mongodb://mongo:27017/siveri' NODE_ENV: 'test' script: - python manage.py makemigrations - python manage.py migrate - python manage.py collectstatic --no-input - python manage.py test - coverage run --omit='.env/*,env/*,project/*,*/tests.py,manage.py' manage.py test - coverage report -m black: stage: analysis image: milansuk/python-black:3.8 script: - black --version - black --diff . - black --check . staging: stage: deploy image: ruby:latest before_script: - gem install dpl - wget -qO- https://cli-assets.heroku.com/install-ubuntu.sh | sh script: - dpl --provider=heroku --app=$HEROKU_APP_NAME --api-key=$HEROKU_API_KEY - heroku run --app $HEROKU_APP_NAME python manage.py makemigrations - heroku run --app $HEROKU_APP_NAME python manage.py migrate --run-syncdb only: - staging environment: name: staging url: $HEROKU_APP_HOST production: stage: deploy image: docker:latest services: - docker:dind before_script: - echo $CI_BUILD_TOKEN | docker login -u $CI_REGISTRY_USER --password-stdin $CI_REGISTRY script: - docker build -t $CI_REGISTRY_IMAGE -f Dockerfile . - docker push $CI_REGISTRY_IMAGE only: - master environment: name: production
To be able to reap Continuous Integration full potential, we have to follow available best practices. One of them is by having special branches called staging and production.