Implemente o ImageLabeller com o Bitbucket
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
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.
Vá para o Bitbucket> Criar > Repositório.
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.
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.
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.
Configurar ambientes de implementação
Clique em Implementações.
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.
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.
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.
Criar uma solicitação pull
Para criar uma solicitação pull, clique em Solicitações pull e depois em Criar solicitação pull.
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.
Analise as alterações no código e, em seguida, Aprove e Mescle a solicitação pull.
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.
Clique em Pipelines para monitorar o pipeline da linha principal.
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.
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.
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.
Verifique se a alteração está correta e clique em Reimplementar.
Somente o ambiente escolhido é 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.
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.
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.
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.
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.
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.
Você vai precisar dessa chave SSH ao criar o repositório SystemTests.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
Clique em Adicionar chave, cole a chave SSH copiada de SubmitImage, GetImageLabel ou InvokeLabeller e clique em Adicionar chave SSH.
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.
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.