Статьи
Обучающие материалы
Интерактивные руководства
Развертывание ImageLabeller с помощью GitLab
.png?cdnVersion=2566)
Уоррен Марусяк
Старший технический эксперт
Чтобы продемонстрировать, как разрабатывать и развертывать приложения, а также управлять ими с помощью Jira Software и различных подключенных инструментов, наша команда создала ImageLabeller — простое демонстрационное приложение на платформе AWS, которое с помощью машинного обучения наносит метки на изображения.
На этой странице мы расскажем, как развернуть ImageLabeller с помощью GitLab. Прежде чем начать, рекомендуем ознакомиться с архитектурой ImageLabeller и страницами настройки AWS SageMaker в качестве контекста.
Обязательные условия
Если у вас еще нет группы в GitLab, следуйте инструкциям в этом руководстве по GitLab, чтобы создать ее с нуля.
Общедоступные репозитории GitHub с кодом ImageLabeller
Демонстрационное видео интеграции Jira с GitLab
Интеграция Jira и GitLab
В Jira нажмите Board (Доска), а затем — Apps (Приложения), после чего выберите GitLab.

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

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

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

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

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

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

Нажмите SSH Keys (Ключи SSH) и следуйте инструкциям по генерации нового ключа SSH или используйте существующий ключ SSH.
Создание репозитория для инфраструктуры AWS S3
Стандартный цикл разработки обычно подразумевает, что разработчик берет задачу из Jira, переносит ее в раздел незавершенной работы и начинает работать над ней. Идентификатор задачи Jira — это ключ, который связывает разработку с задачей Jira. Это основной компонент интеграции между двумя системами.
Перейдите в Jira и создайте задачу по добавлению репозитория инфраструктуры AWS S3 в GitLab. Обратите внимание на идентификатор задачи (в данном примере — IM-5).

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

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

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

В терминале перейдите в репозиторий 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 (Добавить переменную).

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

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

Настройка защищенных веток для доступа к защищенным переменным
Нажмите Settings (Настройки), а затем — Repository (Репозиторий). Прокрутите страницу вниз и раскройте раздел Protected branches (Защищенные ветки).
Введите префикс идентификатора задачи Jira и звездочку (*).
В данном примере используются идентификаторы задач Jira вида IM-5 и IM-6, поэтому их префиксом будет IM-.
Введите IM-* и нажмите Protect (Защитить).

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

Файл .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 (Конвейеры), чтобы проверить работу конвейера.

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

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

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

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

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

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

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

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

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

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

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

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

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

В терминале перейдите в репозиторий 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 (Токены развертывания).

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

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

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

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

В терминале перейдите в репозиторий 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-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 выполнит развертывание в тестовых средах. Выберите ветку IM-8.

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

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

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

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

В терминале перейдите в репозиторий 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-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 выполнит развертывание в тестовых средах. Выберите ветку IM-10.

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

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

Сообщество DevOps

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