Close

Implemente o ImageLabeller com o Bitbucket

Foto de rosto de Warren Marusiak
Warren Marusiak

Evangelista tecnológico sênior

Para demonstrar como desenvolver, implementar e gerenciar aplicativos usando o Jira Software e várias ferramentas conectadas, nossa equipe criou o ImageLabeller, um aplicativo de demonstração simples gerado na AWS que usa aprendizado de máquina para aplicar etiquetas às imagens.

Esta página aborda como implementar o ImageLabeller com o Bitbucket. Antes de começar, recomendamos a leitura das páginas da arquitetura do ImageLabeller e da configuração do AWS SageMaker para contextualizar.

Pré-requisitos

Se você ainda não tiver o SSH configurado para sua conta do Bitbucket, siga estas instruções.

Repositórios do GitHub voltados para o público com código ImageLabeller

https://github.com/AtlassianOpenDevOpsGuides

Vídeo de demonstração do Bitbucket Pipelines

Crie um repositório para a infraestrutura do AWS S3

Um ciclo de desenvolvimento padrão, em geral, faz com que um desenvolvedor pegue uma tarefa do Jira, a mova para o trabalho em andamento e, em seguida, conclua o trabalho de desenvolvimento. O ID do item do Jira é a chave que vincula o trabalho de desenvolvimento ao item do Jira. É o principal componente de integração entre os dois sistemas.

A partir do Jira, crie um item novo para adicionar um repositório de infraestrutura do AWS S3 ao Bitbucket. Anote o ID do item. GI-5 neste exemplo.

Captura de tela mostrando o item do Jira ao adicionar o repositório de infraestrutura do AWS S3 ao Bitbucket

Vá para o Bitbucket> Criar > Repositório.

Como criar um repositório no Bitbucket

Selecione o Espaço de trabalho e o Projeto apropriados. Defina o nome da ramificação padrão como linha principal. Clique em Criar repositório para continuar.

Janela pop-up para criar um novo repositório no Bitbucket

Em seu terminal, acesse seu repositório s3_infra e execute o seguinte para enviar seu arquivo template.yml do AWS CloudFormation para o 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

Ativar Bitbucket Pipelines

Vá para Configurações do repositório > Configurações > Habilitar pipelines.

Como habilitar pipelines no Bitbucket

Adicionar variáveis de repositório de chaves de acesso da AWS

Acesse Variáveis do repositório, insira sua ID de chave de acesso da AWS e clique em Adicionar. Em seguida, insira sua chave de acesso secreta da AWS e clique em Adicionar.

Variáveis de repositório no Bitbucket

Configurar ambientes de implementação

Clique em Implementações.

Tela de configurações de implementações no Bitbucket

Clique em adicionar ambiente para adicionar novos ambientes. Há um ambiente de teste no US-WEST-1, um ambiente de staging no US-EAST-2 e três ambientes de produção no US-WEST-2, US-EAST-1 e CA-CENTRAL-1 neste exemplo.

Como adicionar ambientes de implementação no Bitbucket

bitbucket-pipelines.yml para implementação na AWS

Acesse seu repositório s3_infra no terminal e crie uma ramificação com o nome do ID de item do Jira.

git checkout -b IM-5

Crie um arquivo bitbucket-pipelines.yml com o seguinte yaml. Isso define um fluxo de trabalho de implementação para seus ambientes de teste, staging e produção.

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

Como entender um arquivo bitbucket-pipelines.yml

Definições e etapas

Defina um conjunto de etapas na seção de definições. Cada etapa tem um alias que é referenciado em todo o arquivo bitbucket-pipelines.yml, um nome que aparece na tela de implementação do Bitbucket e um script. Um script é uma coleção de um ou mais comandos.

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

Essa etapa usa o pipe atlassian/aws-cloudformation-deploy para implementar os buckets do AWS S3 definidos no arquivo s3_infra template.yml.

- pipe: atlassian/aws-cloudformation-deploy:0.10.0

O conjunto de pipes disponíveis é encontrado aqui. A documentação do pipe atlassian/aws-cloudformation-deploy pode ser encontrada aqui.

Pipelines

Pipelines executam um conjunto de etapas. O pipeline padrão é o conjunto de etapas executado para ramificações que não são explicitamente nomeadas em pipelines. Esse pipeline padrão executa etapas que são implementadas em ambientes de teste e staging.

pipelines:
  default:
    - step:
        <<: *deploy-test-usw1
        deployment: Test us-west-1
    - step:
        <<: *deploy-staging-use2
        deployment: Staging us-east-2

As implementações permitem a integração entre o Jira e o Bitbucket.

deployment: Test us-west-1

Você pode definir um conjunto de etapas executadas para uma ramificação específica e nomeada em ramificações. O trecho abaixo define um conjunto de etapas para a ramificação da linha principal.

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

Leia este artigo de referência para obter mais informações sobre esse tópico.

Enviando para uma ramificação de recursos

Execute o seguinte na linha de comando para enviar suas alterações para a ramificação GI-5 do seu repositório s3_infra. Inclua o ID do item do Jira nas mensagens de commit e nos nomes das ramificações para permitir a integração com o Jira Bitbucket e acompanhar o que está acontecendo em seu projeto.

git add --all
git commit -m "IM-5 add bitbucket-pipelines.yml"
git push -u origin IM-5

Clique em Pipelines e depois em GI-5 para ver o pipeline em execução.

Como executar pipeline no Bitbucket

Clique no próprio pipeline para ver as informações da execução. O pipeline executou etapas de implementação toscreenshot_s em um ambiente de teste em us-west-1 e em um ambiente de staging em us-east-2.

Informações da execução do pipeline no Bitbucket

Criar uma solicitação pull

Para criar uma solicitação pull, clique em Solicitações pull e depois em Criar solicitação pull.

Como criar uma solicitação pull no Bitbucket

Escolha sua ramificação de recurso como ramificação de origem, marque a caixa de seleção Fechar ramificação e clique em Criar solicitação pull.

Como criar um modal de solicitação pull no Bitbucket.

Analise as alterações no código e, em seguida, Aprove e Mescle a solicitação pull.

Aprovar e mesclar a solicitação pull no Bitbucket

Clicar em Mesclar abre a tela de mesclagem da solicitação pull. Marque a caixa de seleção Item de transição e clique em Mesclar.

Marque a caixa de seleção "item de transição" ao mesclar solicitação pull no Bitbucket

Clique em Pipelines para monitorar o pipeline da linha principal.

Como monitorar o pipeline principal no Bitbucket

A ramificação do GI-5 desapareceu. A ramificação da linha principal está à esquerda e um pipeline está em execução. Clique no pipeline.

Tela do pipeline de ramificações da linha principal no Bitbucket

O pipeline executou etapas de implementação em ambientes de produção em us-west-2, us-east-1 e ca-central-1. É possível executar novamente um pipeline clicando no botão Executar novamente se um pipeline falhar.

Fazer rollback de uma implementação incorreta

Para fazer rollback de uma implementação, clique em Implementações.

Tela de implementações no Bitbucket

Clique no ambiente em que você quer fazer rollback para obter uma lista de implementações históricas, escolher a versão do rollback e clique em Reimplementar.

Como selecionar um ambiente e, em seguida, a versão em que você quer fazer rollback no Bitbucket

Verifique se a alteração está correta e clique em Reimplementar.

Verifique se suas alterações estão corretas antes de selecionar "reimplementar" no Bitbucket

Somente o ambiente escolhido é reimplementado.

Modal de pipeline no Bitbucket mostrando apenas o ambiente escolhido sendo reimplementado

Crie um repositório para o SubmitImage AWS Lambda

Acesse o Jira e crie um item do Jira para adicionar um repositório SubmitImage ao Bitbucket. Anote o ID do item do Jira. Neste exemplo, é GI-6.

Como criar um item no Jira Software para adicionar um repositório SubmitImage ao Bitbucket

Vá para o Bitbucket e clique em Criar e depois em Repositório.

Como criar um repositório no Bitbucket

Selecione a Área de trabalho e o Projeto apropriados. Defina o Nome da ramificação padrão como linha principal. Clique em Criar repositório para continuar.

Modal em pop-up ao criar um novo repositório no Bitbucket

No seu terminal, acesse seu repositório SubmitImage e execute o seguinte para enviar seu código AWS Lambda para o Bitbucket. Inclua o ID do item do Jira nas mensagens de commit e nos nomes das ramificações para permitir a integração com o Jira Bitbucket e acompanhar o que está acontecendo em seu projeto.

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

Habilitar pipelines

Vá para Configurações do repositório, clique em Configurações e, em seguida, Habilitar pipelines.

Habilite pipelines nas configurações de Pipelines no Bitbucket

Adicionar variáveis de repositório

Clique em Variáveis do repositório para adicionar sua ID de chave de acesso da AWS, chave de acesso secreta da AWS e ID da conta da AWS. Dê ao usuário do IAM associado à chave de acesso da AWS AdministratorAccess. Você pode optar por usar um controle de acesso mais refinado escolhendo políticas de acesso individuais da AWS.

Habilite pipelines nas configurações de Pipelines no Bitbucket

Adicionar ambientes de implementação

Clique em Implementações e, em seguida, adicionar ambiente para adicionar novos ambientes. Há um ambiente de teste no us-west-1, um ambiente de staging no us-east-2 e três ambientes de produção no us-west-2, us-east-1 e ca-central-1 neste exemplo.

Ambientes de implementação no Bitbucket

Criar chaves SSH

Acesse seu repositório SubmitImage no Bitbucket e clique em Configurações do repositório, depois em Chaves SSH e depois em Gerar chaves.

Gerar chaves SSH no Bitbucket

Você vai precisar dessa chave SSH ao criar o repositório SystemTests.

Informações da chave SSH no Bitbucket

bitbucket-pipelines.yml para implementação na AWS

Acesse seu repositório SubmitImage no terminal e crie uma ramificação com o nome do ID de item do Jira.

git checkout -b IM-6

Crie um arquivo bitbucket-pipelines.yml com o seguinte yaml. Isso define um pipeline do Bitbucket para seus ambientes de teste, staging e produção. Você deve atualizar a linha de clone do git para que SystemTests seja seu repositório 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

A execução dos testes de integração está comentada por enquanto. Os testes do sistema só vão ser aprovados quando todo o aplicativo for implementado. Remova os comentários das etapas do teste de integração em seu repositório e faça outra tentativa para executar o Pipeline de implementação depois que todos os componentes do ImageLabeller forem implementados. Você deve atualizar a linha de clone do git para que SystemTests seja seu repositório SystemTests.

Como entender um arquivo bitbucket-pipelines.yml

Essa etapa executa testes de unidade a partir da base de código SubmitImage.

-step: &rununittests
        name: run unit tests
        image: golang:buster
        script:
          - cd submitImage
          - go test ./opendevopslambda/...

Essa tarefa usa o AWS SAM para implementar seu SubmitImage AWS Lambda no us-west-2. A documentação desse pipe pode ser encontrada aqui.

-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'

Essa tarefa clona o repositório SystemTests e executa testes de integração no us-west-2. Você deve atualizar a linha de clone do git para que SystemTests seja seu repositório 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

Enviando para uma ramificação de recursos

Na linha de comando, execute o seguinte para enviar seu código para a ramificação GI-8 do seu repositório SubmitImage.

git add --all
git commit -m "IM-6 add bitbucket-pipelines.yml to SubmitImage"
git push -u origin IM-6

Clique em Pipelines e depois em GI-6 para ver o pipeline em execução.

Captura de tela dos pipelines do Bitbucket Cloud

Criar uma solicitação pull

Para criar uma solicitação pull, clique em Solicitações pull e depois em Criar solicitação pull. Conclua o solicitação pull e clique em Pipelines para ver a implementação da produção.

Pipeline de implementação de produção no Bitbucket Cloud

Crie um repositório para InvokeLabeller AWS Lambda

Acesse o Jira e crie um item do Jira para adicionar um repositório InvokeLabeller ao Bitbucket. Anote o ID do item do Jira. Neste exemplo, é GI-10.

Captura de tela exibindo itens do Jira em um quadro do Jira

Vá para o Bitbucket e clique em Criar e depois em Repositório. Selecione a Área de trabalho e o Projeto apropriados. Defina o Nome da ramificação padrão como linha principal. Clique em Criar repositório para continuar.

Crie um repositório invokelabeller no Bitbucket

No seu terminal, acesse seu repositório InvokeLabeller e execute o seguinte para enviar seu código AWS Lambda para o Bitbucket. Inclua o ID do item do Jira nas mensagens de commit e nos nomes das ramificações para permitir a integração com o Jira Bitbucket e acompanhar o que está acontecendo em seu projeto.

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

Habilitar pipelines

Vá para Configurações do repositório, clique em Configurações e, em seguida, Habilitar pipelines.

Habilite pipelines nas configurações no Bitbucket

Adicionar variáveis de repositório

Clique em Variáveis do repositório para adicionar sua ID de chave de acesso da AWS, chave de acesso secreta da AWS e ID da conta da AWS. Dê ao usuário do IAM associado à chave de acesso da AWS AdministratorAccess. Você pode optar por usar um controle de acesso mais refinado escolhendo políticas de acesso individuais da AWS, mas as informações são deixadas para o leitor.

Adicione variáveis de repositório no Bitbucket

Adicionar ambientes de implementação

Clique em Implementações e, em seguida, adicionar ambiente para adicionar novos ambientes. Há um ambiente de teste no us-west-1, um ambiente de staging no us-east-2 e três ambientes de produção no us-west-2, us-east-1 e ca-central-1 neste exemplo.

Ambientes de implementação no Bitbucket

Criar chaves SSH

Acesse seu repositório SubmitImage no Bitbucket e clique em Configurações do repositório, depois em Chaves SSH e depois em Gerar chaves.

Informações da chave SSH no Bitbucket Cloud

bitbucket-pipelines.yml para implementação na AWS

Acesse seu repositório InvokeLabeller no terminal e crie uma ramificação com o nome do ID de item do Jira.

git checkout -b IM-10

Crie um arquivo bitbucket-pipelines.yml com o seguinte yaml. Isso define um pipeline do Bitbucket para seus ambientes de teste, staging e produção. Você deve atualizar a linha de clone do git para que SystemTests seja seu repositório 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

A execução dos testes de integração está comentada por enquanto. Os testes do sistema só vão ser aprovados quando todo o aplicativo for implementado. Remova os comentários das etapas do teste de integração em seu repositório e faça outra tentativa para executar o Pipeline de implementação depois que todos os componentes do ImageLabeller forem implementados. Você deve atualizar a linha de clone do git para que SystemTests seja seu repositório SystemTests.

Como entender um arquivo bitbucket-pipelines.yml

Essa etapa executa testes de unidade a partir da base de código InvokeLabeller.

-step: &rununittests
        name: run unit tests
        image: golang:buster
        script:
          - cd submitImage
          - go test ./opendevopslambda/...

Atualize o src/app.py com o endpoint do AWS SageMaker

Abra o arquivo src/app.py do InvokeLabeller e procure por query_endpoint. Altere o endpoint_name e o region_name do cliente para que correspondam ao seu notebook 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

Enviando para uma ramificação de recursos

Na linha de comando, execute o seguinte para enviar suas alterações para a ramificação GI-10 do seu repositório InvokeLabeller.

git add --all
git commit -m "IM-10 add bitbucket-pipelines.yml to InvokeLabeller"
git push -u origin IM-10

Clique em Pipelines e depois em GI-10 para ver o pipeline em execução.

Veja pipelines em execução no Bitbucket Cloud

Criar uma solicitação pull

Para criar uma solicitação pull, clique em Solicitações pull e depois em Criar solicitação pull. Conclua o solicitação pull e clique em Pipelines para ver a implementação da produção.

Como visualizar a implementação da produção no Bitbucket Pipelines

Crie um repositório para testes do sistema

Acesse o Jira e crie um item do Jira para adicionar um repositório SystemTests ao Bitbucket. Anote o ID do item. GI-7 neste exemplo.

Como visualizar um item recém-criado do Jira no quadro do Jira

Vá para o Bitbucket e clique em Criar e depois em Repositório.

Como criar um repositório no Bitbucket

Selecione a Área de trabalho e o Projeto apropriados. Defina o Nome da ramificação padrão como linha principal. Clique em Criar repositório para continuar.

Como inserir informações ao criar um novo repositório no Bitbucket

No seu terminal, acesse seu repositório SystemTests e execute o seguinte para enviar seu código para o 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

O repositório systemTests não precisa de um arquivo bitbucket-pipelines.yml. Ele não tem um pipeline próprio, pois oferece testes para a execução de outros pipelines. Anote o URL remoto do seu SystemTests. Os pipelines de IC/CD SubmitImage, GetImageLabel e InvokeLabeller vão clonar o repositório SystemTests durante as etapas de teste. Você vai precisar atualizar o bitbucket-pipelines.yml de repositórios posteriores com o URL correto.

Adicione chaves SSH de SubmitImage, GetImageLabel e InvokeLabeller

Clique em Configurações do repositório e, em seguida, em Chaves de acesso.

Acesse a página de configurações de chaves no Bitbucket

Clique em Adicionar chave, cole a chave SSH copiada de SubmitImage, GetImageLabel ou InvokeLabeller e clique em Adicionar chave SSH.

Como adicionar uma chave SSH no Bitbucket

Se você chegou até aqui, parabéns! Você acabou de implementar o ImageLabeller. A próxima etapa é configurar o monitoramento do ImageLabeller com o 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.


Compartilhe este artigo
Próximo tópico

Leitura recomendada

Marque esses recursos para aprender sobre os tipos de equipes de DevOps ou para obter atualizações contínuas sobre DevOps na Atlassian.

Ilustração do DevOps

Comunidade de DevOps

Ilustração do DevOps

Caminho de aprendizagem de DevOps

Ilustração do mapa

Comece gratuitamente

Inscreva-se para receber a newsletter de DevOps

Thank you for signing up