Close

Развертывание ImageLabeller с помощью GitLab

Фото Уоррена Марусяка
Уоррен Марусяк

Старший технический эксперт

Чтобы продемонстрировать, как разрабатывать и развертывать приложения, а также управлять ими с помощью Jira Software и различных подключенных инструментов, наша команда создала ImageLabeller — простое демонстрационное приложение на платформе AWS, которое с помощью машинного обучения наносит метки на изображения.

На этой странице мы расскажем, как развернуть ImageLabeller с помощью GitLab. Прежде чем начать, рекомендуем ознакомиться с архитектурой ImageLabeller и страницами настройки AWS SageMaker в качестве контекста.

Обязательные условия

Если у вас еще нет группы в GitLab, следуйте инструкциям в этом руководстве по GitLab, чтобы создать ее с нуля.

Общедоступные репозитории GitHub с кодом ImageLabeller

https://github.com/AtlassianOpenDevOpsGuides

Демонстрационное видео интеграции Jira с GitLab

Интеграция Jira и GitLab

В Jira нажмите Board (Доска), а затем — Apps (Приложения), после чего выберите GitLab.

Снимок экрана: раскрывающееся меню в Jira Software для перехода в GitLab

Нажмите Get it now (Загрузить).

Модальное окно приложения GitLab в Jira Software

Нажмите Apps (Приложения), а затем — Manage your apps (Управление приложениями).

Модальное окно приложения GitLab в Jira Software с раскрывающимся меню

Раскройте раздел GitLab for Jira (GitLab для Jira).

Раскройте GitLab на экране управления приложениями в Jira Software

Нажмите Add namespace (Добавить пространство имен).

Экран для добавления пространства имен в конфигурацию GitLab в Jira Software

Выберите существующее пространство имен и нажмите Link (Привязать). В этом руководстве предполагается, что у вас уже есть аккаунт и группа GitLab.

Привязка пространства имен GitLab в Jira Software

Добавление ключа SSH в GitLab

Нажмите значок профиля в правом верхнем углу и выберите Preferences (Настройки).

Переход к настройкам с помощью раскрывающегося меню в GitLab

Нажмите SSH Keys (Ключи SSH) и следуйте инструкциям по генерации нового ключа SSH или используйте существующий ключ SSH.

Создание репозитория для инфраструктуры AWS S3

Стандартный цикл разработки обычно подразумевает, что разработчик берет задачу из Jira, переносит ее в раздел незавершенной работы и начинает работать над ней. Идентификатор задачи Jira — это ключ, который связывает разработку с задачей Jira. Это основной компонент интеграции между двумя системами.

Перейдите в Jira и создайте задачу по добавлению репозитория инфраструктуры AWS S3 в GitLab. Обратите внимание на идентификатор задачи (в данном примере — IM-5).

Создание новой задачи на доске в Jira Software

Перейдите в GitLab и нажмите New project (Новый проект).

Переход к созданию проекта в GitLab

Нажмите Create blank project (Создать пустой проект).

Создание проекта в GitLab

Добавьте Project name (Имя проекта) и выберите нужную группу в поле Project URL (URL-адрес проекта). Нажмите Create project (Создать проект), чтобы продолжить.

Экран сведений при создании проекта в GitLab

В терминале перейдите в репозиторий s3_infra и выполните следующие команды, чтобы отправить файл template.yml для AWS CloudFormation в GitLab.

git add --all
git commit -m "IM-5 add s3_infra repository to gitlab"
git remote add origin git@gitlab.com:pmmquickstartguides/s3_infra.git
git branch -m mainline
git push -u origin mainline

Добавление ключа доступа AWS

Нажмите Settings (Настройки), а затем — CI/CD. Прокрутите страницу вниз и раскройте раздел Variables (Переменные). Нажмите Add variable (Добавить переменную).

Страница настройки CI/CD в GitLab

Создайте две переменные. Одну — для идентификатора ключа доступа AWS, а другую — для секретного ключа доступа AWS.

Модальное окно добавления переменных с ключами AWS в GitLab

Установите флажок Protect Variables (Защитить переменные), чтобы они использовались только конвейерами, работающими на защищенных ветках, и тегами. Предоставьте пользователю IAM, связанному с ключом доступа AWS, уровень доступа AdministratorAccess (Доступ администратора). Можно использовать и более детальный контроль доступа, выбрав отдельные политики доступа AWS.

Список ключей AWS в разделе переменных на странице настройки CI/CD в GitLab

Настройка защищенных веток для доступа к защищенным переменным

Нажмите Settings (Настройки), а затем — Repository (Репозиторий). Прокрутите страницу вниз и раскройте раздел Protected branches (Защищенные ветки).

Введите префикс идентификатора задачи Jira и звездочку (*).

В данном примере используются идентификаторы задач Jira вида IM-5 и IM-6, поэтому их префиксом будет IM-.

Введите IM-* и нажмите Protect (Защитить).

Настройка защищенных веток в GitLab

В списке защищенных веток теперь указаны mainline и IM-*.

Настройка сред развертывания

Нажмите Deployments (Развертывания), а затем — Environments (Среды). Нажмите New environment (Новая среда), чтобы создать среды. В этом примере используются тестовые среды US-WEST-1 и US-EAST-2 и три рабочие среды US-WEST-2, US-EAST-1 и CA-CENTRAL-1.

Настройка сред развертывания в GitLab

Файл .gitlab-ci.yml для развертывания в AWS

Перейдите в репозиторий s3_infra в терминале и создайте ветку с именем, соответствующим идентификатору задачи Jira.

git checkout -b IM-5

Создайте файл .gitlab-ci.yml со следующим кодом YAML. В нем задается рабочий процесс развертывания для тестовой, промежуточной и рабочих сред.

stages:
  - merge-request
  - test-us-west-1
  - test-us-east-2
  - production-us-west-2
  - production-us-east-1
  - production-ca-central-1

merge-request-pipeline-job:
  stage: merge-request
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
  script:
    - echo "This pipeline always succeeds and enables merges during merge requests"
    - echo true

deploy-test-us-west-1:
  stage: test-us-west-1
  environment: test-us-west-1
  rules:
    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  image: registry.gitlab.com/gitlab-org/cloud-deploy/aws-base:latest
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - aws cloudformation deploy --region us-west-1 --template-file template.yml --stack-name OpenDevOpsS3Infra

deploy-test-us-east-2:
  stage: test-us-east-2
  environment: test-us-east-2
  rules:
    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  image: registry.gitlab.com/gitlab-org/cloud-deploy/aws-base:latest
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - aws cloudformation deploy --region us-east-2 --template-file template.yml --stack-name OpenDevOpsS3Infra

deploy-production-us-west-2:
  stage: production-us-west-2
  environment: production-us-west-2
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  image: registry.gitlab.com/gitlab-org/cloud-deploy/aws-base:latest
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - aws cloudformation deploy --region us-west-2 --template-file template.yml --stack-name OpenDevOpsS3Infra

deploy-production-us-east-1:
  stage: production-us-east-1
  environment: production-us-east-1
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  image: registry.gitlab.com/gitlab-org/cloud-deploy/aws-base:latest
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - aws cloudformation deploy --region us-east-1 --template-file template.yml --stack-name OpenDevOpsS3Infra

deploy-production-ca-central-1:
  stage: production-ca-central-1
  environment: production-ca-central-1
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  image: registry.gitlab.com/gitlab-org/cloud-deploy/aws-base:latest
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - aws cloudformation deploy --region ca-central-1 --template-file template.yml --stack-name OpenDevOpsS3Infra

Сведения о файле .gitlab-ci.yml

Этапы

Добавьте блок stages, чтобы определить порядок выполнения конвейера GitLab. Этапы выполняются в порядке, заданном в этом блоке. Задания, связанные с этапом, выполняются параллельно.

stages:
  - merge-request
  - test-us-west-1
  - test-us-east-2
  - production-us-west-2
  - production-us-east-1
  - production-ca-central-1

Вакансии

Задания связаны с этапом и могут быть связаны со средой. Правила в разделе rules определяют, будет ли выполняться конкретное задание. В этом примере правило проверяет, не является ли ветка конвейера веткой по умолчанию и не запускается ли конвейер автоматически в рамках запроса на слияние.

Для каждого задания можно указать изображение. Его можно задать в зависимости от инструмента, необходимого для скрипта в задании. Раздел script определяет набор шагов, выполняемых в задании.

deploy-test-us-west-1:
  stage: test-us-west-1
  environment: test-us-west-1
  rules:
    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  image: registry.gitlab.com/gitlab-org/cloud-deploy/aws-base:latest
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - aws cloudformation deploy --region us-west-1 --template-file template.yml --stack-name OpenDevOpsS3Infra

Конвейер запросов на слияние

После подтверждения запроса на слияние GitLab автоматически запускает конвейер. Для этого конвейера можно создать задание, добавив правило. В этом примере задание всегда выполняется.

merge-request-pipeline-job:
  stage: merge-request
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
  script:
    - echo "This pipeline always succeeds and enables merges during merge requests"
    - echo true

Отправка в функциональную ветку

Выполните следующие запросы в командной строке, чтобы отправить изменения в ветку IM-5 репозитория s3_infra. Включите идентификатор задачи Jira в сообщения о коммитах и имена веток, чтобы позволить интеграции Jira с GitLab отслеживать, что происходит в проекте.

git add --all
git commit -m "IM-5 add .gitlab-ci.yml to s3_infra"
git push -u origin IM-5

Нажмите CI/CD, а затем — Pipelines (Конвейеры), чтобы проверить работу конвейера.

Экран конвейеров CI/CD в GitLab

Нажмите идентификатор запущенного конвейера.

Идентификатор запущенного конвейера в GitLab

Нажмите задание, чтобы увидеть подробные сведения.

Подробный экран заданий для запущенного конвейера в GitLab

Создание запроса на слияние

Чтобы создать запрос на слияние, нажмите Merge requests (Запросы на слияние), а затем — Create merge request (Создать запрос на слияние).

Экран запросов на слияние в GitLab

Выберите функциональную ветку в качестве исходной, затем нажмите Compare branches and continue (Сравнить ветки и продолжить).

Сравнение исходной и целевой веток в GitLab

Выберите пользователей в полях Assignee (Исполнитель) и Reviewer (Проверяющий).

Выбор проверяющего для запроса на слияние в GitLab

Нажмите Create merge request (Создать запрос на слияние).

Выбор кнопки создания запроса на слияние в GitLab

Просмотрите изменения кода и нажмите Approve (Подтвердить).

Подробный экран запроса на слияние для просмотра изменений в GitLab

Нажмите CI/CD, а затем — Pipelines (Конвейеры), чтобы проверить работу конвейера запроса на слияние.

Переход к экрану конвейеров в GitLab для проверки выполнения запросов на слияние

Нажмите идентификатор конвейера. Обратите внимание, что выполнялось только задание merge-request-pipeline-job.

Страница подробных сведений о конвейере с выполненным заданием merge-request-pipeline-job в GitLab

Вернитесь к запросу на слияние. Для этого нажмите Merge requests (Запросы на слияние), а затем — активный запрос, после чего выберите Merge (Объединить). При этом запустится еще один конвейер.

Слияние по активному запросу в GitLab

Нажмите CI/CD, а затем — Pipelines (Конвейеры). Нажмите идентификатор конвейера.

Страница подробных сведений о конвейере в GitLab со слиянием ветки IM-5 с веткой mainline

Создание репозитория для SystemTests

Перейдите в Jira и создайте задачу для добавления репозитория SystemTests в GitLab. Обратите внимание на идентификатор задачи Jira (в данном примере — IM-7).

Создание задачи в Jira Software по добавлению репозитория GitLab для SubmitImage AWS Lambda

Добавьте Project name (Имя проекта) и выберите нужную группу в поле Project URL (URL-адрес проекта). Нажмите Create project (Создать проект), чтобы продолжить.

Заполнение сведений при создании нового проекта в GitLab

В терминале перейдите в репозиторий SystemTests и запустите следующие команды, чтобы отправить код на GitLab.

git add --all
git commit -m "IM-7 add SystemTests repository to gitlab"
git remote add origin git@gitlab.com:pmmquickstartguides/systemtests.git
git branch -m mainline
git push -u origin mainline

Для репозитория SystemTests не требуется файл .gitlab-ci.yml file. У него нет своего конвейера, поскольку он содержит тесты для запуска в других конвейерах. Обратите внимание на удаленный URL-адрес вашего SystemTests. Конвейеры CI/CD SubmitImage, GetImageLabel и InvokeLabeller будут клонировать репозиторий SystemTests на этапах тестирования. Файл gitlab-ci.yml в последующих репозиториях нужно будет обновить, указав правильный URL-адрес.

Добавление токена развертывания

Чтобы клонировать этот репозиторий во время выполнения других конвейеров, необходимо добавить токен развертывания. Нажмите Settings (Настройки), а затем — Repository (Репозиторий). Прокрутите вниз и раскройте раздел Deploy tokens (Токены развертывания).

Ввод примера имени cloneMe в поле токенов развертывания в GitLab

Введите имя, установите флажок read_repository (Репозиторий для чтения) и нажмите Create deploy token (Создать токен развертывания).

Отмеченный флажок read_repository на странице настроек токенов развертывания в GitLab

Имя пользователя для токена развертывания генерируется автоматически. Пароль токена развертывания предоставляется один раз при создании. Добавьте его в инструмент управления секретами, чтобы на него можно было ссылаться в будущем. Далее в этом руководстве в качестве имени пользователя токена развертывания будет использоваться gitlab_deploy_token, а в качестве пароля — gitlab_deploy_password.

Экран токенов развертывания в GitLab с именем пользователя и паролем

Создание репозитория для SubmitImage AWS Lambda

Перейдите в Jira и создайте задачу для добавления репозитория SubmitImage AWS Lambda в GitLab. Обратите внимание на идентификатор задачи (в данном примере — IM-8).

Доска ImageLabeller в Jira Software с выделенной задачей IM-8 add GitLab repo for SubmitImage AWS Lambda (IM-8 — добавление репозитория GitLab для SubmitImage AWS Lambda)

Перейдите в GitLab и нажмите New project (Новый проект), а затем выберите Create blank project (Создать пустой проект). Добавьте Project name (Имя проекта) и выберите нужную группу в поле Project URL (URL-адрес проекта). Нажмите Create project (Создать проект), чтобы продолжить.

снимок экрана: создание проекта SubmitImage в GitLab

В терминале перейдите в репозиторий SubmitImage и выполните следующие команды для отправки на GitLab.

git add --all
git commit -m "IM-8 add SubmitImage to gitlab"
git remote add origin git@gitlab.com:pmmquickstartguides/submitimage.git
git branch -m mainline
git push -u origin mainline

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

Затем добавьте ключи развертывания из своего репозитория SystemTests, чтобы выполнить загрузку конвейера GitLab для SubmitImage, и запустите системные тесты.

Наконец, добавьте идентификатор своего аккаунта AWS в качестве переменной CI/CD.

снимок экрана: экран переменных в GitLab

Файл .gitlab-ci.yml для развертывания в AWS

Перейдите в репозиторий SubmitImage в терминале и создайте ветку с именем, соответствующим идентификатору задачи Jira.

git checkout -b IM-8

Создайте файл .gitlab-ci.yml со следующим кодом YAML. В нем задается рабочий процесс развертывания для тестовой, промежуточной и рабочих сред. Строку git clone для SystemTests необходимо изменить, чтобы в ней был указан ваш репозиторий для системных тестов.

stages:
  - merge-request
  - run-unit-tests
#US-WEST-1
  - deploy-us-west-1
  - test-us-west-1
#US-EAST-2
  - deploy-us-east-2
  - test-us-east-2
#US-WEST-2
  - deploy-us-west-2
  - test-us-west-2
#US-EAST-1
  - deploy-us-east-1
  - test-us-east-1
#CA-CENTRAL-1
  - deploy-ca-central-1
  - test-ca-central-1

merge-request-pipeline-job:
  stage: merge-request
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
  script:
    - echo "This pipeline always succeeds and enables merge"
    - echo true

run-unit-tests:
  stage: run-unit-tests
  image: golang:buster
  rules:
    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  script:
    - cd submitImage
    - go test ./opendevopslambda/...

#US-WEST-1
deploy-us-west-1:
  stage: deploy-us-west-1
  environment: test-us-west-1
  image: python:latest
  rules:
    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  before_script:
    - pip3 install awscli --upgrade
    - pip3 install aws-sam-cli --upgrade
    - wget https://golang.org/dl/go1.16.6.linux-amd64.tar.gz
    - rm -rf /usr/local/go && tar -C /usr/local -xzf go1.16.6.linux-amd64.tar.gz
    - export PATH=$PATH:/usr/local/go/bin
    - go version
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - sam build
    - sam package --output-template-file submit-image-packaged.yaml --s3-bucket open-devops-code-us-west-1-$AWS_ACCOUNT_ID --region us-west-1
    - sam deploy --template-file submit-image-packaged.yaml --stack-name OpenDevOpsSubmitImage  --s3-bucket open-devops-code-us-west-1-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region us-west-1 --no-fail-on-empty-changeset

      #test-us-west-1:
      #  stage: test-us-west-1
      #  environment: test-us-west-1
      #  image: golang:buster
      #  rules:
      #    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
      #  script:
      #    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
      #    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
      #    - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
      #    - cd systemtests
      #    - go test -v ./... -aws_region=us-west-1

#US-EAST-2
deploy-us-east-2:
  stage: deploy-us-east-2
  environment: test-us-east-2
  image: python:latest
  rules:
    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  before_script:
    - pip3 install awscli --upgrade
    - pip3 install aws-sam-cli --upgrade
    - wget https://golang.org/dl/go1.16.6.linux-amd64.tar.gz
    - rm -rf /usr/local/go && tar -C /usr/local -xzf go1.16.6.linux-amd64.tar.gz
    - export PATH=$PATH:/usr/local/go/bin
    - go version
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - sam build
    - sam package --output-template-file submit-image-packaged.yaml --s3-bucket open-devops-code-us-east-2-$AWS_ACCOUNT_ID --region us-east-2
    - sam deploy --template-file submit-image-packaged.yaml --stack-name OpenDevOpsSubmitImage  --s3-bucket open-devops-code-us-east-2-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region us-east-2 --no-fail-on-empty-changeset

      #test-us-east-2:
      #  stage: test-us-east-2
      #  environment: test-us-east-2
      #  image: golang:buster
      #  rules:
      #    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
      #  script:
      #    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
      #    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
      #    - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
      #    - cd systemtests
      #    - go test -v ./... -aws_region=us-east-2

#US-WEST-2
deploy-us-west-2:
  stage: deploy-us-west-2
  environment: production-us-west-2
  image: python:latest
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  before_script:
    - pip3 install awscli --upgrade
    - pip3 install aws-sam-cli --upgrade
    - wget https://golang.org/dl/go1.16.6.linux-amd64.tar.gz
    - rm -rf /usr/local/go && tar -C /usr/local -xzf go1.16.6.linux-amd64.tar.gz
    - export PATH=$PATH:/usr/local/go/bin
    - go version
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - sam build
    - sam package --output-template-file submit-image-packaged.yaml --s3-bucket open-devops-code-us-west-2-$AWS_ACCOUNT_ID --region us-west-2
    - sam deploy --template-file submit-image-packaged.yaml --stack-name OpenDevOpsSubmitImage  --s3-bucket open-devops-code-us-west-2-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region us-west-2 --no-fail-on-empty-changeset

      #test-us-west-2:
      #  stage: test-us-west-2
      #  environment: production-us-west-2
      #  image: golang:buster
      #  rules:
      #    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
      #  script:
      #    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
      #    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
      #    - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
      #    - cd systemtests
      #    - go test -v ./... -aws_region=us-west-2

#US-EAST-1
deploy-us-east-1:
  stage: deploy-us-east-1
  environment: production-us-east-1
  image: python:latest
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  before_script:
    - pip3 install awscli --upgrade
    - pip3 install aws-sam-cli --upgrade
    - wget https://golang.org/dl/go1.16.6.linux-amd64.tar.gz
    - rm -rf /usr/local/go && tar -C /usr/local -xzf go1.16.6.linux-amd64.tar.gz
    - export PATH=$PATH:/usr/local/go/bin
    - go version
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - sam build
    - sam package --output-template-file submit-image-packaged.yaml --s3-bucket open-devops-code-us-east-1-$AWS_ACCOUNT_ID --region us-east-1
    - sam deploy --template-file submit-image-packaged.yaml --stack-name OpenDevOpsSubmitImage  --s3-bucket open-devops-code-us-east-1-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region us-east-1 --no-fail-on-empty-changeset

      #test-us-east-1:
      #  stage: test-us-east-1
      #  environment: production-us-east-1
      #  image: golang:buster
      #  rules:
      #    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
      #  script:
      #    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
      #    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
      #    - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
      #    - cd systemtests
      #    - go test -v ./... -aws_region=us-east-1

#CA-CENTRAL-1
deploy-central-1:
  stage: deploy-ca-central-1
  environment: production-ca-central-1
  image: python:latest
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  before_script:
    - pip3 install awscli --upgrade
    - pip3 install aws-sam-cli --upgrade
    - wget https://golang.org/dl/go1.16.6.linux-amd64.tar.gz
    - rm -rf /usr/local/go && tar -C /usr/local -xzf go1.16.6.linux-amd64.tar.gz
    - export PATH=$PATH:/usr/local/go/bin
    - go version
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - sam build
    - sam package --output-template-file submit-image-packaged.yaml --s3-bucket open-devops-code-ca-central-1-$AWS_ACCOUNT_ID --region ca-central-1
    - sam deploy --template-file submit-image-packaged.yaml --stack-name OpenDevOpsSubmitImage  --s3-bucket open-devops-code-ca-central-1-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region ca-central-1 --no-fail-on-empty-changeset

      #test-central-1:
      #  stage: test-ca-central-1
      #  environment: production-ca-central-1
      #  image: golang:buster
      #  rules:
      #    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
      #  script:
      #    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
      #    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
      #    - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
      #    - cd systemtests
      #    - go test -v ./... -aws_region=ca-central-1

Выполнение интеграционных тестов пока вынесено в комментарии. Системные тесты будут успешно выполняться только после развертывания всего приложения. Раскомментируйте этапы интеграционного тестирования в своем репозитории и запустите конвейер развертывания, когда все компоненты ImageLabeller будут развернуты. Строку git clone для SystemTests необходимо изменить, чтобы в ней был указан ваш репозиторий для системных тестов.

Сведения о файле .gitlab-ci.yml

На этом шаге выполняются модульные тесты из репозитория SubmitImage.

unit-test-us-west-1:
  stage: unit-test-us-west-1
  environment: test-us-west-1
  image: golang:buster
  rules:
    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  script:
    - cd submitImage
    - go test ./opendevopslambda/...

На этом шаге выполняется развертывание SubmitImage AWS Lambda с использованием AWS SAM. Обратите внимание на раздел before_script. Этот шаг выполняется перед разделом script; его можно использовать для установки зависимостей и настройки различных инструментов.

deploy-us-west-1:
  stage: deploy-us-west-1
  environment: test-us-west-1
  image: python:latest
  rules:
    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  before_script:
    - pip3 install awscli --upgrade
    - pip3 install aws-sam-cli --upgrade
    - wget https://golang.org/dl/go1.16.6.linux-amd64.tar.gz
    - rm -rf /usr/local/go && tar -C /usr/local -xzf go1.16.6.linux-amd64.tar.gz
    - export PATH=$PATH:/usr/local/go/bin
    - go version
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - sam build
    - sam package --output-template-file submit-image-packaged.yaml --s3-bucket open-devops-code-us-west-1-$AWS_ACCOUNT_ID --region us-west-1
    - sam deploy --template-file submit-image-packaged.yaml --stack-name OpenDevOpsSubmitImage  --s3-bucket open-devops-code-us-west-1-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region us-west-1 --no-fail-on-empty-changeset

На этом шаге выполняется загрузка и запуск интеграционных тестов в репозитории SystemTests. Строку git clone для SystemTests необходимо изменить, чтобы в ней был указан ваш репозиторий для системных тестов.

test-us-west-1:
  stage: test-us-west-1
  environment: test-us-west-1
  image: golang:buster
  rules:
    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
    - cd systemtests
    - go test -v ./... -aws_region=us-west-1

Созданный ранее токен развертывания указан в строке git clone.

- git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git

Отправка в функциональную ветку

Выполните следующие запросы в командной строке, чтобы отправить изменения в ветку IM-8 репозитория SubmitImage. Включите идентификатор задачи Jira в сообщения о коммитах и имена веток, чтобы позволить интеграции Jira с GitLab отслеживать, что происходит в проекте.

git add --all
git commit -m "IM-8 add .gitlab-ci.yml to SubmitImage"
git push -u origin IM-8

Нажмите CI/CD, а затем — Pipelines (Конвейеры), чтобы проверить работу конвейера.

снимок экрана: запущенный конвейер в GitLab

Создание запроса на слияние

Создайте запрос на слияние для развертывания в рабочих средах, после того как GitLab выполнит развертывание в тестовых средах. Выберите ветку IM-8.

снимок экрана: запросы на слияние в GitLab

Нажмите CI/CD, а затем — Pipelines (Конвейеры), чтобы проверить работу конвейера запроса на слияние.

снимок экрана: запущенный запрос на слияние в GitLab

Выполните слияние изменений с основной веткой после завершения конвейера запроса на слияние. Нажмите CI/CD, а затем — Pipelines (Конвейеры), чтобы проверить работу конвейера рабочей среды.

снимок экрана: запущенный конвейер рабочей среды в GitLab

Создание репозитория для InvokeLabeller AWS Lambda

Перейдите в Jira и создайте задачу для добавления репозитория InvokeLabeller AWS Lambda в GitLab. Обратите внимание на идентификатор задачи (в данном примере — IM-10).

снимок экрана: задача Jira по созданию репозитория InvokeLabeller в GitLab

Перейдите в GitLab и нажмите New project (Новый проект), а затем выберите Create blank project (Создать пустой проект). Добавьте Project name (Имя проекта) и выберите нужную группу в поле Project URL (URL-адрес проекта). Нажмите Create project (Создать проект), чтобы продолжить.

снимок экрана: создание проекта InvokeLabeller в GitLab

В терминале перейдите в репозиторий InvokeLabeller и выполните следующие команды для отправки на GitLab.

git add --all
git commit -m "IM-10 add InvokeLabeller to gitlab"
git remote add origin git@gitlab.com:pmmquickstartguides/invokelabeller.git
git branch -m mainline
git push -u origin mainline

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

Затем добавьте ключи развертывания из своего репозитория SystemTests, чтобы выполнить загрузку конвейера GitLab для InvokeLabeller, и запустите системные тесты.

Наконец, добавьте идентификатор своего аккаунта AWS в качестве переменной CI/CD.

снимок экрана: страница переменных в GitLab

Файл .gitlab-ci.yml для развертывания в AWS

Перейдите в репозиторий InvokeLabeller в терминале и создайте ветку с именем, соответствующим идентификатору задачи Jira.

git checkout -b IM-10

Создайте файл .gitlab-ci.yml со следующим кодом YAML. В нем задается рабочий процесс развертывания для тестовой, промежуточной и рабочих сред. Строку git clone для SystemTests необходимо изменить, чтобы в ней был указан ваш репозиторий для системных тестов.

stages:
  - merge-request
  - run-unit-tests
#US-WEST-1
  - deploy-us-west-1
  - test-us-west-1
#US-EAST-2
  - deploy-us-east-2
  - test-us-east-2
#US-WEST-2
  - deploy-us-west-2
  - test-us-west-2
#US-EAST-1
  - deploy-us-east-1
  - test-us-east-1
#CA-CENTRAL-1
  - deploy-ca-central-1
  - test-ca-central-1

merge-request-pipeline-job:
  stage: merge-request
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
  script:
    - echo "This pipeline always succeeds and enables merge"
    - echo true

run-unit-tests:
  stage: run-unit-tests
  image: python:3.8-buster
  rules:
    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  before_script:
    - pip3 install pytest
    - pip3 install moto
    - pip3 install -r tst/requirements.txt --user
  script:
    - python3 -m pytest -v tst/unit --junitxml=test-reports/report.xml

#US-WEST-1
deploy-us-west-1:
  stage: deploy-us-west-1
  environment: test-us-west-1
  image: python:3.8-buster
  rules:
    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  before_script:
    - pip3 install awscli --upgrade
    - pip3 install aws-sam-cli --upgrade
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - sam build
    - sam package --output-template-file invoke-labeller-packaged.yaml --s3-bucket open-devops-code-us-west-1-$AWS_ACCOUNT_ID --region us-west-1
    - sam deploy --template-file invoke-labeller-packaged.yaml --stack-name OpenDevOpsInvokeLabeller  --s3-bucket open-devops-code-us-west-1-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region us-west-1 --no-fail-on-empty-changeset

      #test-us-west-1:
      #  stage: test-us-west-1
      #  environment: test-us-west-1
      #  image: golang:buster
      #  rules:
      #    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
      #  script:
      #    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
      #    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
      #    - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
      #    - cd systemtests
      #    - go test -v ./... -aws_region=us-west-1

#US-EAST-2
deploy-us-east-2:
  stage: deploy-us-east-2
  environment: test-us-east-2
  image: python:3.8-buster
  rules:
    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  before_script:
    - pip3 install awscli --upgrade
    - pip3 install aws-sam-cli --upgrade
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - sam build
    - sam package --output-template-file invoke-labeller-packaged.yaml --s3-bucket open-devops-code-us-east-2-$AWS_ACCOUNT_ID --region us-east-2
    - sam deploy --template-file invoke-labeller-packaged.yaml --stack-name OpenDevOpsInvokeLabeller  --s3-bucket open-devops-code-us-east-2-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region us-east-2 --no-fail-on-empty-changeset

      #test-us-east-2:
      #  stage: test-us-east-2
      #  environment: test-us-east-2
      #  image: golang:buster
      #  rules:
      #    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
      #  script:
      #    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
      #    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
      #    - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
      #    - cd systemtests
      #    - go test -v ./... -aws_region=us-east-2

#US-WEST-2
deploy-us-west-2:
  stage: deploy-us-west-2
  environment: production-us-west-2
  image: python:3.8-buster
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  before_script:
    - pip3 install awscli --upgrade
    - pip3 install aws-sam-cli --upgrade
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - sam build
    - sam package --output-template-file invoke-labeller-packaged.yaml --s3-bucket open-devops-code-us-west-2-$AWS_ACCOUNT_ID --region us-west-2
    - sam deploy --template-file invoke-labeller-packaged.yaml --stack-name OpenDevOpsInvokeLabeller  --s3-bucket open-devops-code-us-west-2-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region us-west-2 --no-fail-on-empty-changeset

      #test-us-west-2:
      #  stage: test-us-west-2
      #  environment: production-us-west-2
      #  image: golang:buster
      #  rules:
      #    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
      #  script:
      #    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
      #    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
      #    - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
      #    - cd systemtests
      #    - go test -v ./... -aws_region=us-west-2

#US-EAST-1
deploy-us-east-1:
  stage: deploy-us-east-1
  environment: production-us-east-1
  image: python:3.8-buster
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  before_script:
    - pip3 install awscli --upgrade
    - pip3 install aws-sam-cli --upgrade
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - sam build
    - sam package --output-template-file invoke-labeller-packaged.yaml --s3-bucket open-devops-code-us-east-1-$AWS_ACCOUNT_ID --region us-east-1
    - sam deploy --template-file invoke-labeller-packaged.yaml --stack-name OpenDevOpsInvokeLabeller  --s3-bucket open-devops-code-us-east-1-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region us-east-1 --no-fail-on-empty-changeset

      #test-us-east-1:
      #  stage: test-us-east-1
      #  environment: production-us-east-1
      #  image: golang:buster
      #  rules:
      #    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
      #  script:
      #    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
      #    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
      #    - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
      #    - cd systemtests
      #    - go test -v ./... -aws_region=us-east-1

#CA-CENTRAL-1
deploy-central-1:
  stage: deploy-ca-central-1
  environment: production-ca-central-1
  image: python:3.8-buster
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  before_script:
    - pip3 install awscli --upgrade
    - pip3 install aws-sam-cli --upgrade
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - sam build
    - sam package --output-template-file invoke-labeller-packaged.yaml --s3-bucket open-devops-code-ca-central-1-$AWS_ACCOUNT_ID --region ca-central-1
    - sam deploy --template-file invoke-labeller-packaged.yaml --stack-name OpenDevOpsInvokeLabeller  --s3-bucket open-devops-code-ca-central-1-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region ca-central-1 --no-fail-on-empty-changeset

      #test-central-1:
      #  stage: test-ca-central-1
      #  environment: production-ca-central-1
      #  image: golang:buster
      #  rules:
      #    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
      #  script:
      #    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
      #    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
      #    - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
      #    - cd systemtests
      #    - go test -v ./... -aws_region=ca-central-1

Выполнение интеграционных тестов пока вынесено в комментарии. Системные тесты будут успешно выполняться только после развертывания всего приложения. Раскомментируйте этапы интеграционного тестирования в своем репозитории и запустите конвейер развертывания, когда все компоненты ImageLabeller будут развернуты. Строку git clone для SystemTests необходимо изменить, чтобы в ней был указан ваш репозиторий для системных тестов.

Изменение конечной точки AWS SageMaker в файле src/app.py

Откройте файл src/app.py для InvokeLabeller и найдите определение query_endpoint. Измените значения endpoint_name и region_name, чтобы они соответствовали указанным в блокноте AWS SageMaker.

def query_endpoint(img):
  endpoint_name = 'jumpstart-dft-image-labeller-endpoint'
  client = boto3.client(service_name='runtime.sagemaker', region_name='us-west-1')
  response = client.invoke_endpoint(EndpointName=endpoint_name, ContentType='application/x-image', Body=img)
  model_predictions = json.loads(response['Body'].read())['predictions'][0]
  return model_predictions

Отправка в функциональную ветку

Выполните следующие запросы в командной строке, чтобы отправить изменения в ветку IM-10 репозитория InvokeLabeller. Включите идентификатор задачи Jira в сообщения о коммитах и имена веток, чтобы позволить интеграции Jira с GitLab отслеживать, что происходит в проекте.

git add --all
git commit -m "IM-10 add .gitlab-ci.yml to InvokeLabeller"
git push -u origin IM-10

Нажмите CI/CD, а затем — Pipelines (Конвейеры), чтобы проверить работу конвейера.

снимок экрана: запущенный конвейер в GitLab

Создание запроса на слияние

Создайте запрос на слияние для развертывания в рабочих средах, после того как GitLab выполнит развертывание в тестовых средах. Выберите ветку IM-10.

снимок экрана: создание запроса на слияние в GitLab

Выполните слияние изменений с основной веткой после завершения конвейера запроса на слияние. Нажмите CI/CD, а затем — Pipelines (Конвейеры), чтобы проверить работу конвейера рабочей среды.

снимок экрана: запущенный конвейер рабочей среды в GitLab

Если вы дошли до этого шага, вас можно поздравить! Вы только что развернули ImageLabeller. Следующий шаг — настройка мониторинга ImageLabeller с помощью Opsgenie.

Warren Marusiak
Warren Marusiak

Warren is a Canadian developer from Vancouver, BC with over 10 years of experience. He came to Atlassian from AWS in January of 2021.


Поделитесь этой статьей

Рекомендуемые статьи

Добавьте эти ресурсы в закладки, чтобы изучить типы команд DevOps или получать регулярные обновления по DevOps в Atlassian.

Рисунок: DevOps

Сообщество DevOps

Рисунок: DevOps

Образовательные программы DevOps

Рисунок схемы

Начните работу бесплатно

Подпишитесь на информационную рассылку по DevOps

Thank you for signing up