Развертывание 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.

Снимок экрана: раскрывающееся меню в 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.

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

Страница настройки 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.

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

Экран конвейеров 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.

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

Ввод примера имени 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 (Создать проект), чтобы продолжить.

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

В терминале перейдите в репозиторий 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

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

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

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

Файл .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

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

Создайте запрос на слияние для развертывания в рабочих средах, после того как 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.

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

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

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

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

Файл .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

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

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

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

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

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

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

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

Рекомендовано для вас

Сообщество DevOps

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

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

Morty Proxy This is a proxified and sanitized view of the page, visit original site.