Статьи
Обучающие материалы
Интерактивные руководства
Развертывание ImageLabeller с помощью Bitbucket
Уоррен Марусяк
Старший технический эксперт
Чтобы продемонстрировать, как разрабатывать и развертывать приложения, а также управлять ими с помощью Jira Software и различных подключенных инструментов, наша команда создала ImageLabeller — простое демонстрационное приложение на платформе AWS, которое с помощью машинного обучения наносит метки на изображения.
На этой странице мы расскажем, как развернуть ImageLabeller с помощью Bitbucket. Прежде чем начать, рекомендуем ознакомиться с архитектурой ImageLabeller и страницами настройки AWS SageMaker в качестве контекста.
Обязательные условия
Если вы еще не настроили SSH для своего аккаунта Bitbucket, следуйте этим инструкциям.
Общедоступные репозитории GitHub с кодом ImageLabeller
Демонстрационное видео о конвейерах Bitbucket
Создание репозитория для инфраструктуры AWS S3
Стандартный цикл разработки обычно подразумевает, что разработчик берет задачу из Jira, переносит ее в раздел незавершенной работы и начинает работать над ней. Идентификатор задачи Jira — это ключ, который связывает разработку с задачей Jira. Это основной компонент интеграции между двумя системами.
Перейдите в Jira и создайте задачу по добавлению репозитория инфраструктуры AWS S3 в Bitbucket. Обратите внимание на идентификатор задачи (в данном примере — IM-5).
Перейдите в Bitbucket > Create > Repository (Создать > Репозиторий).
Выберите необходимые значения в полях Workspace (Рабочее пространство) и Project (Проект). Задайте mainline в качестве Default branch name (Имя ветки по умолчанию). Нажмите Create repository (Создать репозиторий), чтобы продолжить.
В терминале перейдите в репозиторий s3_infra и выполните следующие команды, чтобы отправить файл template.yml для AWS CloudFormation в Bitbucket.
git add --all
git commit -m "IM-5 add s3_infra repository to Bitbucket"
git remote add origin git@bitbucket.org:pmmquickstartguides01/s3_infra.git
git branch -m mainline
git push -u origin mainline
Активируйте Bitbucket Pipelines
Перейдите в раздел Repository settings > Settings > Enable Pipelines (Настройки репозитория > Настройки > Включить конвейеры).
Добавление переменных ключей AWS для доступа к репозиторию
Перейдите в раздел Repository variables (Переменные репозитория), введите идентификатор ключа доступа AWS и нажмите Add (Добавить). Затем введите секретный ключ доступа AWS и нажмите Add (Добавить).
Настройка сред развертывания
Нажмите Deployments (Развертывания).
Нажмите add environment (добавить среду), чтобы добавить новые среды. В этом примере используется тестовая среда US-WEST-1, промежуточная среда US-EAST-2 и три рабочие среды в US-WEST-2, US-EAST-1 и CA-CENTRAL-1.
Файл bitbucket-pipelines.yml для развертывания в AWS
Перейдите в репозиторий s3_infra в терминале и создайте ветку с именем, соответствующим идентификатору задачи Jira.
git checkout -b IM-5
Создайте файл bitbucket-pipelines.yml со следующим кодом YAML. В нем задается рабочий процесс развертывания для тестовой, промежуточной и рабочих сред.
definitions:
steps:
- step: &deploy-test-usw1
name: Deploy Test us-west-1
script:
- pipe: atlassian/aws-cloudformation-deploy:0.10.0
variables:
AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
AWS_DEFAULT_REGION: 'us-west-1'
STACK_NAME: 'OpenDevOpsS3Infra'
CAPABILITIES: ['CAPABILITY_IAM', 'CAPABILITY_AUTO_EXPAND']
WAIT: 'true'
TEMPLATE: 'template.yml'
- step: &deploy-staging-use2
name: Deploy Staging us-east-2
script:
- pipe: atlassian/aws-cloudformation-deploy:0.10.0
variables:
AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
AWS_DEFAULT_REGION: 'us-east-2'
STACK_NAME: 'OpenDevOpsS3Infra'
CAPABILITIES: ['CAPABILITY_IAM', 'CAPABILITY_AUTO_EXPAND']
WAIT: 'true'
TEMPLATE: 'template.yml'
- step: &deploy-production-usw2
name: Deploy Production us-west-2
script:
- pipe: atlassian/aws-cloudformation-deploy:0.10.0
variables:
AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
AWS_DEFAULT_REGION: 'us-west-2'
STACK_NAME: 'OpenDevOpsS3Infra'
CAPABILITIES: ['CAPABILITY_IAM', 'CAPABILITY_AUTO_EXPAND']
WAIT: 'true'
TEMPLATE: 'template.yml'
- step: &deploy-production-use1
name: Deploy Production us-east-1
script:
- pipe: atlassian/aws-cloudformation-deploy:0.10.0
variables:
AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
AWS_DEFAULT_REGION: 'us-east-1'
STACK_NAME: 'OpenDevOpsS3Infra'
CAPABILITIES: ['CAPABILITY_IAM', 'CAPABILITY_AUTO_EXPAND']
WAIT: 'true'
TEMPLATE: 'template.yml'
- step: &deploy-production-cac1
name: Deploy Production ca-central-1
script:
- pipe: atlassian/aws-cloudformation-deploy:0.10.0
variables:
AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
AWS_DEFAULT_REGION: 'ca-central-1'
STACK_NAME: 'OpenDevOpsS3Infra'
CAPABILITIES: ['CAPABILITY_IAM', 'CAPABILITY_AUTO_EXPAND']
WAIT: 'true'
TEMPLATE: 'template.yml'
pipelines:
default:
- step:
<<: *deploy-test-usw1
deployment: Test us-west-1
- step:
<<: *deploy-staging-use2
deployment: Staging us-east-2
branches:
mainline:
- step:
<<: *deploy-production-usw2
deployment: Production us-west-2
- step:
<<: *deploy-production-use1
deployment: Production us-east-1
- step:
<<: *deploy-production-cac1
deployment: Production ca-central-1
Сведения о файле bitbucket-pipelines.yml
Определения и шаги
Перечислите набор шагов после ключевого слова steps в разделе definitions. Для каждого шага после слова step указывается псевдоним, который служит ссылкой для него в пределах файла bitbucket-pipelines.yml, после слова name — имя, которое отображается на экране развертывания Bitbucket, и сценарий после слова script. Сценарий — это набор из одной или нескольких команд.
definitions:
steps:
- step: &deploy-test-usw1
name: Deploy Test us-west-1
script:
- pipe: atlassian/aws-cloudformation-deploy:0.10.0
variables:
AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
AWS_DEFAULT_REGION: 'us-west-1'
STACK_NAME: 'OpenDevOpsS3Infra'
CAPABILITIES: ['CAPABILITY_IAM', 'CAPABILITY_AUTO_EXPAND']
WAIT: 'true'
TEMPLATE: 'template.yml'
Pipes
На этом шаге используется элемент конвейера atlassian/aws-cloudformation-deploy
для развертывания корзин AWS S3, определенных в файле s3_infra template.yml.
- pipe: atlassian/aws-cloudformation-deploy:0.10.0
Доступные элементы конвейера можно найти здесь. Документацию по элементу atlassian/aws-cloudformation-deploy
можно найти здесь.
Pipelines
В разделе pipelines перечислены конвейеры, каждый из которых представляет собой последовательность шагов. В конвейере по умолчанию, default, выполняются шаги для веток, которые не указаны явным образом в других конвейерах. В нашем конвейере по умолчанию будут выполняться этапы развертывания в тестовой и промежуточной средах.
pipelines:
default:
- step:
<<: *deploy-test-usw1
deployment: Test us-west-1
- step:
<<: *deploy-staging-use2
deployment: Staging us-east-2
Параметр deployment обеспечивает интеграцию между Jira и Bitbucket.
deployment: Test us-west-1
В разделе branches можно задать шаги для конкретных веток по их именам. В приведенном ниже фрагменте описан набор шагов для основной ветки mainline.
branches:
mainline:
- step:
<<: *deploy-production-usw2
deployment: Production us-west-2
- step:
<<: *deploy-production-use1
deployment: Production us-east-1
- step:
<<: *deploy-production-cac1
deployment: Production ca-central-1
Дополнительную информацию по этой теме можно найти в этой справочной статье.
Отправка в функциональную ветку
Выполните следующие запросы в командной строке, чтобы отправить изменения в ветку IM-5 репозитория s3_infra. Включите идентификатор задачи Jira в сообщения о коммитах и имена веток, чтобы позволить интеграции Jira с Bitbucket отслеживать, что происходит в проекте.
git add --all
git commit -m "IM-5 add bitbucket-pipelines.yml"
git push -u origin IM-5
Нажмите Pipelines (Конвейеры), а затем — IM-5, чтобы увидеть запущенный конвейер.
Нажмите сам конвейер, чтобы увидеть подробности выполнения. Конвейер запустил шаги по развертыванию в тестовой среде в us-west-1 и в промежуточной среде в us-east-2.
Создание запроса pull
Чтобы создать запрос pull, нажмите Pull requests (Запросы pull), а затем — Create pull request (Создать запрос pull).
Выберите свою функциональную ветку в качестве исходной, отметьте флажок Close branch (Закрыть ветку) и нажмите Create pull request (Создать запрос pull).
Просмотрите изменения кода в запросе pull, затем нажмите Approve (Подтвердить) и Merge (Объединить).
При нажатии кнопки Merge (Объединить) откроется экран слияния с запросом pull. Отметьте флажок Transition issue (Изменить статус задачи) и нажмите Merge (Объединить).
Нажмите Pipelines (Конвейеры), чтобы проследить за конвейером для основной ветки.
Ветка IM-5 исчезла. Осталась основная ветка, и конвейер запущен. Нажмите конвейер.
Конвейер выполнил шаги по развертыванию в рабочих средах в us-west-2, us-east-1 и ca-central-1. Если конвейер не сможет успешно завершить работу, можно выполнить его повторно, нажав кнопку Rerun (Перезапустить).
Откат развертываний с ошибками
Чтобы откатить развертывание, нажмите Deployments (Развертывания).
Выберите среду, которую требуется откатить, чтобы получить список прошлых развертываний, выберите версию, до которой будет выполняться откат, и нажмите Redeploy (Развернуть еще раз).
Проверьте изменения и нажмите Redeploy (Развернуть еще раз).
Повторное развертывание выполняется только для выбранной среды.
Создание репозитория для SubmitImage AWS Lambda
Перейдите в Jira и создайте задачу для добавления репозитория SubmitImage в Bitbucket. Обратите внимание на идентификатор задачи Jira (в данном примере — IM-6).
Перейдите в Bitbucket и нажмите Create (Создать), а затем — Repository (Репозиторий).
Выберите необходимые значения в полях Workspace (Рабочее пространство) и Project (Проект). Задайте mainline в качестве Default branch name (Имя ветки по умолчанию). Нажмите Create repository (Создать репозиторий), чтобы продолжить.
В терминале перейдите в репозиторий SubmitImage и выполните следующие команды для отправки кода AWS Lambda в Bitbucket. Включите идентификатор задачи Jira в сообщения о коммитах и имена веток, чтобы позволить интеграции Jira с Bitbucket отслеживать, что происходит в проекте.
git add --all
git commit -m "IM-6 add SubmitImage to Bitbucket"
git remote add origin git@bitbucket.org:pmmquickstartguides01/submitimage.git
git branch -m mainline
git push -u origin mainline
Включение конвейеров
Перейдите в раздел Repository settings (Настройки репозитория) и нажмите Settings (Настройки), а затем — Enable Pipelines (Включить конвейеры).
Добавление переменных репозитория
Нажмите Repository variables (Переменные репозитория), чтобы добавить идентификатор ключа доступа AWS, секретный ключ доступа AWS и идентификатор аккаунта AWS. Предоставьте пользователю IAM, связанному с ключом доступа AWS, уровень доступа AdministratorAccess (Доступ администратора). Можно использовать более детальный контроль доступа, выбрав отдельные политики доступа AWS.
Добавление сред развертывания
Нажмите Deployments (Развертывания), а затем — add environment (Добавить среду), чтобы добавить новые среды. В этом примере используется тестовая среда us-west-1, промежуточная среда us-east-2 и три рабочие среды в us-west-2, us-east-1 и ca-central-1.
Создание ключей SSH
Перейдите в свой репозиторий SubmitImage в Bitbucket и нажмите Repository settings (Настройки репозитория), а затем — SSH keys (Ключи SSH), после чего выберите Generate keys (Сгенерировать ключи).
Этот ключ SSH понадобится при создании репозитория SystemTests.
Файл bitbucket-pipelines.yml для развертывания в AWS
Перейдите в репозиторий SubmitImage в терминале и создайте ветку с именем, соответствующим идентификатору задачи Jira.
git checkout -b IM-6
Создайте файл bitbucket-pipelines.yml со следующими данными YAML. В нем задается конвейер Bitbucket для тестовой, промежуточной и производственной сред. Строку git clone для SystemTests необходимо изменить, чтобы в ней был указан ваш репозиторий для системных тестов.
definitions:
steps:
-step: &rununittests
name: run unit tests
image: golang:buster
script:
- cd submitImage
- go test ./opendevopslambda/...
-step: &deploy-test-usw1
name: Deploy Test us-west-1
image: amazon/aws-sam-cli-build-image-provided
script:
- curl https://dl.google.com/go/go1.16.3.linux-amd64.tar.gz -o go1.16.3.tar.gz
- rm -rf /usr/local/go
- tar -C /usr/local -xzf go1.16.3.tar.gz
- export PATH=$PATH:/usr/local/go/bin
- go version
- make
- ls -lah /opt/atlassian/pipelines/agent/build/build/
- pipe: atlassian/aws-sam-deploy:1.2.0
variables:
AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
AWS_DEFAULT_REGION: 'us-west-1'
STACK_NAME: 'OpenDevOpsSubmitImage'
CAPABILITIES: [ 'CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND' ]
TEMPLATE: 'https://s3.amazonaws.com/open-devops-code-us-west-1-${AWS_ACCOUNT_ID}/submit-image-packaged.yml'
WAIT: 'true'
DEBUG: 'true'
S3_BUCKET: 'open-devops-code-us-west-1-${AWS_ACCOUNT_ID}'
SAM_TEMPLATE: 'build/template.yaml'
-step: &integration-test-usw1
name: Integration test usw1
image: golang:buster
script:
- git clone git@bitbucket.org:pmmquickstartguides01/systemtests.git
- cd systemtests
- go test -v ./... -aws_region=us-west-1
-step: &deploy-staging-use2
name: Deploy Staging us-east-2
image: amazon/aws-sam-cli-build-image-provided
script:
- curl https://dl.google.com/go/go1.16.3.linux-amd64.tar.gz -o go1.16.3.tar.gz
- rm -rf /usr/local/go
- tar -C /usr/local -xzf go1.16.3.tar.gz
- export PATH=$PATH:/usr/local/go/bin
- go version
- make
- ls -lah /opt/atlassian/pipelines/agent/build/build/
- BITBUCKET_PIPE_SHARED_STORAGE_DIR="/opt/atlassian/pipelines/agent/build/.bitbucket/pipelines/generated/pipeline/pipes"
- chmod -R o+rw $BITBUCKET_PIPE_SHARED_STORAGE_DIR
- pipe: atlassian/aws-sam-deploy:1.2.0
variables:
AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
AWS_DEFAULT_REGION: 'us-east-2'
STACK_NAME: 'OpenDevOpsSubmitImage'
CAPABILITIES: [ 'CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND' ]
TEMPLATE: 'https://s3.amazonaws.com/open-devops-code-us-east-2-${AWS_ACCOUNT_ID}/submit-image-packaged.yml'
WAIT: 'true'
DEBUG: 'true'
S3_BUCKET: 'open-devops-code-us-east-2-${AWS_ACCOUNT_ID}'
SAM_TEMPLATE: 'build/template.yaml'
-step: &integration-test-use2
name: Integration test use2
image: golang:buster
script:
- git clone git@bitbucket.org:pmmquickstartguides01/systemtests.git
- cd systemtests
- go test -v ./... -aws_region=us-east-2
-step: &deploy-production-usw2
name: Deploy Production us-west-2
image: amazon/aws-sam-cli-build-image-provided
script:
- curl https://dl.google.com/go/go1.16.3.linux-amd64.tar.gz -o go1.16.3.tar.gz
- rm -rf /usr/local/go
- tar -C /usr/local -xzf go1.16.3.tar.gz
- export PATH=$PATH:/usr/local/go/bin
- go version
- make
- ls -lah /opt/atlassian/pipelines/agent/build/build/
- pipe: atlassian/aws-sam-deploy:1.2.0
variables:
AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
AWS_DEFAULT_REGION: 'us-west-2'
STACK_NAME: 'OpenDevOpsSubmitImage'
CAPABILITIES: [ 'CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND' ]
TEMPLATE: 'https://s3.amazonaws.com/open-devops-code-us-west-2-${AWS_ACCOUNT_ID}/submit-image-packaged.yml'
WAIT: 'true'
DEBUG: 'true'
S3_BUCKET: 'open-devops-code-us-west-2-${AWS_ACCOUNT_ID}'
SAM_TEMPLATE: 'build/template.yaml'
-step: &integration-test-usw2
name: Integration test usw2
image: golang:buster
script:
- git clone git@bitbucket.org:pmmquickstartguides01/systemtests.git
- cd systemtests
- go test -v ./... -aws_region=us-west-2
-step: &deploy-production-use1
name: Deploy Production us-east-1
image: amazon/aws-sam-cli-build-image-provided
script:
- curl https://dl.google.com/go/go1.16.3.linux-amd64.tar.gz -o go1.16.3.tar.gz
- rm -rf /usr/local/go
- tar -C /usr/local -xzf go1.16.3.tar.gz
- export PATH=$PATH:/usr/local/go/bin
- go version
- make
- ls -lah /opt/atlassian/pipelines/agent/build/build/
- BITBUCKET_PIPE_SHARED_STORAGE_DIR="/opt/atlassian/pipelines/agent/build/.bitbucket/pipelines/generated/pipeline/pipes"
- chmod -R o+rw $BITBUCKET_PIPE_SHARED_STORAGE_DIR
- pipe: atlassian/aws-sam-deploy:1.2.0
variables:
AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
AWS_DEFAULT_REGION: 'us-east-1'
STACK_NAME: 'OpenDevOpsSubmitImage'
CAPABILITIES: [ 'CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND' ]
TEMPLATE: 'https://s3.amazonaws.com/open-devops-code-us-east-1-${AWS_ACCOUNT_ID}/submit-image-packaged.yml'
WAIT: 'true'
DEBUG: 'true'
S3_BUCKET: 'open-devops-code-us-east-1-${AWS_ACCOUNT_ID}'
SAM_TEMPLATE: 'build/template.yaml'
-step: &integration-test-use1
name: Integration test use1
image: golang:buster
script:
- git clone git@bitbucket.org:pmmquickstartguides01/systemtests.git
- cd systemtests
- go test -v ./... -aws_region=us-east-1
-step: &deploy-production-cac1
name: Deploy Production ca-central-1
image: amazon/aws-sam-cli-build-image-provided
script:
- curl https://dl.google.com/go/go1.16.3.linux-amd64.tar.gz -o go1.16.3.tar.gz
- rm -rf /usr/local/go
- tar -C /usr/local -xzf go1.16.3.tar.gz
- export PATH=$PATH:/usr/local/go/bin
- go version
- make
- ls -lah /opt/atlassian/pipelines/agent/build/build/
- BITBUCKET_PIPE_SHARED_STORAGE_DIR="/opt/atlassian/pipelines/agent/build/.bitbucket/pipelines/generated/pipeline/pipes"
- chmod -R o+rw $BITBUCKET_PIPE_SHARED_STORAGE_DIR
- pipe: atlassian/aws-sam-deploy:1.2.0
variables:
AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
AWS_DEFAULT_REGION: 'ca-central-1'
STACK_NAME: 'OpenDevOpsSubmitImage'
CAPABILITIES: [ 'CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND' ]
TEMPLATE: 'https://s3.amazonaws.com/open-devops-code-ca-central-1-${AWS_ACCOUNT_ID}/submit-image-packaged.yml'
WAIT: 'true'
DEBUG: 'true'
S3_BUCKET: 'open-devops-code-ca-central-1-${AWS_ACCOUNT_ID}'
SAM_TEMPLATE: 'build/template.yaml'
-step: &integration-test-cac1
name: Integration test cac1
image: golang:buster
script:
- git clone git@bitbucket.org:pmmquickstartguides01/systemtests.git
- cd systemtests
- go test -v ./... -aws_region=ca-central-1
pipelines:
default:
- step: *rununittests
- step:
<<: *deploy-test-usw1
deployment: Test us-west-1
# - step: *integration-test-usw1
- step:
<<: *deploy-staging-use2
deployment: Staging us-east-2
# - step: *integration-test-use2
branches:
mainline:
- step:
<<: *deploy-production-usw2
deployment: Production us-west-2
# - step: *integration-test-usw2
- step:
<<: *deploy-production-use1
deployment: Production us-east-1
# - step: *integration-test-use1
- step:
<<: *deploy-production-cac1
deployment: Production ca-central-1
# - step: *integration-test-cac1
Выполнение интеграционных тестов пока вынесено в комментарии. Системные тесты будут успешно выполняться только после развертывания всего приложения. Раскомментируйте этапы интеграционного тестирования в своем репозитории и запустите конвейер развертывания, когда все компоненты ImageLabeller будут развернуты. Строку git clone для SystemTests необходимо изменить, чтобы в ней был указан ваш репозиторий для системных тестов.
Сведения о файле bitbucket-pipelines.yml
На этом шаге выполняются модульные тесты из базы кода SubmitImage.
-step: &rununittests
name: run unit tests
image: golang:buster
script:
- cd submitImage
- go test ./opendevopslambda/...
На этом шаге SubmitImage AWS Lambda развертывается на us-west-2 с помощью AWS SAM. Документацию по этому элементу конвейера можно найти здесь.
-step: &deploy-usw2-prod
name: deploy us-west-2 prod
image: amazon/aws-sam-cli-build-image-provided
script:
- curl https://dl.google.com/go/go1.16.3.linux-amd64.tar.gz -o go1.16.3.tar.gz
- rm -rf /usr/local/go
- tar -C /usr/local -xzf go1.16.3.tar.gz
- export PATH=$PATH:/usr/local/go/bin
- go version
- make
- pipe: atlassian/aws-sam-deploy:1.2.0
variables:
AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
AWS_DEFAULT_REGION: 'us-west-2'
STACK_NAME: 'OpenDevOpsSubmitImage'
CAPABILITIES: [ 'CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND' ]
TEMPLATE: 'https://s3.amazonaws.com/open-devops-code-us-west-2-${AWS_ACCOUNT_ID}/submit-image-packaged.yml'
WAIT: 'true'
DEBUG: 'true'
S3_BUCKET: 'open-devops-code-us-west-2-${AWS_ACCOUNT_ID}'
SAM_TEMPLATE: 'build/template.yaml'
На этом шаге клонируется репозиторий SystemTests и выполняются интеграционные тесты в us-west-2. Строку git clone для SystemTests необходимо изменить, чтобы в ней был указан ваш репозиторий для системных тестов.
-step: &integration-test-usw2
name: Integration test usw2
image: golang:buster
script:
- git clone git@bitbucket.org:pmmquickstartguides01/systemtests.git
- cd systemtests
- go test -v ./... -aws_region=us-west-2
Отправка в функциональную ветку
В командной строке выполните следующие запросы, чтобы отправить изменения в ветку IM-8 вашего репозитория SubmitImage.
git add --all
git commit -m "IM-6 add bitbucket-pipelines.yml to SubmitImage"
git push -u origin IM-6
Нажмите Pipelines (Конвейеры), а затем — IM-6, чтобы увидеть запущенный конвейер.
Создание запроса pull
Чтобы создать запрос pull, нажмите Pull requests (Запросы pull), а затем — Create pull request (Создать запрос pull). Завершите запрос pull и нажмите Pipelines (Конвейеры), чтобы проследить за развертыванием в рабочую среду.
Создание репозитория для InvokeLabeller AWS Lambda
Перейдите в Jira и создайте задачу для добавления репозитория InvokeLabeller в Bitbucket. Обратите внимание на идентификатор задачи Jira (в данном примере — IM-10).
Перейдите в Bitbucket и нажмите Create (Создать), а затем — Repository (Репозиторий). Выберите необходимые значения в полях Workspace (Рабочее пространство) и Project (Проект). Задайте mainline в качестве Default branch name (Имя ветки по умолчанию). Нажмите Create repository (Создать репозиторий), чтобы продолжить.
В терминале перейдите в репозиторий InvokeLabeller и выполните следующие команды для отправки кода AWS Lambda в Bitbucket. Включите идентификатор задачи Jira в сообщения о коммитах и имена веток, чтобы позволить интеграции Jira с Bitbucket отслеживать, что происходит в проекте.
git add --all
git commit -m "IM-10 add InvokeLabeller to Bitbucket"
git remote add origin git@bitbucket.org:pmmquickstartguides01/invokelabeller.git
git branch -m mainline
git push -u origin mainline
Включение конвейеров
Перейдите в раздел Repository settings (Настройки репозитория) и нажмите Settings (Настройки), а затем — Enable Pipelines (Включить конвейеры).
Добавление переменных репозитория
Нажмите Repository variables (Переменные репозитория), чтобы добавить идентификатор ключа доступа AWS, секретный ключ доступа AWS и идентификатор аккаунта AWS. Предоставьте пользователю IAM, связанному с ключом доступа AWS, уровень доступа AdministratorAccess (Доступ администратора). Контроль доступа можно настроить более тонко, выбрав отдельные политики доступа AWS, но подробности останутся на усмотрение читателя.
Добавление сред развертывания
Нажмите Deployments (Развертывания), а затем — add environment (Добавить среду), чтобы добавить новые среды. В этом примере используется тестовая среда us-west-1, промежуточная среда us-east-2 и три рабочие среды в us-west-2, us-east-1 и ca-central-1.
Создание ключей SSH
Перейдите в свой репозиторий SubmitImage в Bitbucket и нажмите Repository settings (Настройки репозитория), а затем — SSH keys (Ключи SSH), после чего выберите Generate keys (Сгенерировать ключи).
Файл bitbucket-pipelines.yml для развертывания в AWS
Перейдите в репозиторий InvokeLabeller в терминале и создайте ветку с именем, соответствующим идентификатору задачи Jira.
git checkout -b IM-10
Создайте файл bitbucket-pipelines.yml со следующим кодом YAML. В нем задается конвейер Bitbucket для тестовой, промежуточной и рабочей сред. Строку git clone для SystemTests необходимо изменить, чтобы в ней был указан ваш репозиторий для системных тестов.
definitions:
steps:
-step: &rununittests
name: run unit tests
image: python:rc-buster
script:
- pip3 install pytest
- pip3 install moto
- pip3 install -r tst/requirements.txt --user
- python3 -m pytest -v tst/unit --junitxml=test-reports/report.xml
-step: &deploy-usw1-test
name: deploy us-west-1 test
image: amazon/aws-sam-cli-build-image-python3.8
script:
- pipe: atlassian/aws-sam-deploy:1.2.0
variables:
AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
AWS_DEFAULT_REGION: 'us-west-1'
STACK_NAME: 'OpenDevOpsImageLabeller'
CAPABILITIES: [ 'CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND' ]
TEMPLATE: 'https://s3.amazonaws.com/open-devops-code-us-west-1-${AWS_ACCOUNT_ID}/image-labeller-packaged.yml'
WAIT: 'true'
DEBUG: 'true'
S3_BUCKET: 'open-devops-code-us-west-1-${AWS_ACCOUNT_ID}'
SAM_TEMPLATE: 'template.yml'
-step: &integration-test-usw1
name: integration test usw1
image: golang:buster
script:
- git clone git@bitbucket.org:pmmquickstartguides01/systemtests.git
- cd systemtests
- go test -v ./... -aws_region=us-west-1
-step: &deploy-use2-staging
name: deploy us-east-2 staging
image: amazon/aws-sam-cli-build-image-python3.8
script:
- BITBUCKET_PIPE_SHARED_STORAGE_DIR="/opt/atlassian/pipelines/agent/build/.bitbucket/pipelines/generated/pipeline/pipes"
- chmod -R o+rw $BITBUCKET_PIPE_SHARED_STORAGE_DIR
- pipe: atlassian/aws-sam-deploy:1.2.0
variables:
AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
AWS_DEFAULT_REGION: 'us-east-2'
STACK_NAME: 'OpenDevOpsImageLabeller'
CAPABILITIES: [ 'CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND' ]
TEMPLATE: 'https://s3.amazonaws.com/open-devops-code-us-east-2-${AWS_ACCOUNT_ID}/image-labeller-packaged.yml'
WAIT: 'true'
DEBUG: 'true'
S3_BUCKET: 'open-devops-code-us-east-2-${AWS_ACCOUNT_ID}'
SAM_TEMPLATE: 'template.yml'
-step: &integration-test-use2
name: integration test use2
image: golang:buster
script:
- git clone git@bitbucket.org:pmmquickstartguides01/systemtests.git
- cd systemtests
- go test -v ./... -aws_region=us-east-2
-step: &deploy-usw2-prod
name: deploy us-west-2 prod
image: amazon/aws-sam-cli-build-image-python3.8
script:
- pipe: atlassian/aws-sam-deploy:1.2.0
variables:
AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
AWS_DEFAULT_REGION: 'us-west-2'
STACK_NAME: 'OpenDevOpsImageLabeller'
CAPABILITIES: [ 'CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND' ]
TEMPLATE: 'https://s3.amazonaws.com/open-devops-code-us-west-2-${AWS_ACCOUNT_ID}/image-labeller-packaged.yml'
WAIT: 'true'
DEBUG: 'true'
S3_BUCKET: 'open-devops-code-us-west-2-${AWS_ACCOUNT_ID}'
SAM_TEMPLATE: 'template.yml'
-step: &integration-test-usw2
name: integration test usw2
image: golang:buster
script:
- git clone git@bitbucket.org:pmmquickstartguides01/systemtests.git
- cd systemtests
- go test -v ./... -aws_region=us-west-2
-step: &deploy-use1-prod
name: deploy us-east-1 prod
image: amazon/aws-sam-cli-build-image-python3.8
script:
- BITBUCKET_PIPE_SHARED_STORAGE_DIR="/opt/atlassian/pipelines/agent/build/.bitbucket/pipelines/generated/pipeline/pipes"
- chmod -R o+rw $BITBUCKET_PIPE_SHARED_STORAGE_DIR
- pipe: atlassian/aws-sam-deploy:1.2.0
variables:
AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
AWS_DEFAULT_REGION: 'us-east-1'
STACK_NAME: 'OpenDevOpsImageLabeller'
CAPABILITIES: [ 'CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND' ]
TEMPLATE: 'https://s3.amazonaws.com/open-devops-code-us-east-1-${AWS_ACCOUNT_ID}/image-labeller-packaged.yml'
WAIT: 'true'
DEBUG: 'true'
S3_BUCKET: 'open-devops-code-us-east-1-${AWS_ACCOUNT_ID}'
SAM_TEMPLATE: 'template.yml'
-step: &integration-test-use1
name: integration test use1
image: golang:buster
script:
- git clone git@bitbucket.org:pmmquickstartguides01/systemtests.git
- cd systemtests
- go test -v ./... -aws_region=us-east-1
-step: &deploy-cac1-prod
name: deply ca-central-1 prod
image: amazon/aws-sam-cli-build-image-python3.8
script:
- BITBUCKET_PIPE_SHARED_STORAGE_DIR="/opt/atlassian/pipelines/agent/build/.bitbucket/pipelines/generated/pipeline/pipes"
- chmod -R o+rw $BITBUCKET_PIPE_SHARED_STORAGE_DIR
- pipe: atlassian/aws-sam-deploy:1.2.0
variables:
AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
AWS_DEFAULT_REGION: 'ca-central-1'
STACK_NAME: 'OpenDevOpsImageLabeller'
CAPABILITIES: [ 'CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND' ]
TEMPLATE: 'https://s3.amazonaws.com/open-devops-code-ca-central-1-${AWS_ACCOUNT_ID}/image-labeller-packaged.yml'
WAIT: 'true'
DEBUG: 'true'
S3_BUCKET: 'open-devops-code-ca-central-1-${AWS_ACCOUNT_ID}'
SAM_TEMPLATE: 'template.yml'
-step: &integration-test-cac1
name: integration test cac1
image: golang:buster
script:
- git clone git@bitbucket.org:pmmquickstartguides01/systemtests.git
- cd systemtests
- go test -v ./... -aws_region=ca-central-1
pipelines:
default:
- step: *rununittests
- step:
<<: *deploy-usw1-test
deployment: us-west-1 Test
# - step: *integration-test-usw1
- step:
<<: *deploy-use2-staging
deployment: us-east-2 Staging
# - step: *integration-test-use2
branches:
mainline:
- step:
<<: *deploy-usw2-prod
deployment: us-west-2 Prod
# - step: *integration-test-usw2
- step:
<<: *deploy-use1-prod
deployment: us-east-1 Prod
# - step: *integration-test-use1
- step:
<<: *deploy-cac1-prod
deployment: ca-central-1 Prod
# - step: *integration-test-cac1
Выполнение интеграционных тестов пока вынесено в комментарии. Системные тесты будут успешно выполняться только после развертывания всего приложения. Раскомментируйте этапы интеграционного тестирования в своем репозитории и запустите конвейер развертывания, когда все компоненты ImageLabeller будут развернуты. Строку git clone для SystemTests необходимо изменить, чтобы в ней был указан ваш репозиторий для системных тестов.
Сведения о файле bitbucket-pipelines.yml
На этом шаге выполняются модульные тесты из базы кода InvokeLabeller.
-step: &rununittests
name: run unit tests
image: golang:buster
script:
- cd submitImage
- go test ./opendevopslambda/...
Изменение конечной точки 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.
git add --all
git commit -m "IM-10 add bitbucket-pipelines.yml to InvokeLabeller"
git push -u origin IM-10
Нажмите Pipelines (Конвейеры), а затем — IM-10, чтобы увидеть запущенный конвейер.
Создание запроса pull
Чтобы создать запрос pull, нажмите Pull requests (Запросы pull), а затем — Create pull request (Создать запрос pull). Завершите запрос pull и нажмите Pipelines (Конвейеры), чтобы проследить за развертыванием в рабочую среду.
Создание репозитория для системных тестов
Перейдите в Jira и создайте задачу для добавления репозитория SystemTests в Bitbucket. Обратите внимание на идентификатор задачи (в данном примере — IM-7).
Перейдите в Bitbucket и нажмите Create (Создать), а затем — Repository (Репозиторий).
Выберите необходимые значения в полях Workspace (Рабочее пространство) и Project (Проект). Задайте mainline в качестве Default branch name (Имя ветки по умолчанию). Нажмите Create repository (Создать репозиторий), чтобы продолжить.
В терминале перейдите в репозиторий SystemTests и запустите следующие команды, чтобы отправить код в Bitbucket.
git add --all
git commit -m "IM-7 add SystemTests repository to Bitbucket"
git remote add origin git@bitbucket.org:pmmquickstartguides01/systemtests.git
git branch -M mainline
git push -u origin mainline
Для репозитория SystemTests не требуется файл bitbucket-pipelines.yml. У него нет своего конвейера, поскольку он содержит тесты для запуска в других конвейерах. Обратите внимание на удаленный URL-адрес вашего SystemTests. Конвейеры CI/CD SubmitImage, GetImageLabel и InvokeLabeller будут клонировать репозиторий SystemTests на этапах тестирования. Файл bitbucket-pipelines.yml в последующих репозиториях нужно будет обновить, указав правильный URL-адрес.
Добавление ключей SSH из SubmitImage, GetImageLabel и InvokeLabeller
Нажмите Repository settings (Настройки репозитория), а затем — Access keys (Ключи доступа).
Нажмите Add Key (Добавить ключ), вставьте ключ SSH, скопированный из SubmitImage, GetImageLabel или InvokeLabeller, затем выберите Add SSH key (Добавить ключ SSH).
Если вы дошли до этого шага, вас можно поздравить! Вы только что развернули ImageLabeller. Следующий шаг — настройка мониторинга ImageLabeller с помощью Opsgenie.
Поделитесь этой статьей
Следующая тема
Рекомендуемые статьи
Добавьте эти ресурсы в закладки, чтобы изучить типы команд DevOps или получать регулярные обновления по DevOps в Atlassian.