Articles
Tutoriels
Guides interactifs
Déployer ImageLabeller avec Bitbucket
Warren Marusiak
Senior Technical Evangelist
Pour montrer comment développer, déployer et gérer des applications à l'aide de Jira Software et de divers outils connectés, notre équipe a créé ImageLabeller, une application de démo simple basée sur AWS qui utilise l'apprentissage machine pour appliquer des étiquettes à des images.
Cette page explique comment déployer ImageLabeller avec Bitbucket. Avant de commencer, nous vous recommandons de lire les pages consacrées à l'architecture d'ImageLabeller et à la configuration d'AWS SageMaker pour plus de contexte.
Prérequis
Si SSH n'est pas encore configuré pour votre compte Bitbucket, suivez ces instructions.
Dépôts GitHub publics avec code ImageLabeller
Vidéo de démo de Bitbucket Pipelines
Créer un dépôt pour l'infrastructure AWS S3
Dans une boucle de développement standard, un développeur choisit généralement une tâche depuis Jira, la déplace vers la section Work in progress (Travail en cours), puis effectue le travail de développement. L'identifiant du ticket Jira est la clé qui relie la tâche de développement au ticket Jira. C'est le principal composant d'intégration entre les deux systèmes.
À partir de Jira, créez un ticket pour ajouter un dépôt d'infrastructure AWS S3 dans Bitbucket. Notez l'identifiant du ticket. Dans cet exemple : IM-5.
Accédez à Bitbucket > Create > Repository (Créer > Dépôt).
Sélectionnez l'espace de travail et le projet appropriés. Définissez le nom de la branche par défaut sur mainline (Principale). Cliquez sur Create repository (Créer un dépôt) pour continuer.
Dans votre terminal, accédez à votre dépôt s3_infra et exécutez les commandes suivantes pour pusher votre fichier template.yml AWS CloudFormation vers 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
Activer Bitbucket Pipelines
Accédez à Repository settings > Settings > Enable Pipelines (Paramètres du dépôt > Paramètres > Activer Pipelines).
Ajouter une clé d'accès AWS à des variables de dépôt
Accédez à Repository variables (Variables du dépôt), saisissez votre identifiant de clé d'accès AWS, puis cliquez sur Add (Ajouter). Saisissez ensuite votre clé d'accès secrète AWS, puis cliquez sur Add (Ajouter).
Configurer des environnements de déploiement
Cliquez sur Deployments (Déploiements).
Cliquez sur add environment (ajouter un environnement) pour ajouter de nouveaux environnements. Dans cet exemple, nous voyons un environnement de test (US-WEST-1), un environnement de staging (US-EAST-2) et trois environnements de production (US-WEST-2, US-EAST-1 et CA-CENTRAL-1).
Fichier bitbucket-pipelines.yml pour le déploiement sur AWS
Accédez au dépôt s3_infra de votre terminal, créez une branche portant l'identifiant de votre ticket Jira.
git checkout -b IM-5
Créez un fichier bitbucket-pipelines.yml avec le code yaml suivant. Cela définit un workflow de déploiement pour vos environnements de test, de staging et de production.
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
Comprendre un fichier bitbucket-pipelines.yml
Définitions et étapes
Définissez une série d'étapes dans la section definitions (définitions). Chaque étape comporte un alias référencé dans le fichier bitbucket-pipelines.yml, un nom qui apparaît sur l'écran de déploiement de Bitbucket et un script. Un script est un ensemble d'une ou de plusieurs commandes.
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
Cette étape utilise le pipe atlassian/aws-cloudformation-deploy
pour déployer les compartiments AWS S3 définis dans le fichier template.yml du dépôt s3_infra.
- pipe: atlassian/aws-cloudformation-deploy:0.10.0
L'ensemble des pipes disponibles se trouve ici. La documentation du pipe atlassian/aws-cloudformation-deploy
se trouve ici.
Pipelines
Les pipelines exécutent un ensemble d'étapes. Le pipeline par défaut comprend les étapes exécutées pour les branches qui ne portent pas explicitement des noms de pipelines. Ce pipeline par défaut exécute des étapes qui sont déployées dans les environnements de test et de staging.
pipelines:
default:
- step:
<<: *deploy-test-usw1
deployment: Test us-west-1
- step:
<<: *deploy-staging-use2
deployment: Staging us-east-2
Les déploiements permettent l'intégration entre Jira et Bitbucket.
deployment: Test us-west-1
Vous pouvez définir un ensemble d'étapes qui s'exécutent pour une branche spécifique et nommée sous branches. Le snippet ci-dessous définit un ensemble d'étapes pour la branche 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
Lisez cet article de référence pour en savoir plus à ce sujet.
Faire un push vers une branche de fonctionnalité
Exécutez l'instruction suivante depuis la ligne de commande pour pusher vos changements vers la branche IM-5 de votre dépôt s3_infra. Incluez l'identifiant du ticket Jira dans les messages de commit et les noms des branches pour permettre à l'intégration Jira Bitbucket de suivre l'évolution de votre projet.
git add --all
git commit -m "IM-5 add bitbucket-pipelines.yml"
git push -u origin IM-5
Cliquez sur Pipelines, puis sur IM-5 pour voir le pipeline en cours d'exécution.
Cliquez sur le pipeline lui-même pour voir les informations de l'exécution. Le pipeline a exécuté les étapes pour déployer dans un environnement de test (us-west-1) et un environnement de staging (us-east-2).
Création d'une pull request
Pour créer une pull request, cliquez sur Pull requests, puis sur Create pull request (Créer une pull request).
Choisissez votre branche de fonctionnalité comme branche source, cochez la case Close branch (Fermer la branche), puis cliquez sur Create pull request (Créer une pull request).
Passez en revue les changements de code, puis approuvez et mergez la pull request.
Cliquez sur Merge (Merger) pour ouvrir l'écran Merge pull request (Merger une pull request). Cochez la case Transition issue (Transitionner le ticket) et cliquez sur Merge (Merger).
Cliquez sur Pipelines pour surveiller le pipeline principal.
La branche IM-5 a disparu. La branche principale est abandonnée, et un pipeline s'exécute. Cliquez sur le pipeline.
Le pipeline a exécuté plusieurs étapes pour être déployé dans les environnements de production us-west-2, us-east-1 et ca-central-1. Il est possible de réexécuter un pipeline en cliquant sur le bouton Rerun (Nouvelle exécution) en cas de défaillance d'un pipeline.
Annuler un déploiement erroné
Pour annuler un déploiement, cliquez sur Deployments (Déploiements).
Cliquez sur l'environnement à restaurer pour obtenir la liste des déploiements historiques, choisissez la version que vous souhaitez restaurer, puis cliquez sur Redeploy (Redéployer).
Vérifiez que le changement est correct, puis cliquez sur Redeploy (Redéployer).
Seul l'environnement choisi est redéployé.
Créer un dépôt pour SubmitImage AWS Lambda
Accédez à Jira et créez un ticket Jira pour ajouter un dépôt SubmitImage dans Bitbucket. Notez l'identifiant du ticket Jira. Dans cet exemple : IM-6.
Accédez à Bitbucket et cliquez sur Create (Créer), puis sur Repository (Dépôt).
Sélectionnez l'espace de travail et le projet appropriés. Définissez le nom de la branche par défaut sur Mainline (Principale). Cliquez sur Create repository (Créer un dépôt) pour continuer.
Dans votre terminal, accédez à votre dépôt SubmitImage et exécutez les commandes suivantes pour pusher votre code AWS Lambda vers Bitbucket. Incluez l'identifiant du ticket Jira dans les messages de commit et les noms des branches pour permettre à l'intégration Jira Bitbucket de suivre l'évolution de votre projet.
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
Activer des pipelines
Accédez à Repository settings (Paramètres du dépôt), cliquez sur Settings (Paramètres), puis sur Enable pipelines (Activer des pipelines).
Ajouter des variables de dépôt
Cliquez sur Repository variables (Variables de dépôt) pour ajouter votre identifiant de clé d'accès AWS, votre clé d'accès secrète AWS et votre identifiant de compte AWS. Donnez accès à l'utilisateur IAM associé à la clé d'accès AWS AdministratorAccess. Vous pouvez choisir d'utiliser un contrôle d'accès plus fin en optant pour des politiques d'accès AWS individuelles.
Ajouter des environnements de déploiement
Cliquez sur Deployments (Déploiements), puis sur Add environment (Ajouter un environnement) pour ajouter de nouveaux environnements. Dans cet exemple, nous voyons un environnement de test (us-west-1), un environnement de staging (us-east-2) et trois environnements de production (us-west-2, us-east-1 et ca-central-1).
Créer des clés SSH
Accédez à votre dépôt SubmitImage dans Bitbucket, et cliquez sur Repository settings (Paramètres du dépôt), puis sur SSH keys (Clés SSH) et Generate keys (Générer des clés).
Vous aurez besoin de cette clé SSH lorsque vous créerez le dépôt SystemTests.
Fichier bitbucket-pipelines.yml pour le déploiement sur AWS
Accédez au dépôt SubmitImage de votre terminal, créez une branche portant l'identifiant de votre ticket Jira.
git checkout -b IM-6
Créez un fichier bitbucket-pipelines.yml avec le code yaml suivant. Cela définit un pipeline Bitbucket pour vos environnements de test, de staging et de production. Vous devez mettre à jour la ligne git clone pour que SystemTests devienne votre dépôt 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'exécution des tests d'intégration est commentée pour l'instant. Les tests système ne seront réussis que lorsque l'application complète sera déployée. Supprimez les commentaires pour les étapes des tests d'intégration dans votre dépôt et effectuez un autre push pour exécuter le pipeline de déploiement une fois que tous les composants d'ImageLabeller sont déployés. Vous devez mettre à jour la ligne git clone pour que SystemTests devienne votre dépôt SystemTests.
Comprendre un fichier bitbucket-pipelines.yml
Cette étape exécute des tests unitaires à partir de la base de code SubmitImage.
-step: &rununittests
name: run unit tests
image: golang:buster
script:
- cd submitImage
- go test ./opendevopslambda/...
Cette étape utilise AWS SAM pour déployer votre SubmitImage AWS Lambda sur us-west-2. La documentation relative à ce pipe se trouve ici.
-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'
Cette étape clone le dépôt SystemTests et exécute des tests d'intégration dans us-west-2. Vous devez mettre à jour la ligne git clone pour que SystemTests devienne votre dépôt 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
Faire un push vers une branche de fonctionnalité
À partir de la ligne de commande, exécutez la commande suivante pour pusher votre changement vers la branche IM-8 de votre dépôt SubmitImage.
git add --all
git commit -m "IM-6 add bitbucket-pipelines.yml to SubmitImage"
git push -u origin IM-6
Cliquez sur Pipelines, puis sur IM-6 pour voir le pipeline en cours d'exécution.
Création d'une pull request
Pour créer une pull request, cliquez sur Pull requests, puis sur Create pull request (Créer une pull request). Terminez la pull request, puis cliquez sur Pipelines pour voir le déploiement en production.
Créer un dépôt pour InvokeLabeller AWS Lambda
Accédez à Jira et créez un ticket Jira pour ajouter un dépôt InvokeLabeller dans Bitbucket. Notez l'identifiant du ticket Jira. Dans cet exemple : IM-10.
Accédez à Bitbucket et cliquez sur Create (Créer), puis sur Repository (Dépôt). Sélectionnez l'espace de travail et le projet appropriés. Définissez le nom de la branche par défaut sur Mainline (Principale). Cliquez sur Create repository (Créer un dépôt) pour continuer.
Dans votre terminal, accédez à votre dépôt InvokeLabeller et exécutez les commandes suivantes pour pusher votre code AWS Lambda vers Bitbucket. Incluez l'identifiant du ticket Jira dans les messages de commit et les noms des branches pour permettre à l'intégration Jira Bitbucket de suivre l'évolution de votre projet.
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
Activer des pipelines
Accédez à Repository settings (Paramètres du dépôt), cliquez sur Settings (Paramètres), puis sur Enable pipelines (Activer des pipelines).
Ajouter des variables de dépôt
Cliquez sur Repository variables (Variables de dépôt) pour ajouter votre identifiant de clé d'accès AWS, votre clé d'accès secrète AWS et votre identifiant de compte AWS. Donnez accès à l'utilisateur IAM associé à la clé d'accès AWS AdministratorAccess. Vous pouvez choisir d'utiliser un contrôle d'accès plus fin en optant pour des politiques d'accès AWS individuelles, mais la décision revient au lecteur.
Ajouter des environnements de déploiement
Cliquez sur Deployments (Déploiements), puis sur Add environment (Ajouter un environnement) pour ajouter de nouveaux environnements. Dans cet exemple, nous voyons un environnement de test (us-west-1), un environnement de staging (us-east-2) et trois environnements de production (us-west-2, us-east-1 et ca-central-1).
Créer des clés SSH
Accédez à votre dépôt SubmitImage dans Bitbucket, et cliquez sur Repository settings (Paramètres du dépôt), puis sur SSH keys (Clés SSH) et sur Generate keys (Générer des clés).
Fichier bitbucket-pipelines.yml pour le déploiement sur AWS
Accédez au dépôt InvokeLabeller de votre terminal, créez une branche portant l'identifiant de votre ticket Jira.
git checkout -b IM-10
Créez un fichier bitbucket-pipelines.yml avec le code yaml suivant. Cela définit un pipeline Bitbucket pour vos environnements de test, de staging et de production. Vous devez mettre à jour la ligne git clone pour que SystemTests devienne votre dépôt 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'exécution des tests d'intégration est commentée pour l'instant. Les tests système ne seront réussis que lorsque l'application complète sera déployée. Supprimez les commentaires pour les étapes des tests d'intégration dans votre dépôt et effectuez un autre push pour exécuter le pipeline de déploiement une fois que tous les composants d'ImageLabeller sont déployés. Vous devez mettre à jour la ligne git clone pour que SystemTests devienne votre dépôt SystemTests.
Comprendre un fichier bitbucket-pipelines.yml
Cette étape exécute des tests unitaires à partir de la base de code InvokeLabeller.
-step: &rununittests
name: run unit tests
image: golang:buster
script:
- cd submitImage
- go test ./opendevopslambda/...
Mettre à jour src/application.py avec le point de terminaison AWS SageMaker
Ouvrez le fichier src/application.py d'InvokeLabeller et recherchez query_endpoint. Changez le nom du point de terminaison (endpoint_name) et le nom de la région (region_name) du client pour qu'ils correspondent à votre bloc-notes 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
Faire un push vers une branche de fonctionnalité
À partir de la ligne de commande, exécutez la commande suivante pour pusher votre changement vers la branche IM-10 de votre dépôt InvokeLabeller.
git add --all
git commit -m "IM-10 add bitbucket-pipelines.yml to InvokeLabeller"
git push -u origin IM-10
Cliquez sur Pipelines, puis sur IM-10 pour voir le pipeline en cours d'exécution.
Création d'une pull request
Pour créer une pull request, cliquez sur Pull requests, puis sur Create pull request (Créer une pull request). Terminez la pull request, puis cliquez sur Pipelines pour voir le déploiement en production.
Créer un dépôt pour les tests système
Accédez à Jira et créez un ticket pour ajouter un dépôt SystemTests dans Bitbucket. Notez l'identifiant du ticket. Dans cet exemple : IM-7.
Accédez à Bitbucket et cliquez sur Create (Créer), puis sur Repository (Dépôt).
Sélectionnez l'espace de travail et le projet appropriés. Définissez le nom de la branche par défaut sur Mainline (Principale). Cliquez sur Create repository (Créer un dépôt) pour continuer.
Dans votre terminal, accédez à votre dépôt SystemTests et exécutez les commandes suivantes pour pusher votre code vers 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
Le dépôt SystemTests n'a pas besoin d'un fichier bitbucket-pipelines.yml. Il n'a pas de pipeline propre, puisqu'il permet de tester le fonctionnement d'autres pipelines. Notez l'URL distante de votre dépôt SystemTests. Les pipelines de CI/CD SubmitImage, GetImageLabel et InvokeLabeller cloneront le dépôt SystemTests pendant les étapes de test. Vous devrez mettre à jour le fichier bitbucket-pipelines.yml des dépôts ultérieurs avec la bonne URL.
Ajouter des clés SSH à partir de SubmitImage, GetImageLabel et InvokeLabeller
Cliquez sur Repository settings (Paramètres du dépôt), puis sur Access keys (Clés d'accès).
Cliquez sur Add Key (Ajouter une clé), collez la clé SSH à partir de SubmitImage, GetImageLabel ou InvokeLabeller, puis cliquez sur Add SSH key (Ajouter une clé SSH).
Si vous êtes arrivé jusqu'ici, félicitations ! Vous venez de déployer ImageLabeller. L'étape suivante consiste à configurer la surveillance d'ImageLabeller avec Opsgenie.
Partager cet article
Thème suivant
Lectures recommandées
Ajoutez ces ressources à vos favoris pour en savoir plus sur les types d'équipes DevOps, ou pour les mises à jour continues de DevOps chez Atlassian.