Page tree
Skip to end of metadata
Go to start of metadata

Одна из наиболее встречаемых задач - это автоматическое развертывание обновленных docker контейнеров в окружении, например после коммита в Gitlab.

Jelastic позволяет реализовать данную задачу с помощью одного HTTP API вызова (документация)

Рассмотрим задачу на примере вот такого окружения:

В данном окружении присутствует балансировщик, два узла docker с web-приложением, узел memcached, и узел docker для тестовых релизов.

Балансировщик распределяет нагрузку между двумя контейнерами поровну, при этом при остановке одного из контейнеров, весь трафик переходит на другой контейнер. При использовании последовательного деплоя, это позволяет добиться нулевого времени простоя (zero-downtime deployment, blue/green deployment).

В окне изменения топологии окружения это выглядит следующим образом:

Обратите внимание, на то что горизонтальное масштабирование для сервера приложений равно 2.

Скрипт для деплоймента

Первое, что нам понадобится - скрипт, который будет инициировать HTTP API вызов в Jelastic. Вот пример такого скрипта на python:

#!/usr/bin/python3
import sys
import json
import requests

STAGING_TAG = 'master'
PRODUCTION_TAG = 'latest'

TOKEN = 'xxx' # https://docs.jelastic.com/personal-access-tokens/
ENV = 'example'
STAGING_ID = 60073


JDOMAIN = 'mycloud.by'
APPID = '58bdf83fea6af021e0c94ba13730fd6b' # для mycloud.by

if len(sys.argv) < 2 or len(sys.argv) > 3:
    print('Usage: ' + sys.argv[0] + ' [staging|production] (tag)')
    sys.exit(1)

mode = sys.argv[1]

try:
    tag = sys.argv[2]
except IndexError:
    tag = None

if mode == 'production':
    if not tag:
        tag = PRODUCTION_TAG
    URL = 'https://app.' + JDOMAIN + '/1.0/environment/control/rest/redeploycontainersbygroup'
    DATA = {
        'token': TOKEN,
        'envName': ENV,
        'nodeGroup': 'cp',
        'tag': tag,
        'isSequential': True,
        'useExistingVolumes': True }
elif mode == 'staging':
    if not tag:
        tag = STAGING_TAG
    URL = 'https://app.' + JDOMAIN + '/1.0/environment/control/rest/redeploycontainerbyid'
    DATA = {
        'token': TOKEN,
        'envName': ENV,
        'nodeId': STAGING_ID,
        'tag': tag,
        'useExistingVolumes': True
        }
else:
    raise ValueError("Invalid mode! Mode should be 'staging' or 'production'")

HEADERS = {
    'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) '
                  'Chrome/56.0.2924.87 Safari/537.36',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    'Accept-Encoding': 'gzip, deflate, sdch',
    'Accept-Language': 'en,en-US;q=0.8,ru;q=0.6,uk;q=0.4',
    'Connection': 'keep-alive'
}

response = requests.post(URL, headers=HEADERS, data=item)
data = json.loads(json.dumps(response.json()))
print(data)
assert data.get("result", 1) == 0


Первым параметром к скрипту указывается, что необходимо редеплоить - группу контейнеров production, или контейнер staging. Вторым опционально можно указать, какой тег docker и docker registry необходимо развернуть.

Перед использованием, необходимо вписать в скрипт параметры вашего окружения и ключ доступа.

Данный скрипт необходимо разместить в git-репозитории вашего проекта

Настройка Gitlab CI/CD

Для настройки Gitlab CI/CD необходимо добавить в корень вашего проекта файл .gitlab-ci.yml

Пример этого файла:

stages:
- build
- release

variables:
  CONTAINER_TEST_IMAGE: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_NAME
  CONTAINER_RELEASE_IMAGE: $CI_REGISTRY_IMAGE:latest

build:
  image: docker:latest
  stage: build
  before_script:
    - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY
  script:
    - docker build -f Dockerfile --pull -t $CONTAINER_TEST_IMAGE .
    - docker push $CONTAINER_TEST_IMAGE

deploy_staging:
  image: python:3
  stage: release
  script:
    - python deploy.py staging $CI_COMMIT_REF_NAME
  when: manual

deploy_production:
  image: python:3
  stage: release
  before_script:
    - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY
  script:
    - docker pull $CONTAINER_TEST_IMAGE
    - docker tag $CONTAINER_TEST_IMAGE $CONTAINER_RELEASE_IMAGE
    - docker push $CONTAINER_RELEASE_IMAGE
  after_script:
    - python deploy.py production
  only: master
  when: manual

После этого в Gitlab CI/CD, внутри pipeline, у вас появятся шаги, которые будут деплоить код на dev и production.

  • No labels