Close

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

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

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

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

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

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

Если вы еще не настроили SSH для своего аккаунта Bitbucket, следуйте этим инструкциям.

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

https://github.com/AtlassianOpenDevOpsGuides

Демонстрационное видео о конвейерах Bitbucket

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

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

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

Снимок экрана: задача Jira по добавлению репозитория инфраструктуры AWS S3 в Bitbucket

Перейдите в Bitbucket > Create > Repository (Создать > Репозиторий).

Создание репозитория в Bitbucket

Выберите необходимые значения в полях Workspace (Рабочее пространство) и Project (Проект). Задайте mainline в качестве Default branch name (Имя ветки по умолчанию). Нажмите Create repository (Создать репозиторий), чтобы продолжить.

Всплывающее окно для создания нового репозитория в Bitbucket

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

Включение конвейеров в Bitbucket

Добавление переменных ключей AWS для доступа к репозиторию

Перейдите в раздел Repository variables (Переменные репозитория), введите идентификатор ключа доступа AWS и нажмите Add (Добавить). Затем введите секретный ключ доступа AWS и нажмите Add (Добавить).

Переменные репозитория в Bitbucket

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

Нажмите Deployments (Развертывания).

Экран настройки развертываний в Bitbucket

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

Добавление сред развертывания в Bitbucket

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

Выполнение конвейера в Bitbucket

Нажмите сам конвейер, чтобы увидеть подробности выполнения. Конвейер запустил шаги по развертыванию в тестовой среде в us-west-1 и в промежуточной среде в us-east-2.

Сведения о выполнении конвейера в Bitbucket

Создание запроса pull

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

Создание запроса pull в Bitbucket

Выберите свою функциональную ветку в качестве исходной, отметьте флажок Close branch (Закрыть ветку) и нажмите Create pull request (Создать запрос pull).

Модальное окно при создании запроса pull в Bitbucket.

Просмотрите изменения кода в запросе pull, затем нажмите Approve (Подтвердить) и Merge (Объединить).

Подтверждение и объединение запроса pull в Bitbucket

При нажатии кнопки Merge (Объединить) откроется экран слияния с запросом pull. Отметьте флажок Transition issue (Изменить статус задачи) и нажмите Merge (Объединить).

Флажок изменения статуса задачи при объединении запроса pull в Bitbucket

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

Мониторинг основного конвейера в Bitbucket

Ветка IM-5 исчезла. Осталась основная ветка, и конвейер запущен. Нажмите конвейер.

Экран конвейера основной ветки в Bitbucket

Конвейер выполнил шаги по развертыванию в рабочих средах в us-west-2, us-east-1 и ca-central-1. Если конвейер не сможет успешно завершить работу, можно выполнить его повторно, нажав кнопку Rerun (Перезапустить).

Откат развертываний с ошибками

Чтобы откатить развертывание, нажмите Deployments (Развертывания).

Экран развертываний в Bitbucket

Выберите среду, которую требуется откатить, чтобы получить список прошлых развертываний, выберите версию, до которой будет выполняться откат, и нажмите Redeploy (Развернуть еще раз).

Выбор среды и версии для отката в Bitbucket

Проверьте изменения и нажмите Redeploy (Развернуть еще раз).

Проверка изменений перед повторным развертыванием в Bitbucket

Повторное развертывание выполняется только для выбранной среды.

Модальное окно конвейера в Bitbucket, в котором повторно развертывается только выбранная среда

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

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

Создание задачи в Jira Software для добавления репозитория SubmitImage в Bitbucket

Перейдите в Bitbucket и нажмите Create (Создать), а затем — Repository (Репозиторий).

Создание репозитория в Bitbucket

Выберите необходимые значения в полях Workspace (Рабочее пространство) и Project (Проект). Задайте mainline в качестве Default branch name (Имя ветки по умолчанию). Нажмите Create repository (Создать репозиторий), чтобы продолжить.

Всплывающее модальное окно при создании нового репозитория в Bitbucket

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

Включение конвейеров в настройках Bitbucket

Добавление переменных репозитория

Нажмите Repository variables (Переменные репозитория), чтобы добавить идентификатор ключа доступа AWS, секретный ключ доступа AWS и идентификатор аккаунта AWS. Предоставьте пользователю IAM, связанному с ключом доступа AWS, уровень доступа AdministratorAccess (Доступ администратора). Можно использовать более детальный контроль доступа, выбрав отдельные политики доступа AWS.

Включение конвейеров в настройках Bitbucket

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

Нажмите Deployments (Развертывания), а затем — add environment (Добавить среду), чтобы добавить новые среды. В этом примере используется тестовая среда us-west-1, промежуточная среда us-east-2 и три рабочие среды в us-west-2, us-east-1 и ca-central-1.

Среды развертывания в Bitbucket

Создание ключей SSH

Перейдите в свой репозиторий SubmitImage в Bitbucket и нажмите Repository settings (Настройки репозитория), а затем — SSH keys (Ключи SSH), после чего выберите Generate keys (Сгенерировать ключи).

Генерация ключей SSH в Bitbucket

Этот ключ SSH понадобится при создании репозитория SystemTests.

Сведения о ключе SSH в Bitbucket

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

Снимок экрана: конвейеры Bitbucket Cloud

Создание запроса pull

Чтобы создать запрос pull, нажмите Pull requests (Запросы pull), а затем — Create pull request (Создать запрос pull). Завершите запрос pull и нажмите Pipelines (Конвейеры), чтобы проследить за развертыванием в рабочую среду.

Конвейер развертывания в рабочую среду в Bitbucket Cloud

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

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

Снимок экрана: задачи на доске Jira

Перейдите в Bitbucket и нажмите Create (Создать), а затем — Repository (Репозиторий). Выберите необходимые значения в полях Workspace (Рабочее пространство) и Project (Проект). Задайте mainline в качестве Default branch name (Имя ветки по умолчанию). Нажмите Create repository (Создать репозиторий), чтобы продолжить.

Создание репозитория InvokeLabeller в Bitbucket

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

Включение конвейеров в настройках Bitbucket

Добавление переменных репозитория

Нажмите Repository variables (Переменные репозитория), чтобы добавить идентификатор ключа доступа AWS, секретный ключ доступа AWS и идентификатор аккаунта AWS. Предоставьте пользователю IAM, связанному с ключом доступа AWS, уровень доступа AdministratorAccess (Доступ администратора). Контроль доступа можно настроить более тонко, выбрав отдельные политики доступа AWS, но подробности останутся на усмотрение читателя.

Добавление переменных репозитория в Bitbucket

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

Нажмите Deployments (Развертывания), а затем — add environment (Добавить среду), чтобы добавить новые среды. В этом примере используется тестовая среда us-west-1, промежуточная среда us-east-2 и три рабочие среды в us-west-2, us-east-1 и ca-central-1.

Среды развертывания в Bitbucket

Создание ключей SSH

Перейдите в свой репозиторий SubmitImage в Bitbucket и нажмите Repository settings (Настройки репозитория), а затем — SSH keys (Ключи SSH), после чего выберите Generate keys (Сгенерировать ключи).

Сведения о ключе SSH в Bitbucket Cloud

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

Просмотр запущенных конвейеров в Bitbucket Cloud

Создание запроса pull

Чтобы создать запрос pull, нажмите Pull requests (Запросы pull), а затем — Create pull request (Создать запрос pull). Завершите запрос pull и нажмите Pipelines (Конвейеры), чтобы проследить за развертыванием в рабочую среду.

Просмотр развертывания в рабочую среду в Bitbucket Pipelines

Создание репозитория для системных тестов

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

Просмотр созданной задачи на доске Jira

Перейдите в Bitbucket и нажмите Create (Создать), а затем — Repository (Репозиторий).

Создание репозитория в Bitbucket

Выберите необходимые значения в полях Workspace (Рабочее пространство) и Project (Проект). Задайте mainline в качестве Default branch name (Имя ветки по умолчанию). Нажмите Create repository (Создать репозиторий), чтобы продолжить.

Ввод информации при создании нового репозитория в Bitbucket

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

Страница настройки ключей доступа в Bitbucket

Нажмите Add Key (Добавить ключ), вставьте ключ SSH, скопированный из SubmitImage, GetImageLabel или InvokeLabeller, затем выберите Add SSH key (Добавить ключ SSH).

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

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

Warren Marusiak
Warren Marusiak

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


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

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

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

Рисунок: DevOps

Сообщество DevOps

Рисунок: DevOps

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

Рисунок: карта

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

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

Thank you for signing up