Close

Distribuzione di ImageLabeller con Bitbucket

Primo piano di Warren Marusiak
Warren Marusiak

Senior Technical Evangelist

Per fornire una dimostrazione di come sviluppare, distribuire e gestire applicazioni utilizzando Jira Software e vari strumenti connessi, il nostro team ha creato ImageLabeller, una semplice applicazione demo basata su AWS che utilizza l'apprendimento automatico per applicare etichette alle immagini.

In questa pagina viene spiegato come distribuire ImageLabeller con Bitbucket. Prima di iniziare, ti consigliamo di leggere le pagine sull'architettura di ImageLabeller e sulla configurazione di AWS SageMaker per contestualizzare i contenuti.

Prerequisiti

Se non hai già configurato SSH per il tuo account Bitbucket, segui queste istruzioni.

Repository GitHub pubblici con codice ImageLabeller

https://github.com/AtlassianOpenDevOpsGuides

Video demo di Bitbucket Pipelines

Creazione di un repository per l'infrastruttura AWS S3

Un ciclo di sviluppo standard prevede in generale la presenza di uno sviluppatore che sposta un task da Jira nel lavoro in corso e poi si occupa dell'attività di sviluppo. L'ID del ticket Jira è la chiave che collega l'attività di sviluppo al ticket Jira. È il componente di integrazione principale tra i due sistemi.

Vai su Jira e crea un nuovo ticket per aggiungere un repository di infrastruttura AWS S3 a Bitbucket. Prendi nota dell'ID del ticket, che in questo esempio è IM-5.

Screenshot che mostra il ticket Jira per l'aggiunta del repository dell'infrastruttura AWS S3 a Bitbucket

Vai su Bitbucket > Create (Crea) > Repository.

Creazione di un repository in Bitbucket

In Workspace e Project seleziona rispettivamente lo spazio di lavoro e il progetto appropriati. Imposta il nome del branch predefinito sulla mainline. Clicca su Create repository (Crea repository) per procedere.

Finestra pop-up per la creazione di un nuovo repository in Bitbucket

Nel terminale utilizzato, vai al repository s3_infra ed esegui i comandi riportati di seguito per effettuare il push del file AWS CloudFormation template.yml a 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

Abilita Bitbucket Pipelines

Vai a Repository settings (Impostazioni repository) > Settings (Impostazioni) > Enable Pipelines (Abilita Pipelines).

Abilitazione delle pipeline in Bitbucket

Aggiunta di variabili del repository delle chiavi di accesso a AWS

Vai a Repository variables (Variabili repository), inserisci l'ID della chiave di accesso AWS e clicca su Add (Aggiungi), quindi inserisci la chiave di accesso segreta AWS e clicca su Add (Aggiungi).

Variabili del repository in Bitbucket

Configurazione degli ambienti di distribuzione

Clicca su Deployments (Distribuzioni).

Screenshot delle impostazioni della distribuzione in Bitbucket

Clicca su add environment (aggiungi ambiente) per aggiungere nuovi ambienti. In questo esempio è presente un ambiente di test in US-WEST-1, un ambiente di staging in US-EAST-2 e tre ambienti di produzione in US-WEST-2, US-EAST-1 e CA-CENTRAL-1.

Aggiunta di ambienti di distribuzione in Bitbucket

bitbucket-pipelines.yml per la distribuzione in AWS

Vai al repository s3_infra nel terminale utilizzato e crea un branch che abbia lo stesso nome dell'ID del ticket Jira.

git checkout -b IM-5

Crea un file bitbucket-pipelines.yml con il seguente yaml. Viene definito un flusso di lavoro di distribuzione per gli ambienti di test, staging e produzione.

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

Comprendere un file bitbucket-pipelines.yml

Definizioni e passaggi

Definisci una serie di passaggi nella sezione delle definizioni. Ogni passaggio ha un alias a cui si fa riferimento nel file bitbucket-pipelines.yml, un nome che appare nella schermata di distribuzione di Bitbucket e uno script. Uno script è una raccolta di uno o più comandi.

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

Questo passaggio utilizza la pipe atlassian/aws-cloudformation-deploy per distribuire i bucket AWS S3 definiti nel file s3_infra template.yml.

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

Il set di pipe disponibili si trova qui. La documentazione per la pipe atlassian/aws-cloudformation-deploy si trova qui.

Pipeline

Le pipeline eseguono una serie di passaggi. La pipeline predefinita è l'insieme di passaggi che viene eseguito per i branch che non sono denominati esplicitamente sotto pipelines. Esegue passaggi che vengono distribuiti negli ambienti di test e staging.

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

Le distribuzioni consentono l'integrazione tra Jira e Bitbucket.

deployment: Test us-west-1

È possibile definire una serie di passaggi che vengono eseguiti per uno specifico branch denominato sotto branches. Lo snippet riportato di seguito definisce una serie di passaggi per il branch principale.

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

Leggi questo articolo di riferimento per maggiori informazioni su questo argomento.

Push di un branch di funzioni

Esegui lo script seguente dalla riga di comando per effettuare il push delle modifiche al branch IM-5 del repository s3_infra. Includi l'ID del ticket Jira nei messaggi di commit e i nomi dei branch per abilitare l'integrazione di Jira Bitbucket e monitorare ciò che sta accadendo nel progetto.

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

Clicca su Pipelines, quindi su IM-5 per vedere la pipeline in esecuzione.

Esecuzione della pipeline in Bitbucket

Clicca sulla pipeline stessa per visualizzare i dettagli dell'esecuzione. La pipeline ha eseguito i passaggi per la distribuzione in un ambiente di test in us-west-1 e in un ambiente di staging in us-east-2.

Dettagli sull'esecuzione delle pipeline in Bitbucket

Creare una pull request

Per creare una pull request, clicca su Pull request, quindi su Create pull request (Crea pull request).

Creazione di una pull request in Bitbucket

Scegli il branch di funzioni come branch di origine, seleziona la casella di controllo Close branch (Chiudi branch), quindi clicca su Create pull request (Crea pull request).

Modulo di creazione di una pull request in Bitbucket.

Rivedi le modifiche al codice, quindi clicca su Approve (Approva) e su Merge (Effettua merge) per approvare ed effettuare il merge della pull request.

Approvazione e merge della pull request in Bitbucket

Cliccando su Merge (Effettua merge) si apre la schermata per il merge della pull request. Seleziona la casella di controllo Transition issue (Transizione ticket) e clicca su Merge (Effettua merge).

Selezione della casella di controllo relativa alla transizione del ticket durante il merge della pull request in Bitbucket

Clicca su Pipelines per monitorare la pipeline della mainline.

Monitoraggio della pipeline principale in Bitbucket

Il branch IM-5 non è più visualizzato. Il branch della mainline è a sinistra e una pipeline è in esecuzione. Clicca sulla pipeline.

Schermata relativa alla pipeline del branch della mainline in Bitbucket

La pipeline ha eseguito i passaggi per la distribuzione negli ambienti di produzione in us-west-2, us-east-1 e ca-central-1. È possibile eseguire di nuovo una pipeline cliccando sul pulsante Rerun (Esegui di nuovo) in caso di errore di una pipeline.

Rollback di una distribuzione errata

Per eseguire il rollback di una distribuzione, clicca su Deployment (Distribuzioni).

Schermata delle distribuzioni in Bitbucket

Clicca sull'ambiente in cui desideri eseguire il rollback per ottenere un elenco delle distribuzioni cronologiche, scegli la versione in cui desideri eseguire il rollback, quindi clicca su Redeploy (Ridistribuisci).

Selezione di un ambiente e della versione a cui desideri eseguire il rollback in Bitbucket

Verifica che la modifica sia corretta e clicca su Redeploy (Ridistribuisci).

Verifica della correttezza delle modifiche prima di selezionare la ridistribuzione in Bitbucket

Viene ridistribuito solo l'ambiente scelto.

Modale della pipeline in Bitbucket che mostra solo l'ambiente scelto in fase di ridistribuzione

Creazione di un repository per l'AWS Lambda SubmitImage

Vai su Jira e crea un ticket Jira per aggiungere un repository SubmitImage a Bitbucket. Prendi nota dell'ID del ticket Jira, che in questo esempio è IM-6.

Creazione di un ticket in Jira Software per l'aggiunta di un repository SubmitImage a Bitbucket

Vai su Bitbucket e clicca su Create (Crea), quindi su Repository.

Creazione di un repository in Bitbucket

In Workspace (Spazio di lavoro) e Project (Progetto), seleziona rispettivamente lo spazio di lavoro e il progetto appropriati. Imposta il nome del branch predefinito sulla mainline. Clicca su Create repository (Crea repository) per procedere.

Modale popup modale per la creazione di un nuovo repository in Bitbucket

Nel terminale utilizzato, vai al repository SubmitImage ed esegui lo script seguente per effettuare il push del codice AWS Lambda a Bitbucket. Includi l'ID del ticket Jira nei messaggi di commit e i nomi dei branch per abilitare l'integrazione di Jira Bitbucket e monitorare ciò che sta accadendo nel progetto.

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

Abilitazione di Pipelines

Vai a Repository settings (Impostazioni repository), clicca su Settings (Impostazioni), quindi su Enable Pipelines (Abilita Pipelines).

Abilitazione di Pipelines nelle impostazioni delle pipeline in Bitbucket

Aggiunta di variabili del repository

Clicca su Repository variables (Variabili del repository) per aggiungere l'ID della chiave di accesso AWS, la chiave di accesso segreta AWS e l'ID dell'account AWS. Fornisci la chiave di accesso AWS AdministratorAccess all'utente IAM associato. Puoi decidere di utilizzare un controllo degli accessi più granulare scegliendo le policy di accesso AWS individuali.

Abilitazione di Pipelines nelle impostazioni delle pipeline in Bitbucket

Aggiunta di ambienti di distribuzione

Clicca su Deployments (Distribuzioni), quindi su add environment (aggiungi ambiente) per aggiungere nuovi ambienti. In questo esempio è presente un ambiente di test in us-west-1, un ambiente di staging in us-east-2 e tre ambienti di produzione in us-west-2, us-east-1 and ca-central-1.

Ambienti di distribuzione in Bitbucket

Creazione di chiavi SSH

Vai al repository SubmitImage in Bitbucket e clicca su Repository settings (Impostazioni del repository), quindi su SSH keys (Chiavi SSH) e infine su Generate keys (Genera chiavi).

Generazione di chiavi SSH in Bitbucket

Questa chiave SSH sarà necessaria per creare il repository SystemTests.

Dettagli delle chiavi SSH in Bitbucket

bitbucket-pipelines.yml per la distribuzione in AWS

Vai al repository SubmitImage nel terminale utilizzato e crea un branch che abbia lo stesso nome dell'ID del ticket Jira.

git checkout -b IM-6

Crea un file bitbucket-pipelines.yml con il seguente yaml. Viene definita una pipeline Bitbucket per gli ambienti di test, staging e produzione. Devi aggiornare la riga git clone affinché SystemTests sia il tuo repository 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

L'esecuzione dei test di integrazione è commentata per ora. I test di sistema passeranno solo quando viene distribuita l'intera applicazione. Decommenta i passaggi dei test di integrazione nel repository ed effettua un altro push per eseguire la pipeline di distribuzione dopo che tutti i componenti di ImageLabeller sono stati distribuiti. Devi aggiornare la riga git clone affinché SystemTests sia il tuo repository SystemTests.

Comprendere un file bitbucket-pipelines.yml

Questo passaggio consente di eseguire i test unitari dalla base di codice SubmitImage.

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

Questo passaggio utilizza AWS SAM per distribuire l'AWS Lambda SubmitImage su us-west-2. La documentazione per questa pipe è disponibile qui.

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

Questo passaggio clona il repository SystemTests ed esegue test di integrazione in us-west-2. Devi aggiornare la riga git clone affinché SystemTests sia il tuo repository 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

Push di un branch di funzioni

Dalla riga di comando esegui lo script riportato di seguito per effettuare il push delle modifiche al branch IM-8 del repository SubmitImage.

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

Clicca su Pipelines, quindi su IM-6 per vedere la pipeline in esecuzione.

Screenshot delle pipeline di Bitbucket Cloud

Creare una pull request

Per creare una pull request, clicca su Pull request, quindi su Create pull request (Crea pull request). Completa la pull request e clicca su Pipelines per vedere la distribuzione in produzione.

Pipeline della distribuzione in produzione in Bitbucket Cloud

Creazione di un repository per l'AWS Lambda InvokeLabeller

Vai su Jira e crea un ticket Jira per aggiungere un repository InvokeLabeller a Bitbucket. Prendi nota dell'ID del ticket Jira, che in questo esempio è IM-10.

Screenshot che mostra i ticket Jira su una board Jira

Vai su Bitbucket e clicca su Create (Crea), quindi su Repository. In Workspace (Spazio di lavoro) e Project (Progetto), seleziona rispettivamente lo spazio di lavoro e il progetto appropriati. Imposta il nome del branch predefinito sulla mainline. Clicca su Create repository (Crea repository) per procedere.

Creazione di un repository InvokeLabeller in Bitbucket

Nel terminale utilizzato, vai al repository InvokeLabeller ed esegui lo script seguente per effettuare il push del codice AWS Lambda a Bitbucket. Includi l'ID del ticket Jira nei messaggi di commit e i nomi dei branch per abilitare l'integrazione di Jira Bitbucket e monitorare ciò che sta accadendo nel progetto.

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

Abilitazione di Pipelines

Vai a Repository settings (Impostazioni repository), clicca su Settings (Impostazioni), quindi su Enable Pipelines (Abilita Pipelines).

Abilitazione di Pipelines nelle impostazioni di Bitbucket

Aggiunta di variabili del repository

Clicca su Repository variables (Variabili del repository) per aggiungere l'ID della chiave di accesso AWS, la chiave di accesso segreta AWS e l'ID dell'account AWS. Fornisci la chiave di accesso AWS AdministratorAccess all'utente IAM associato. Puoi decidere di utilizzare un controllo degli accessi più dettagliato scegliendo le policy di accesso AWS individuali, ma i dettagli sono lasciati al lettore.

Aggiunta di variabili del repository in Bitbucket

Aggiunta di ambienti di distribuzione

Clicca su Deployments (Distribuzioni), quindi su add environment (aggiungi ambiente) per aggiungere nuovi ambienti. In questo esempio è presente un ambiente di test in us-west-1, un ambiente di staging in us-east-2 e tre ambienti di produzione in us-west-2, us-east-1 and ca-central-1.

Ambienti di distribuzione in Bitbucket

Creazione di chiavi SSH

Vai al repository SubmitImage in Bitbucket e clicca su Repository settings (Impostazioni del repository), quindi su SSH keys (Chiavi SSH) e infine su Generate keys (Genera chiavi).

Dettagli della chiave SSH in Bitbucket Cloud

bitbucket-pipelines.yml per la distribuzione in AWS

Vai al repository InvokeLabeller nel terminale utilizzato e crea un branch che abbia lo stesso nome dell'ID del ticket Jira.

git checkout -b IM-10

Crea un file bitbucket-pipelines.yml con il seguente yaml. Viene definita una pipeline Bitbucket per gli ambienti di test, staging e produzione. Devi aggiornare la riga git clone affinché SystemTests sia il tuo repository 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

L'esecuzione dei test di integrazione è commentata per ora. I test di sistema passeranno solo quando viene distribuita l'intera applicazione. Decommenta i passaggi dei test di integrazione nel repository ed effettua un altro push per eseguire la pipeline di distribuzione dopo che tutti i componenti di ImageLabeller sono stati distribuiti. Devi aggiornare la riga git clone affinché SystemTests sia il tuo repository SystemTests.

Comprendere un file bitbucket-pipelines.yml

Questo passaggio consente di eseguire i test unitari dalla base di codice InvokeLabeller.

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

Aggiornamento di src/app.py con l'endpoint AWS SageMaker

Apri il file src/app.py di InvokeLabeller e cerca query_endpoint. Modifica la voce endpoint_name e la voce region_name del client in modo che corrispondano al notebook AWS SageMaker utilizzato.

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

Push di un branch di funzioni

Dalla riga di comando esegui lo script riportato di seguito per effettuare il push delle modifiche al branch IM-10 del repository InvokeLabeller.

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

Clicca su Pipelines, quindi su IM-10 per vedere la pipeline in esecuzione.

Visualizzazione delle pipeline in esecuzione in Bitbucket Cloud

Creare una pull request

Per creare una pull request, clicca su Pull request, quindi su Create pull request (Crea pull request). Completa la pull request e clicca su Pipelines per vedere la distribuzione in produzione.

Visualizzazione della distribuzione nella produzione in Bitbucket Pipelines

Creazione di un repository per i test di sistema

Vai su Jira e crea un nuovo ticket per aggiungere un repository SystemTests a Bitbucket. Prendi nota dell'ID del ticket, che in questo esempio è IM-7.

Visualizzazione di un nuovo ticket Jira sulla board di Jira

Vai su Bitbucket e clicca su Create (Crea), quindi su Repository.

Creazione di un repository in Bitbucket

In Workspace (Spazio di lavoro) e Project (Progetto), seleziona rispettivamente lo spazio di lavoro e il progetto appropriati. Imposta il nome del branch predefinito sulla mainline. Clicca su Create repository (Crea repository) per procedere.

Immissione di informazioni durante la creazione di un nuovo repository in Bitbucket

Nel terminale utilizzato, vai al repository SystemTests ed esegui lo script seguente per effettuare il push del codice a 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

Il repository SystemTests non richiede un file bitbucket-pipelines.yml. Non dispone di una pipeline propria poiché fornisce i test per l'esecuzione di altre pipeline. Prendi nota dell'URL remoto del repository SystemTests. Le pipeline CI/CD di SubmitImage, GetImageLabel e InvokeLabeller cloneranno il repository SystemTests durante i passaggi di test. Dovrai aggiornare il file bitbucket-pipelines.yml dei repository successivi specificando l'URL corretto.

Aggiunta di chiavi SSH da SubmitImage, GetImageLabel e InvokeLabeller

Clicca su Repository settings (Impostazioni del repository), quindi su Access keys (Chiavi di accesso).

Pagina delle impostazioni delle chiavi di accesso in Bitbucket

Clicca su Add Key (Aggiungi chiave), incolla la chiave SSH copiata da SubmitImage, GetImageLabel o InvokeLabeller, quindi clicca su Add SSH key (Aggiungi chiave SSH).

Aggiunta di una chiave SSH in Bitbucket

Congratulazioni! Hai appena distribuito ImageLabeller. Il passaggio successivo prevede la configurazione del monitoraggio di ImageLabeller con 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.


Condividi l'articolo
Argomento successivo

Letture consigliate

Aggiungi ai preferiti queste risorse per ricevere informazioni sui tipi di team DevOps e aggiornamenti continui su DevOps in Atlassian.

Illustrazione su Devops

Community DevOps

Illustrazione su Devops

Percorso di apprendimento DevOps

Illustrazione di una mappa

Inizia gratis

Iscriviti alla nostra newsletter DevOps

Thank you for signing up