Close

Implemente o ImageLabeller com o GitLab

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 GitLab. 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 tem uma organização no GitLab, siga as etapas deste guia do GitLab para criar uma do zero.

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

https://github.com/AtlassianOpenDevOpsGuides

Vídeo de demonstração da integração com o Jira GitLab

Integre o Jira e o GitLab

No Jira, clique em Quadro, depois em Aplicativos e depois em GitLab.

Captura de tela do menu suspenso no Jira Software para navegar até o GitLab

Clique em Obter agora.

Modal do app GitLab no Jira Software

Clique em Aplicativos e depois em Gerenciar seus aplicativos.

Modal do app GitLab no Jira Software com menu suspenso

Expanda o GitLab para Jira.

Expanda o GitLab na tela Gerenciar aplicativos no Jira Software

Clique em Adicionar namespace.

Tela para adicionar um namespace à configuração do GitLab Jira Software

Selecione seu namespace existente e clique em Vincular. Este guia pressupõe que você já tenha uma conta do GitLab e um grupo do GitLab existentes.

Como vincular um namespace GitLab no Jira Software

Adicione chave SSH ao GitLab

Clique no ícone do seu perfil no canto superior direito e clique em preferências.

Como navegar até as preferências usando o menu suspenso no GitLab

Clique em Chaves SSH e siga as instruções para gerar uma nova chave SSH ou usar uma chave SSH existente.

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, faça 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.

Acesse o Jira e crie um item novo para adicionar um repositório de infraestrutura do AWS S3 ao GitLab. Anote o ID do item. GI-5 neste exemplo.

Como criar um item novo para seu quadro no Jira Software

Acesse o GitLab e clique em Novo projeto.

Como navegar para criar um "Novo projeto" no GitLab

Clique em Criar projeto em branco.

Como criar um novo projeto no GitLab

Adicione um Nome de projeto e escolha o grupo apropriado no URL do projeto. Clique em Criar projeto para continuar.

Como criar um novo projeto - tela informativa no GitLab

Em seu terminal, acesse seu repositório s3_infra e execute o seguinte para enviar seu arquivo template.yml do AWS CloudFormation para o GitLab.

git add --all
git commit -m "IM-5 add s3_infra repository to gitlab"
git remote add origin git@gitlab.com:pmmquickstartguides/s3_infra.git
git branch -m mainline
git push -u origin mainline

Adicionar chave de acesso da AWS

Clique em Configurações e depois em IC/CD. Role para baixo e expanda Variáveis. Clique em Adicionar variável.

Página de configurações de IC/CD no GitLab

Crie duas variáveis. Uma para seu ID de chave de acesso da AWS e outra para sua chave de acesso secreta da AWS.

Modal "Adicione uma variável" para adicionar suas chaves da AWS no GitLab

Proteja as variáveis para que elas sejam usadas somente por pipelines executados em ramificações e tags protegidas. 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.

Chaves da AWS listadas na seção "Variáveis" na página de configurações de IC/CD no GitLab

Configure ramificações protegidas para acesso às variáveis protegidas

Clique em Configurações e depois em Repositório. Role para baixo e expanda Ramificações protegidas.

Insira seu prefixo de ID de item do Jira e um *.

Os IDs de itens do Jira estão como GI-5 e GI-6 neste exemplo; o prefixo é GI-.

Digite GI-* e clique em Proteger.

Como configurar ramificações protegidas no GitLab

Você vai ver a linha principal e o GI-* como ramificações protegidas.

Configure ambientes de implementação

Clique em Implementações e depois em Ambientes. Clique em Novo ambiente para adicionar novos ambientes. Há ambientes de teste no US-WEST-1 e US-EAST-2, e ambientes de produção no US-WEST-2, US-EAST-1 e CA-CENTRAL-1 neste exemplo.

Como configurar ambientes de implementação no GitLab

.gitlab-ci.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 .gitlab-ci.yml com o seguinte yaml. Isso define um fluxo de trabalho de implementação para seus ambientes de teste, staging e produção.

stages:
  - merge-request
  - test-us-west-1
  - test-us-east-2
  - production-us-west-2
  - production-us-east-1
  - production-ca-central-1

merge-request-pipeline-job:
  stage: merge-request
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
  script:
    - echo "This pipeline always succeeds and enables merges during merge requests"
    - echo true

deploy-test-us-west-1:
  stage: test-us-west-1
  environment: test-us-west-1
  rules:
    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  image: registry.gitlab.com/gitlab-org/cloud-deploy/aws-base:latest
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - aws cloudformation deploy --region us-west-1 --template-file template.yml --stack-name OpenDevOpsS3Infra

deploy-test-us-east-2:
  stage: test-us-east-2
  environment: test-us-east-2
  rules:
    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  image: registry.gitlab.com/gitlab-org/cloud-deploy/aws-base:latest
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - aws cloudformation deploy --region us-east-2 --template-file template.yml --stack-name OpenDevOpsS3Infra

deploy-production-us-west-2:
  stage: production-us-west-2
  environment: production-us-west-2
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  image: registry.gitlab.com/gitlab-org/cloud-deploy/aws-base:latest
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - aws cloudformation deploy --region us-west-2 --template-file template.yml --stack-name OpenDevOpsS3Infra

deploy-production-us-east-1:
  stage: production-us-east-1
  environment: production-us-east-1
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  image: registry.gitlab.com/gitlab-org/cloud-deploy/aws-base:latest
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - aws cloudformation deploy --region us-east-1 --template-file template.yml --stack-name OpenDevOpsS3Infra

deploy-production-ca-central-1:
  stage: production-ca-central-1
  environment: production-ca-central-1
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  image: registry.gitlab.com/gitlab-org/cloud-deploy/aws-base:latest
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - aws cloudformation deploy --region ca-central-1 --template-file template.yml --stack-name OpenDevOpsS3Infra

Como entender um arquivo .gitlab-ci.yml

Estágios

Adicione um bloco de estágios para definir a ordem de execução do seu pipeline do GitLab. Os estágios são executados na ordem em que são definidos no bloco de estágios. As tarefas associadas a um estágio são executadas em paralelo.

stages:
  - merge-request
  - test-us-west-1
  - test-us-east-2
  - production-us-west-2
  - production-us-east-1
  - production-ca-central-1

Tarefas

As tarefas estão associadas a um estágio e podem ser associadas a um ambiente. As regras controlam se uma tarefa específica vai ser executada ou não. A regra neste exemplo verifica se a ramificação do pipeline não é a ramificação padrão e se o pipeline não está sendo executado em automático como parte de uma solicitação de mesclagem.

Você pode especificar uma imagem diferente para cada tarefa. Você pode configurar imagens com as ferramentas necessárias para seus scripts de tarefa. A seção de script define o conjunto de etapas que são executadas quando a tarefa é executada.

deploy-test-us-west-1:
  stage: test-us-west-1
  environment: test-us-west-1
  rules:
    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  image: registry.gitlab.com/gitlab-org/cloud-deploy/aws-base:latest
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - aws cloudformation deploy --region us-west-1 --template-file template.yml --stack-name OpenDevOpsS3Infra

Pipeline de solicitação de mesclagem

Um pipeline é executado em automático pelo GitLab quando uma solicitação de mesclagem é aprovada. Você pode criar uma tarefa para esse pipeline adicionando uma regra. A tarefa sempre é bem-sucedida neste exemplo.

merge-request-pipeline-job:
  stage: merge-request
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
  script:
    - echo "This pipeline always succeeds and enables merges during merge requests"
    - echo true

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 GitLab e acompanhar o que está acontecendo em seu projeto.

git add --all
git commit -m "IM-5 add .gitlab-ci.yml to s3_infra"
git push -u origin IM-5

Clique em IC/CD e, em seguida, em Pipelines para ver o pipeline em execução.

Tela de pipelines de IC/CD no GitLab

Clique no ID do pipeline em execução.

ID de Pipeline para o pipeline em execução no GitLab

Clique em uma tarefa para ver mais informações.

Tela de tarefa informativa para pipeline em execução no GitLab

Crie uma solicitação de mesclagem

Para criar uma solicitação de mesclagem, clique em Solicitações de mesclagem e, em seguida, em Criar solicitação de mesclagem.

Tela de solicitações de mesclagem no GitLab

Escolha sua ramificação de recursos como ramificação de origem e clique em Comparar ramificações e continuar.

Como comparar a ramificação de origem e a ramificação de destino no GitLab

Escolha um Responsável e um Revisor.

Como selecionar um revisor para sua solicitação de mesclagem no GitLab

Clique em Criar solicitação de mesclagem.

Como selecionar o botão "Criar solicitação de mesclagem" no GitLab

Revise as alterações no código e clique em Aprovar.

Tela informativa da solicitação de mesclagem onde você pode revisar as alterações no GitLab

Clique em CI/CI e, em seguida, em Pipelines para ver o pipeline de solicitação de mesclagem em execução.

Como navegar até a tela "pipelines" no GitLab para ver a execução das solicitações de mesclagem

Clique no ID do pipeline. Observe que o merge-request-pipeline-job é a única tarefa executada.

Página "Pipeline" informativa mostrando que somente merge-request-pipeline-job foi executado no GitLab

Volte para a solicitação de mesclagem clicando em Solicitações de mesclagem, depois clicando na solicitação de mesclagem ativa e clique em Mesclar. Isso dá início a outro pipeline.

Como mesclar a solicitação de mesclagem ativa no GitLab

Clique em IC/CD e, em seguida, em Pipelines. Clique no ID do pipeline.

Página informativa do pipeline no GitLab exibindo "Ramificação de mesclagem 'GI-5' na 'linha principal'"

Crie um repositório para SystemTests

Acesse o Jira e crie um item do Jira para adicionar um repositório SystemTests ao GitLab. Anote o ID do item do Jira. Neste exemplo, é GI-7.

Crie um item no Jira Software para "adicionar o repositório GitLab ao SubmitImage AWS Lambda"

Adicione um Nome de projeto e escolha o grupo apropriado no URL do projeto. Clique em Criar projeto para continuar.

Como preencher as informações do projeto ao criar um novo projeto no GitLab

No seu terminal, acesse seu repositório SystemTests e execute o seguinte para enviar seu código para o GitLab.

git add --all
git commit -m "IM-7 add SystemTests repository to gitlab"
git remote add origin git@gitlab.com:pmmquickstartguides/systemtests.git
git branch -m mainline
git push -u origin mainline

O repositório SystemTests não precisa de um arquivo gitlab-ci.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 gitlab-ci.yml de repositórios posteriores com o URL correto.

Adicione um token de implementação

Você precisa adicionar um token de implementação para clonar esse repositório durante a execução de outros pipelines. Clique em Configurações e depois em Repositório. Role para baixo e expanda Implementar tokens.

Como inserir um exemplo de nome "CloneMe" em "Implementar tokens" no GitLab

Insira um nome, marque read_repository e clique em Criar token de implementação.

Como selecionar a caixa de seleção "read_repository" na página de configurações "Implementar tokens" no GitLab

O nome de usuário do token de implementação é automático. A senha do token de implementação é oferecida uma vez na criação. Adicione a senha a uma ferramenta de gerenciamento secreto para que possa ser consultada depois. Mais adiante neste guia, o nome de usuário do token de implementação é citado como gitlab_deploy_token e a senha como gitlab_deploy_password.

Tela Implementar tokens no GitLab, exibindo nome de usuário e senha de Implementar tokens

Crie um repositório para o SubmitImage AWS Lambda

Acesse o Jira e crie um item novo para adicionar um repositório SubmitImage AWS Lambda ao GitLab. Anote o ID do item. GI-8 neste exemplo.

Quadro ImageLabeller no Jira Software - destaque do item "GI-8 adicionar repositório do GitLab para SubmitImage AWS Lambda"

Vá para o GitLab e clique em Novo projeto, depois em Criar projeto em branco. Adicione um Nome de projeto e escolha o grupo apropriado no URL do projeto. Clique em Criar projeto para continuar.

captura de tela da criação de um novo projeto "submitimage" no gitlab

No seu terminal, acesse seu repositório SubmitImage e execute o seguinte para enviar seu código para o GitLab.

git add --all
git commit -m "IM-8 add SubmitImage to gitlab"
git remote add origin git@gitlab.com:pmmquickstartguides/submitimage.git
git branch -m mainline
git push -u origin mainline

Você deve adicionar chaves de acesso da AWS, configurar ramificações protegidas e configurar ambientes de implementação.

Em seguida, adicione as chaves de implementação do seu repositório SystemTests para permitir que o pipeline SubmitImage GitLab baixe e execute o SystemTests.

Por fim, adicione o ID da sua conta da AWS como uma variável IC/CD.

captura da tela de variáveis no gitlab

.gitlab-ci.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-8

Crie um arquivo .gitlab-ci.yml com o seguinte yaml. Isso define um fluxo de trabalho de implementação 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.

stages:
  - merge-request
  - run-unit-tests
#US-WEST-1
  - deploy-us-west-1
  - test-us-west-1
#US-EAST-2
  - deploy-us-east-2
  - test-us-east-2
#US-WEST-2
  - deploy-us-west-2
  - test-us-west-2
#US-EAST-1
  - deploy-us-east-1
  - test-us-east-1
#CA-CENTRAL-1
  - deploy-ca-central-1
  - test-ca-central-1

merge-request-pipeline-job:
  stage: merge-request
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
  script:
    - echo "This pipeline always succeeds and enables merge"
    - echo true

run-unit-tests:
  stage: run-unit-tests
  image: golang:buster
  rules:
    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  script:
    - cd submitImage
    - go test ./opendevopslambda/...

#US-WEST-1
deploy-us-west-1:
  stage: deploy-us-west-1
  environment: test-us-west-1
  image: python:latest
  rules:
    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  before_script:
    - pip3 install awscli --upgrade
    - pip3 install aws-sam-cli --upgrade
    - wget https://golang.org/dl/go1.16.6.linux-amd64.tar.gz
    - rm -rf /usr/local/go && tar -C /usr/local -xzf go1.16.6.linux-amd64.tar.gz
    - export PATH=$PATH:/usr/local/go/bin
    - go version
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - sam build
    - sam package --output-template-file submit-image-packaged.yaml --s3-bucket open-devops-code-us-west-1-$AWS_ACCOUNT_ID --region us-west-1
    - sam deploy --template-file submit-image-packaged.yaml --stack-name OpenDevOpsSubmitImage  --s3-bucket open-devops-code-us-west-1-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region us-west-1 --no-fail-on-empty-changeset

      #test-us-west-1:
      #  stage: test-us-west-1
      #  environment: test-us-west-1
      #  image: golang:buster
      #  rules:
      #    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
      #  script:
      #    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
      #    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
      #    - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
      #    - cd systemtests
      #    - go test -v ./... -aws_region=us-west-1

#US-EAST-2
deploy-us-east-2:
  stage: deploy-us-east-2
  environment: test-us-east-2
  image: python:latest
  rules:
    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  before_script:
    - pip3 install awscli --upgrade
    - pip3 install aws-sam-cli --upgrade
    - wget https://golang.org/dl/go1.16.6.linux-amd64.tar.gz
    - rm -rf /usr/local/go && tar -C /usr/local -xzf go1.16.6.linux-amd64.tar.gz
    - export PATH=$PATH:/usr/local/go/bin
    - go version
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - sam build
    - sam package --output-template-file submit-image-packaged.yaml --s3-bucket open-devops-code-us-east-2-$AWS_ACCOUNT_ID --region us-east-2
    - sam deploy --template-file submit-image-packaged.yaml --stack-name OpenDevOpsSubmitImage  --s3-bucket open-devops-code-us-east-2-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region us-east-2 --no-fail-on-empty-changeset

      #test-us-east-2:
      #  stage: test-us-east-2
      #  environment: test-us-east-2
      #  image: golang:buster
      #  rules:
      #    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
      #  script:
      #    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
      #    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
      #    - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
      #    - cd systemtests
      #    - go test -v ./... -aws_region=us-east-2

#US-WEST-2
deploy-us-west-2:
  stage: deploy-us-west-2
  environment: production-us-west-2
  image: python:latest
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  before_script:
    - pip3 install awscli --upgrade
    - pip3 install aws-sam-cli --upgrade
    - wget https://golang.org/dl/go1.16.6.linux-amd64.tar.gz
    - rm -rf /usr/local/go && tar -C /usr/local -xzf go1.16.6.linux-amd64.tar.gz
    - export PATH=$PATH:/usr/local/go/bin
    - go version
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - sam build
    - sam package --output-template-file submit-image-packaged.yaml --s3-bucket open-devops-code-us-west-2-$AWS_ACCOUNT_ID --region us-west-2
    - sam deploy --template-file submit-image-packaged.yaml --stack-name OpenDevOpsSubmitImage  --s3-bucket open-devops-code-us-west-2-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region us-west-2 --no-fail-on-empty-changeset

      #test-us-west-2:
      #  stage: test-us-west-2
      #  environment: production-us-west-2
      #  image: golang:buster
      #  rules:
      #    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
      #  script:
      #    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
      #    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
      #    - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
      #    - cd systemtests
      #    - go test -v ./... -aws_region=us-west-2

#US-EAST-1
deploy-us-east-1:
  stage: deploy-us-east-1
  environment: production-us-east-1
  image: python:latest
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  before_script:
    - pip3 install awscli --upgrade
    - pip3 install aws-sam-cli --upgrade
    - wget https://golang.org/dl/go1.16.6.linux-amd64.tar.gz
    - rm -rf /usr/local/go && tar -C /usr/local -xzf go1.16.6.linux-amd64.tar.gz
    - export PATH=$PATH:/usr/local/go/bin
    - go version
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - sam build
    - sam package --output-template-file submit-image-packaged.yaml --s3-bucket open-devops-code-us-east-1-$AWS_ACCOUNT_ID --region us-east-1
    - sam deploy --template-file submit-image-packaged.yaml --stack-name OpenDevOpsSubmitImage  --s3-bucket open-devops-code-us-east-1-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region us-east-1 --no-fail-on-empty-changeset

      #test-us-east-1:
      #  stage: test-us-east-1
      #  environment: production-us-east-1
      #  image: golang:buster
      #  rules:
      #    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
      #  script:
      #    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
      #    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
      #    - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
      #    - cd systemtests
      #    - go test -v ./... -aws_region=us-east-1

#CA-CENTRAL-1
deploy-central-1:
  stage: deploy-ca-central-1
  environment: production-ca-central-1
  image: python:latest
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  before_script:
    - pip3 install awscli --upgrade
    - pip3 install aws-sam-cli --upgrade
    - wget https://golang.org/dl/go1.16.6.linux-amd64.tar.gz
    - rm -rf /usr/local/go && tar -C /usr/local -xzf go1.16.6.linux-amd64.tar.gz
    - export PATH=$PATH:/usr/local/go/bin
    - go version
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - sam build
    - sam package --output-template-file submit-image-packaged.yaml --s3-bucket open-devops-code-ca-central-1-$AWS_ACCOUNT_ID --region ca-central-1
    - sam deploy --template-file submit-image-packaged.yaml --stack-name OpenDevOpsSubmitImage  --s3-bucket open-devops-code-ca-central-1-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region ca-central-1 --no-fail-on-empty-changeset

      #test-central-1:
      #  stage: test-ca-central-1
      #  environment: production-ca-central-1
      #  image: golang:buster
      #  rules:
      #    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
      #  script:
      #    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
      #    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
      #    - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
      #    - cd systemtests
      #    - go test -v ./... -aws_region=ca-central-1

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 .gitlab-ci.yml

Essa etapa executa testes de unidade que fazem parte do repositório SubmitImage.

unit-test-us-west-1:
  stage: unit-test-us-west-1
  environment: test-us-west-1
  image: golang:buster
  rules:
    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  script:
    - cd submitImage
    - go test ./opendevopslambda/...

Esta etapa implementa o SubmitImage AWS Lambda usando a AWS SAM. Observe a seção before_script. Essa etapa é executada antes da seção script e pode ser usada para instalar dependências e configurar várias ferramentas.

deploy-us-west-1:
  stage: deploy-us-west-1
  environment: test-us-west-1
  image: python:latest
  rules:
    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  before_script:
    - pip3 install awscli --upgrade
    - pip3 install aws-sam-cli --upgrade
    - wget https://golang.org/dl/go1.16.6.linux-amd64.tar.gz
    - rm -rf /usr/local/go && tar -C /usr/local -xzf go1.16.6.linux-amd64.tar.gz
    - export PATH=$PATH:/usr/local/go/bin
    - go version
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - sam build
    - sam package --output-template-file submit-image-packaged.yaml --s3-bucket open-devops-code-us-west-1-$AWS_ACCOUNT_ID --region us-west-1
    - sam deploy --template-file submit-image-packaged.yaml --stack-name OpenDevOpsSubmitImage  --s3-bucket open-devops-code-us-west-1-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region us-west-1 --no-fail-on-empty-changeset

Essa etapa baixa e executa os testes de integração no repositório SystemTests. Você deve atualizar a linha de clone do git para que SystemTests seja seu repositório SystemTests.

test-us-west-1:
  stage: test-us-west-1
  environment: test-us-west-1
  image: golang:buster
  rules:
    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
    - cd systemtests
    - go test -v ./... -aws_region=us-west-1

O token de implementação criado em uma etapa anterior é referenciado na linha de clone do git.

- git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git

Enviando para uma ramificação de recursos

Execute o seguinte na linha de comando para enviar suas alterações para a ramificação GI-8 do seu repositório SubmitImage. 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 GitLab e acompanhar o que está acontecendo em seu projeto.

git add --all
git commit -m "IM-8 add .gitlab-ci.yml to SubmitImage"
git push -u origin IM-8

Clique em IC/CD e, em seguida, em Pipelines para ver o pipeline em execução.

captura de tela do pipeline executado no gitlab

Crie uma solicitação de mesclagem

Crie uma solicitação de mesclagem para implementar em seus ambientes de produção após as implementações do GitLab em seus ambientes de teste. Escolha a ramificação GI-8.

captura de tela das solicitações de mesclagem no gitlab

Clique em IC/CD e, em seguida, em Pipelines para ver o pipeline de solicitação de mesclagem em execução.

captura de tela da execução da solicitação de mesclagem no gitlab

Mescle as alterações na linha principal após a conclusão do pipeline de solicitação de mesclagem. Clique em IC/CD e, em seguida, em Pipelines para ver o pipeline de produção em execução.

captura de tela da execução do pipeline de produção no gitlab

Crie um repositório para InvokeLabeller AWS Lambda

Acesse o Jira e crie um item novo do Jira para adicionar um repositório InvokeLabeller AWS Lambda ao GitLab. Anote o ID do item. GI-10 neste exemplo.

captura de tela de criar um item do jira do repositório "invokelabeller" no gitlab

Vá para o GitLab e clique em Novo projeto, depois em Criar projeto em branco. Adicione um Nome de projeto e escolha o grupo apropriado no URL do projeto. Clique em Criar projeto para continuar.

captura de tela da criação de um novo projeto "invokelabeller" no gitlab

No seu terminal, acesse seu repositório InvokeLabeller e execute o seguinte para enviar seu código para o GitLab.

git add --all
git commit -m "IM-10 add InvokeLabeller to gitlab"
git remote add origin git@gitlab.com:pmmquickstartguides/invokelabeller.git
git branch -m mainline
git push -u origin mainline

Você deve adicionar chaves de acesso da AWS, configurar ramificações protegidas e configurar ambientes de implementação.

Em seguida, adicione as chaves de implementação do seu repositório SystemTests para permitir que o pipeline InvokeLabeller GitLab baixe e execute o SystemTests.

Por fim, adicione o ID da sua conta da AWS como uma variável IC/CD.

captura de tela da página de variáveis no gitlab

.gitlab-ci.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 .gitlab-ci.yml com o seguinte yaml. Isso define um fluxo de trabalho de implementação 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.

stages:
  - merge-request
  - run-unit-tests
#US-WEST-1
  - deploy-us-west-1
  - test-us-west-1
#US-EAST-2
  - deploy-us-east-2
  - test-us-east-2
#US-WEST-2
  - deploy-us-west-2
  - test-us-west-2
#US-EAST-1
  - deploy-us-east-1
  - test-us-east-1
#CA-CENTRAL-1
  - deploy-ca-central-1
  - test-ca-central-1

merge-request-pipeline-job:
  stage: merge-request
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
  script:
    - echo "This pipeline always succeeds and enables merge"
    - echo true

run-unit-tests:
  stage: run-unit-tests
  image: python:3.8-buster
  rules:
    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  before_script:
    - pip3 install pytest
    - pip3 install moto
    - pip3 install -r tst/requirements.txt --user
  script:
    - python3 -m pytest -v tst/unit --junitxml=test-reports/report.xml

#US-WEST-1
deploy-us-west-1:
  stage: deploy-us-west-1
  environment: test-us-west-1
  image: python:3.8-buster
  rules:
    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  before_script:
    - pip3 install awscli --upgrade
    - pip3 install aws-sam-cli --upgrade
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - sam build
    - sam package --output-template-file invoke-labeller-packaged.yaml --s3-bucket open-devops-code-us-west-1-$AWS_ACCOUNT_ID --region us-west-1
    - sam deploy --template-file invoke-labeller-packaged.yaml --stack-name OpenDevOpsInvokeLabeller  --s3-bucket open-devops-code-us-west-1-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region us-west-1 --no-fail-on-empty-changeset

      #test-us-west-1:
      #  stage: test-us-west-1
      #  environment: test-us-west-1
      #  image: golang:buster
      #  rules:
      #    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
      #  script:
      #    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
      #    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
      #    - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
      #    - cd systemtests
      #    - go test -v ./... -aws_region=us-west-1

#US-EAST-2
deploy-us-east-2:
  stage: deploy-us-east-2
  environment: test-us-east-2
  image: python:3.8-buster
  rules:
    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  before_script:
    - pip3 install awscli --upgrade
    - pip3 install aws-sam-cli --upgrade
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - sam build
    - sam package --output-template-file invoke-labeller-packaged.yaml --s3-bucket open-devops-code-us-east-2-$AWS_ACCOUNT_ID --region us-east-2
    - sam deploy --template-file invoke-labeller-packaged.yaml --stack-name OpenDevOpsInvokeLabeller  --s3-bucket open-devops-code-us-east-2-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region us-east-2 --no-fail-on-empty-changeset

      #test-us-east-2:
      #  stage: test-us-east-2
      #  environment: test-us-east-2
      #  image: golang:buster
      #  rules:
      #    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
      #  script:
      #    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
      #    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
      #    - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
      #    - cd systemtests
      #    - go test -v ./... -aws_region=us-east-2

#US-WEST-2
deploy-us-west-2:
  stage: deploy-us-west-2
  environment: production-us-west-2
  image: python:3.8-buster
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  before_script:
    - pip3 install awscli --upgrade
    - pip3 install aws-sam-cli --upgrade
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - sam build
    - sam package --output-template-file invoke-labeller-packaged.yaml --s3-bucket open-devops-code-us-west-2-$AWS_ACCOUNT_ID --region us-west-2
    - sam deploy --template-file invoke-labeller-packaged.yaml --stack-name OpenDevOpsInvokeLabeller  --s3-bucket open-devops-code-us-west-2-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region us-west-2 --no-fail-on-empty-changeset

      #test-us-west-2:
      #  stage: test-us-west-2
      #  environment: production-us-west-2
      #  image: golang:buster
      #  rules:
      #    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
      #  script:
      #    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
      #    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
      #    - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
      #    - cd systemtests
      #    - go test -v ./... -aws_region=us-west-2

#US-EAST-1
deploy-us-east-1:
  stage: deploy-us-east-1
  environment: production-us-east-1
  image: python:3.8-buster
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  before_script:
    - pip3 install awscli --upgrade
    - pip3 install aws-sam-cli --upgrade
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - sam build
    - sam package --output-template-file invoke-labeller-packaged.yaml --s3-bucket open-devops-code-us-east-1-$AWS_ACCOUNT_ID --region us-east-1
    - sam deploy --template-file invoke-labeller-packaged.yaml --stack-name OpenDevOpsInvokeLabeller  --s3-bucket open-devops-code-us-east-1-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region us-east-1 --no-fail-on-empty-changeset

      #test-us-east-1:
      #  stage: test-us-east-1
      #  environment: production-us-east-1
      #  image: golang:buster
      #  rules:
      #    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
      #  script:
      #    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
      #    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
      #    - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
      #    - cd systemtests
      #    - go test -v ./... -aws_region=us-east-1

#CA-CENTRAL-1
deploy-central-1:
  stage: deploy-ca-central-1
  environment: production-ca-central-1
  image: python:3.8-buster
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  before_script:
    - pip3 install awscli --upgrade
    - pip3 install aws-sam-cli --upgrade
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - sam build
    - sam package --output-template-file invoke-labeller-packaged.yaml --s3-bucket open-devops-code-ca-central-1-$AWS_ACCOUNT_ID --region ca-central-1
    - sam deploy --template-file invoke-labeller-packaged.yaml --stack-name OpenDevOpsInvokeLabeller  --s3-bucket open-devops-code-ca-central-1-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region ca-central-1 --no-fail-on-empty-changeset

      #test-central-1:
      #  stage: test-ca-central-1
      #  environment: production-ca-central-1
      #  image: golang:buster
      #  rules:
      #    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
      #  script:
      #    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
      #    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
      #    - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
      #    - cd systemtests
      #    - go test -v ./... -aws_region=ca-central-1

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.

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

Execute o seguinte na linha de comando para enviar suas alterações para a ramificação GI-10 do seu repositório InvokeLabeller. 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 GitLab e acompanhar o que está acontecendo em seu projeto.

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

Clique em IC/CD e, em seguida, em Pipelines para ver o pipeline em execução.

captura de tela do pipeline em execução no gitlab

Crie uma solicitação de mesclagem

Crie uma solicitação de mesclagem para implementar em seus ambientes de produção após as implementações do GitLab em seus ambientes de teste. Escolha a ramificação GI-10.

captura de tela da criação da solicitação de mesclagem no gitlab

Mescle as alterações na linha principal após a conclusão do pipeline de solicitação de mesclagem. Clique em IC/CD e, em seguida, em Pipelines para ver o pipeline de produção em execução.

captura de tela da execução do pipeline de produção no gitlab

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 DevOps

Comunidade do DevOps

Ilustração 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