Articoli
Tutorial
Guide interattive
Distribuzione di ImageLabeller con Bitbucket
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
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.
Vai su Bitbucket > Create (Crea) > Repository.
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.
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).
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).
Configurazione degli ambienti di distribuzione
Clicca su Deployments (Distribuzioni).
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.
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.
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.
Creare una pull request
Per creare una pull request, clicca su Pull request, quindi su Create pull request (Crea pull request).
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).
Rivedi le modifiche al codice, quindi clicca su Approve (Approva) e su Merge (Effettua merge) per approvare ed effettuare il merge della pull request.
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).
Clicca su Pipelines per monitorare la pipeline della mainline.
Il branch IM-5 non è più visualizzato. Il branch della mainline è a sinistra e una pipeline è in esecuzione. Clicca sulla pipeline.
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).
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).
Verifica che la modifica sia corretta e clicca su Redeploy (Ridistribuisci).
Viene ridistribuito solo l'ambiente scelto.
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.
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.
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).
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.
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.
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).
Questa chiave SSH sarà necessaria per creare il repository SystemTests.
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.
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.
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.
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.
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).
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 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.
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).
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.
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.
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.
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.
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).
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).
Congratulazioni! Hai appena distribuito ImageLabeller. Il passaggio successivo prevede la configurazione del monitoraggio di ImageLabeller con Opsgenie.
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.