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

Уоррен — в прошлом разработчик, а ныне технический эксперт в сфере ИТ, работающий в Atlassian с 2021 года. Его опыт чрезвычайно обширен, начиная с программного обеспечения для телекоммуникаций на COBOL для мэйнфреймов и заканчивая современной облачной инфраструктурой на базе AWS. Он страстный поклонник технологий, уже успевший поработать на ниве исследований в сфере машинного обучения. Будучи техничским экспертом, Уоррен информирует людей о возможностях продуктов Atlassian и интеграциях партнеров посредством демонстраций, статей и видео. В свободное время его можно найти на татами, с увлечением занимающимся бразильским джиу-джитсу.
Чтобы продемонстрировать, как разрабатывать и развертывать приложения, а также управлять ими с помощью 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.
1git add --all
2git commit -m "IM-5 add s3_infra repository to gitlab"
3git remote add origin git@gitlab.com:pmmquickstartguides/s3_infra.git
4git branch -m mainline
5git 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.
1git checkout -b IM-5Создайте файл .gitlab-ci.yml со следующим кодом YAML. В нем задается рабочий процесс развертывания для тестовой, промежуточной и рабочих сред.
1stages:
2 - merge-request
3 - test-us-west-1
4 - test-us-east-2
5 - production-us-west-2
6 - production-us-east-1
7 - production-ca-central-1
8
9merge-request-pipeline-job:
10 stage: merge-request
11 rules:
12 - if: $CI_PIPELINE_SOURCE == "merge_request_event"
13 script:
14 - echo "This pipeline always succeeds and enables merges during merge requests"
15 - echo true
16
17deploy-test-us-west-1:
18 stage: test-us-west-1
19 environment: test-us-west-1
20 rules:
21 - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
22 image: registry.gitlab.com/gitlab-org/cloud-deploy/aws-base:latest
23 script:
24 - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
25 - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
26 - aws cloudformation deploy --region us-west-1 --template-file template.yml --stack-name OpenDevOpsS3Infra
27
28deploy-test-us-east-2:
29 stage: test-us-east-2
30 environment: test-us-east-2
31 rules:
32 - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
33 image: registry.gitlab.com/gitlab-org/cloud-deploy/aws-base:latest
34 script:
35 - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
36 - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
37 - aws cloudformation deploy --region us-east-2 --template-file template.yml --stack-name OpenDevOpsS3Infra
38
39deploy-production-us-west-2:
40 stage: production-us-west-2
41 environment: production-us-west-2
42 rules:
43 - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
44 image: registry.gitlab.com/gitlab-org/cloud-deploy/aws-base:latest
45 script:
46 - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
47 - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
48 - aws cloudformation deploy --region us-west-2 --template-file template.yml --stack-name OpenDevOpsS3Infra
49
50deploy-production-us-east-1:
51 stage: production-us-east-1
52 environment: production-us-east-1
53 rules:
54 - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
55 image: registry.gitlab.com/gitlab-org/cloud-deploy/aws-base:latest
56 script:
57 - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
58 - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
59 - aws cloudformation deploy --region us-east-1 --template-file template.yml --stack-name OpenDevOpsS3Infra
60
61deploy-production-ca-central-1:
62 stage: production-ca-central-1
63 environment: production-ca-central-1
64 rules:
65 - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
66 image: registry.gitlab.com/gitlab-org/cloud-deploy/aws-base:latest
67 script:
68 - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
69 - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
70 - aws cloudformation deploy --region ca-central-1 --template-file template.yml --stack-name OpenDevOpsS3InfraСведения о файле .gitlab-ci.yml
Этапы
Добавьте блок stages, чтобы определить порядок выполнения конвейера GitLab. Этапы выполняются в порядке, заданном в этом блоке. Задания, связанные с этапом, выполняются параллельно.
1stages:
2 - merge-request
3 - test-us-west-1
4 - test-us-east-2
5 - production-us-west-2
6 - production-us-east-1
7 - production-ca-central-1Вакансии
Задания связаны с этапом и могут быть связаны со средой. Правила в разделе rules определяют, будет ли выполняться конкретное задание. В этом примере правило проверяет, не является ли ветка конвейера веткой по умолчанию и не запускается ли конвейер автоматически в рамках запроса на слияние.
Для каждого задания можно указать изображение. Его можно задать в зависимости от инструмента, необходимого для скрипта в задании. Раздел script определяет набор шагов, выполняемых в задании.
1deploy-test-us-west-1:
2 stage: test-us-west-1
3 environment: test-us-west-1
4 rules:
5 - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
6 image: registry.gitlab.com/gitlab-org/cloud-deploy/aws-base:latest
7 script:
8 - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
9 - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
10 - aws cloudformation deploy --region us-west-1 --template-file template.yml --stack-name OpenDevOpsS3InfraКонвейер запросов на слияние
После подтверждения запроса на слияние GitLab автоматически запускает конвейер. Для этого конвейера можно создать задание, добавив правило. В этом примере задание всегда выполняется.
1merge-request-pipeline-job:
2 stage: merge-request
3 rules:
4 - if: $CI_PIPELINE_SOURCE == "merge_request_event"
5 script:
6 - echo "This pipeline always succeeds and enables merges during merge requests"
7 - echo trueОтправка в функциональную ветку
Выполните следующие запросы в командной строке, чтобы отправить изменения в ветку IM-5 репозитория s3_infra. Включите идентификатор задачи Jira в сообщения о коммитах и имена веток, чтобы позволить интеграции Jira с GitLab отслеживать, что происходит в проекте.
1git add --all
2git commit -m "IM-5 add .gitlab-ci.yml to s3_infra"
3git 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.
1git add --all
2git commit -m "IM-8 add SubmitImage to gitlab"
3git remote add origin git@gitlab.com:pmmquickstartguides/submitimage.git
4git branch -m mainline
5git 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.
1git add --all
2git commit -m "IM-8 add SubmitImage to gitlab"
3git remote add origin git@gitlab.com:pmmquickstartguides/submitimage.git
4git branch -m mainline
5git push -u origin mainlineНеобходимо добавить ключи доступа AWS, а также настроить защищенные ветки и среды развертывания.
Затем добавьте ключи развертывания из своего репозитория SystemTests, чтобы выполнить загрузку конвейера GitLab для SubmitImage, и запустите системные тесты.
Наконец, добавьте идентификатор своего аккаунта AWS в качестве переменной CI/CD.

Файл .gitlab-ci.yml для развертывания в AWS
Перейдите в репозиторий SubmitImage в терминале и создайте ветку с именем, соответствующим идентификатору задачи Jira.
1git checkout -b IM-8Создайте файл .gitlab-ci.yml со следующим кодом YAML. В нем задается рабочий процесс развертывания для тестовой, промежуточной и рабочих сред. Строку git clone для SystemTests необходимо изменить, чтобы в ней был указан ваш репозиторий для системных тестов.
1stages:
2 - merge-request
3 - run-unit-tests
4#US-WEST-1
5 - deploy-us-west-1
6 - test-us-west-1
7#US-EAST-2
8 - deploy-us-east-2
9 - test-us-east-2
10#US-WEST-2
11 - deploy-us-west-2
12 - test-us-west-2
13#US-EAST-1
14 - deploy-us-east-1
15 - test-us-east-1
16#CA-CENTRAL-1
17 - deploy-ca-central-1
18 - test-ca-central-1
19
20merge-request-pipeline-job:
21 stage: merge-request
22 rules:
23 - if: $CI_PIPELINE_SOURCE == "merge_request_event"
24 script:
25 - echo "This pipeline always succeeds and enables merge"
26 - echo true
27
28run-unit-tests:
29 stage: run-unit-tests
30 image: golang:buster
31 rules:
32 - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
33 script:
34 - cd submitImage
35 - go test ./opendevopslambda/...
36
37#US-WEST-1
38deploy-us-west-1:
39 stage: deploy-us-west-1
40 environment: test-us-west-1
41 image: python:latest
42 rules:
43 - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
44 before_script:
45 - pip3 install awscli --upgrade
46 - pip3 install aws-sam-cli --upgrade
47 - wget https://golang.org/dl/go1.16.6.linux-amd64.tar.gz
48 - rm -rf /usr/local/go && tar -C /usr/local -xzf go1.16.6.linux-amd64.tar.gz
49 - export PATH=$PATH:/usr/local/go/bin
50 - go version
51 script:
52 - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
53 - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
54 - sam build
55 - sam package --output-template-file submit-image-packaged.yaml --s3-bucket open-devops-code-us-west-1-$AWS_ACCOUNT_ID --region us-west-1
56 - 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
57
58 #test-us-west-1:
59 # stage: test-us-west-1
60 # environment: test-us-west-1
61 # image: golang:buster
62 # rules:
63 # - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
64 # script:
65 # - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
66 # - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
67 # - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
68 # - cd systemtests
69 # - go test -v ./... -aws_region=us-west-1
70
71#US-EAST-2
72deploy-us-east-2:
73 stage: deploy-us-east-2
74 environment: test-us-east-2
75 image: python:latest
76 rules:
77 - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
78 before_script:
79 - pip3 install awscli --upgrade
80 - pip3 install aws-sam-cli --upgrade
81 - wget https://golang.org/dl/go1.16.6.linux-amd64.tar.gz
82 - rm -rf /usr/local/go && tar -C /usr/local -xzf go1.16.6.linux-amd64.tar.gz
83 - export PATH=$PATH:/usr/local/go/bin
84 - go version
85 script:
86 - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
87 - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
88 - sam build
89 - sam package --output-template-file submit-image-packaged.yaml --s3-bucket open-devops-code-us-east-2-$AWS_ACCOUNT_ID --region us-east-2
90 - 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
91
92 #test-us-east-2:
93 # stage: test-us-east-2
94 # environment: test-us-east-2
95 # image: golang:buster
96 # rules:
97 # - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
98 # script:
99 # - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
100 # - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
101 # - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
102 # - cd systemtests
103 # - go test -v ./... -aws_region=us-east-2
104
105#US-WEST-2
106deploy-us-west-2:
107 stage: deploy-us-west-2
108 environment: production-us-west-2
109 image: python:latest
110 rules:
111 - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
112 before_script:
113 - pip3 install awscli --upgrade
114 - pip3 install aws-sam-cli --upgrade
115 - wget https://golang.org/dl/go1.16.6.linux-amd64.tar.gz
116 - rm -rf /usr/local/go && tar -C /usr/local -xzf go1.16.6.linux-amd64.tar.gz
117 - export PATH=$PATH:/usr/local/go/bin
118 - go version
119 script:
120 - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
121 - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
122 - sam build
123 - sam package --output-template-file submit-image-packaged.yaml --s3-bucket open-devops-code-us-west-2-$AWS_ACCOUNT_ID --region us-west-2
124 - 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
125
126 #test-us-west-2:
127 # stage: test-us-west-2
128 # environment: production-us-west-2
129 # image: golang:buster
130 # rules:
131 # - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
132 # script:
133 # - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
134 # - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
135 # - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
136 # - cd systemtests
137 # - go test -v ./... -aws_region=us-west-2
138
139#US-EAST-1
140deploy-us-east-1:
141 stage: deploy-us-east-1
142 environment: production-us-east-1
143 image: python:latest
144 rules:
145 - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
146 before_script:
147 - pip3 install awscli --upgrade
148 - pip3 install aws-sam-cli --upgrade
149 - wget https://golang.org/dl/go1.16.6.linux-amd64.tar.gz
150 - rm -rf /usr/local/go && tar -C /usr/local -xzf go1.16.6.linux-amd64.tar.gz
151 - export PATH=$PATH:/usr/local/go/bin
152 - go version
153 script:
154 - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
155 - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
156 - sam build
157 - sam package --output-template-file submit-image-packaged.yaml --s3-bucket open-devops-code-us-east-1-$AWS_ACCOUNT_ID --region us-east-1
158 - 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
159
160 #test-us-east-1:
161 # stage: test-us-east-1
162 # environment: production-us-east-1
163 # image: golang:buster
164 # rules:
165 # - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
166 # script:
167 # - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
168 # - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
169 # - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
170 # - cd systemtests
171 # - go test -v ./... -aws_region=us-east-1
172
173#CA-CENTRAL-1
174deploy-central-1:
175 stage: deploy-ca-central-1
176 environment: production-ca-central-1
177 image: python:latest
178 rules:
179 - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
180 before_script:
181 - pip3 install awscli --upgrade
182 - pip3 install aws-sam-cli --upgrade
183 - wget https://golang.org/dl/go1.16.6.linux-amd64.tar.gz
184 - rm -rf /usr/local/go && tar -C /usr/local -xzf go1.16.6.linux-amd64.tar.gz
185 - export PATH=$PATH:/usr/local/go/bin
186 - go version
187 script:
188 - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
189 - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
190 - sam build
191 - sam package --output-template-file submit-image-packaged.yaml --s3-bucket open-devops-code-ca-central-1-$AWS_ACCOUNT_ID --region ca-central-1
192 - 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
193
194 #test-central-1:
195 # stage: test-ca-central-1
196 # environment: production-ca-central-1
197 # image: golang:buster
198 # rules:
199 # - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
200 # script:
201 # - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
202 # - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
203 # - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
204 # - cd systemtests
205 # - go test -v ./... -aws_region=ca-central-1Выполнение интеграционных тестов пока вынесено в комментарии. Системные тесты будут успешно выполняться только после развертывания всего приложения. Раскомментируйте этапы интеграционного тестирования в своем репозитории и запустите конвейер развертывания, когда все компоненты ImageLabeller будут развернуты. Строку git clone для SystemTests необходимо изменить, чтобы в ней был указан ваш репозиторий для системных тестов.
Сведения о файле .gitlab-ci.yml
На этом шаге выполняются модульные тесты из репозитория SubmitImage.
1unit-test-us-west-1:
2 stage: unit-test-us-west-1
3 environment: test-us-west-1
4 image: golang:buster
5 rules:
6 - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
7 script:
8 - cd submitImage
9 - go test ./opendevopslambda/...На этом шаге выполняется развертывание SubmitImage AWS Lambda с использованием AWS SAM. Обратите внимание на раздел before_script. Этот шаг выполняется перед разделом script; его можно использовать для установки зависимостей и настройки различных инструментов.
1deploy-us-west-1:
2 stage: deploy-us-west-1
3 environment: test-us-west-1
4 image: python:latest
5 rules:
6 - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
7 before_script:
8 - pip3 install awscli --upgrade
9 - pip3 install aws-sam-cli --upgrade
10 - wget https://golang.org/dl/go1.16.6.linux-amd64.tar.gz
11 - rm -rf /usr/local/go && tar -C /usr/local -xzf go1.16.6.linux-amd64.tar.gz
12 - export PATH=$PATH:/usr/local/go/bin
13 - go version
14 script:
15 - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
16 - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
17 - sam build
18 - sam package --output-template-file submit-image-packaged.yaml --s3-bucket open-devops-code-us-west-1-$AWS_ACCOUNT_ID --region us-west-1
19 - 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 необходимо изменить, чтобы в ней был указан ваш репозиторий для системных тестов.
1test-us-west-1:
2 stage: test-us-west-1
3 environment: test-us-west-1
4 image: golang:buster
5 rules:
6 - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
7 script:
8 - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
9 - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
10 - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
11 - cd systemtests
12 - go test -v ./... -aws_region=us-west-1Созданный ранее токен развертывания указан в строке git clone.
1- git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.gitОтправка в функциональную ветку
Выполните следующие запросы в командной строке, чтобы отправить изменения в ветку IM-8 репозитория SubmitImage. Включите идентификатор задачи Jira в сообщения о коммитах и имена веток, чтобы позволить интеграции Jira с GitLab отслеживать, что происходит в проекте.
Нажмите 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.
1git add --all
2git commit -m "IM-10 add InvokeLabeller to gitlab"
3git remote add origin git@gitlab.com:pmmquickstartguides/invokelabeller.git
4git branch -m mainline
5git push -u origin mainlineНеобходимо добавить ключи доступа AWS, а также настроить защищенные ветки и среды развертывания.
Затем добавьте ключи развертывания из своего репозитория SystemTests, чтобы выполнить загрузку конвейера GitLab для InvokeLabeller, и запустите системные тесты.
Наконец, добавьте идентификатор своего аккаунта AWS в качестве переменной CI/CD.

Файл .gitlab-ci.yml для развертывания в AWS
Перейдите в репозиторий InvokeLabeller в терминале и создайте ветку с именем, соответствующим идентификатору задачи Jira.
1git checkout -b IM-10Создайте файл .gitlab-ci.yml со следующим кодом YAML. В нем задается рабочий процесс развертывания для тестовой, промежуточной и рабочих сред. Строку git clone для SystemTests необходимо изменить, чтобы в ней был указан ваш репозиторий для системных тестов.
1stages:
2 - merge-request
3 - run-unit-tests
4#US-WEST-1
5 - deploy-us-west-1
6 - test-us-west-1
7#US-EAST-2
8 - deploy-us-east-2
9 - test-us-east-2
10#US-WEST-2
11 - deploy-us-west-2
12 - test-us-west-2
13#US-EAST-1
14 - deploy-us-east-1
15 - test-us-east-1
16#CA-CENTRAL-1
17 - deploy-ca-central-1
18 - test-ca-central-1
19
20merge-request-pipeline-job:
21 stage: merge-request
22 rules:
23 - if: $CI_PIPELINE_SOURCE == "merge_request_event"
24 script:
25 - echo "This pipeline always succeeds and enables merge"
26 - echo true
27
28run-unit-tests:
29 stage: run-unit-tests
30 image: python:3.8-buster
31 rules:
32 - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
33 before_script:
34 - pip3 install pytest
35 - pip3 install moto
36 - pip3 install -r tst/requirements.txt --user
37 script:
38 - python3 -m pytest -v tst/unit --junitxml=test-reports/report.xml
39
40#US-WEST-1
41deploy-us-west-1:
42 stage: deploy-us-west-1
43 environment: test-us-west-1
44 image: python:3.8-buster
45 rules:
46 - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
47 before_script:
48 - pip3 install awscli --upgrade
49 - pip3 install aws-sam-cli --upgrade
50 script:
51 - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
52 - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
53 - sam build
54 - sam package --output-template-file invoke-labeller-packaged.yaml --s3-bucket open-devops-code-us-west-1-$AWS_ACCOUNT_ID --region us-west-1
55 - 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
56
57 #test-us-west-1:
58 # stage: test-us-west-1
59 # environment: test-us-west-1
60 # image: golang:buster
61 # rules:
62 # - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
63 # script:
64 # - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
65 # - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
66 # - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
67 # - cd systemtests
68 # - go test -v ./... -aws_region=us-west-1
69
70#US-EAST-2
71deploy-us-east-2:
72 stage: deploy-us-east-2
73 environment: test-us-east-2
74 image: python:3.8-buster
75 rules:
76 - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
77 before_script:
78 - pip3 install awscli --upgrade
79 - pip3 install aws-sam-cli --upgrade
80 script:
81 - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
82 - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
83 - sam build
84 - sam package --output-template-file invoke-labeller-packaged.yaml --s3-bucket open-devops-code-us-east-2-$AWS_ACCOUNT_ID --region us-east-2
85 - 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
86
87 #test-us-east-2:
88 # stage: test-us-east-2
89 # environment: test-us-east-2
90 # image: golang:buster
91 # rules:
92 # - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
93 # script:
94 # - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
95 # - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
96 # - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
97 # - cd systemtests
98 # - go test -v ./... -aws_region=us-east-2
99
100#US-WEST-2
101deploy-us-west-2:
102 stage: deploy-us-west-2
103 environment: production-us-west-2
104 image: python:3.8-buster
105 rules:
106 - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
107 before_script:
108 - pip3 install awscli --upgrade
109 - pip3 install aws-sam-cli --upgrade
110 script:
111 - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
112 - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
113 - sam build
114 - sam package --output-template-file invoke-labeller-packaged.yaml --s3-bucket open-devops-code-us-west-2-$AWS_ACCOUNT_ID --region us-west-2
115 - 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
116
117 #test-us-west-2:
118 # stage: test-us-west-2
119 # environment: production-us-west-2
120 # image: golang:buster
121 # rules:
122 # - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
123 # script:
124 # - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
125 # - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
126 # - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
127 # - cd systemtests
128 # - go test -v ./... -aws_region=us-west-2
129
130#US-EAST-1
131deploy-us-east-1:
132 stage: deploy-us-east-1
133 environment: production-us-east-1
134 image: python:3.8-buster
135 rules:
136 - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
137 before_script:
138 - pip3 install awscli --upgrade
139 - pip3 install aws-sam-cli --upgrade
140 script:
141 - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
142 - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
143 - sam build
144 - sam package --output-template-file invoke-labeller-packaged.yaml --s3-bucket open-devops-code-us-east-1-$AWS_ACCOUNT_ID --region us-east-1
145 - 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
146
147 #test-us-east-1:
148 # stage: test-us-east-1
149 # environment: production-us-east-1
150 # image: golang:buster
151 # rules:
152 # - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
153 # script:
154 # - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
155 # - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
156 # - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
157 # - cd systemtests
158 # - go test -v ./... -aws_region=us-east-1
159
160#CA-CENTRAL-1
161deploy-central-1:
162 stage: deploy-ca-central-1
163 environment: production-ca-central-1
164 image: python:3.8-buster
165 rules:
166 - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
167 before_script:
168 - pip3 install awscli --upgrade
169 - pip3 install aws-sam-cli --upgrade
170 script:
171 - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
172 - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
173 - sam build
174 - sam package --output-template-file invoke-labeller-packaged.yaml --s3-bucket open-devops-code-ca-central-1-$AWS_ACCOUNT_ID --region ca-central-1
175 - 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
176
177 #test-central-1:
178 # stage: test-ca-central-1
179 # environment: production-ca-central-1
180 # image: golang:buster
181 # rules:
182 # - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
183 # script:
184 # - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
185 # - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
186 # - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
187 # - cd systemtests
188 # - go test -v ./... -aws_region=ca-central-1Чтобы продемонстрировать, как разрабатывать и развертывать приложения, а также управлять ими с помощью Jira Software и различных подключенных инструментов, наша команда создала ImageLabeller — простое демонстрационное приложение на платформе AWS, которое с помощью машинного обучения наносит метки на изображения.
На этой странице мы расскажем, как развернуть ImageLabeller с помощью Bitbucket. Прежде чем начать, рекомендуем ознакомиться с архитектурой ImageLabeller и страницами настройки AWS SageMaker в качестве контекста.
Изменение конечной точки AWS SageMaker в файле src/app.py
Откройте файл src/app.py для InvokeLabeller и найдите определение query_endpoint. Измените значения endpoint_name и region_name, чтобы они соответствовали указанным в блокноте AWS SageMaker.
1def query_endpoint(img):
2 endpoint_name = 'jumpstart-dft-image-labeller-endpoint'
3 client = boto3.client(service_name='runtime.sagemaker', region_name='us-west-1')
4 response = client.invoke_endpoint(EndpointName=endpoint_name, ContentType='application/x-image', Body=img)
5 model_predictions = json.loads(response['Body'].read())['predictions'][0]
6 return model_predictionsОтправка в функциональную ветку
Выполните следующие запросы в командной строке, чтобы отправить изменения в ветку IM-10 репозитория InvokeLabeller. Включите идентификатор задачи Jira в сообщения о коммитах и имена веток, чтобы позволить интеграции Jira с GitLab отслеживать, что происходит в проекте.
1git add --all
2git commit -m "IM-10 add .gitlab-ci.yml to InvokeLabeller"
3git push -u origin IM-10Нажмите CI/CD, а затем — Pipelines (Конвейеры), чтобы проверить работу конвейера.

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

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

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