Close

Déployer ImageLabeller avec Bitbucket

Portrait de Warren Marusiak
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

https://github.com/AtlassianOpenDevOpsGuides

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.

Capture d'écran montrant un ticket Jira pour ajouter un dépôt d'infrastructure AWS S3 dans Bitbucket

Accédez à Bitbucket > Create > Repository (Créer > Dépôt).

Création d'un dépôt dans Bitbucket

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.

Fenêtre contextuelle pour créer un dépôt dans Bitbucket

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).

Activation de pipelines dans Bitbucket

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).

Variables de dépôt dans Bitbucket

Configurer des environnements de déploiement

Cliquez sur Deployments (Déploiements).

Écran des paramètres de déploiement dans Bitbucket

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).

Ajout d'environnements de déploiement dans Bitbucket

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.

Gestion d'un pipeline dans Bitbucket

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).

Informations d'exécution de pipeline dans Bitbucket

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).

Création d'une pull request dans Bitbucket

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).

Création d'une fenêtre modale de pull request dans Bitbucket

Passez en revue les changements de code, puis approuvez et mergez la pull request.

Approuver et merger une pull request dans Bitbucket

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).

Case « Transition issue » (Transitionner le ticket) cochée lors du merge d'une pull request dans Bitbucket

Cliquez sur Pipelines pour surveiller le pipeline principal.

Surveillance du pipeline principal dans Bitbucket

La branche IM-5 a disparu. La branche principale est abandonnée, et un pipeline s'exécute. Cliquez sur le pipeline.

Écran du pipeline de la branche principale dans Bitbucket

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).

Écran des déploiements dans Bitbucket

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).

Sélection d'un environnement, puis de la version à restaurer dans Bitbucket

Vérifiez que le changement est correct, puis cliquez sur Redeploy (Redéployer).

Vérifiez que vos changements sont corrects avant de sélectionner « Redeploy » (Redéployer) dans Bitbucket

Seul l'environnement choisi est redéployé.

La fenêtre modale du pipeline dans Bitbucket montre uniquement l'environnement choisi en cours de redéploiement

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.

Création d'un ticket dans Jira Software pour ajouter un dépôt SubmitImage dans Bitbucket

Accédez à Bitbucket et cliquez sur Create (Créer), puis sur Repository (Dépôt).

Création d'un dépôt dans Bitbucket

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.

Fenêtre modale contextuelle lors de la création d'un dépôt dans Bitbucket

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).

Activation de pipelines dans les paramètres des pipelines de Bitbucket

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.

Activation de pipelines dans les paramètres des pipelines de Bitbucket

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).

Environnements de déploiement dans Bitbucket

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).

Génération de clés SSH dans Bitbucket

Vous aurez besoin de cette clé SSH lorsque vous créerez le dépôt SystemTests.

Informations sur les clés SSH dans Bitbucket

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.

Capture d'écran de pipelines Bitbucket Cloud

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.

Pipeline de déploiement en production dans Bitbucket Cloud

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.

Capture d'écran montrant des tickets Jira sur un tableau Jira

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.

Créer un dépôt InvokeLabeller dans Bitbucket

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).

Activation de pipelines dans les paramètres de Bitbucket

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.

Ajout de variables de dépôt dans Bitbucket

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).

Environnements de déploiement dans Bitbucket

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).

Informations sur les clés SSH dans Bitbucket Cloud

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.

Exécution de pipelines dans Bitbucket Cloud

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.

Affichage du déploiement en production dans Bitbucket Pipelines

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.

Affichage d'un ticket Jira récemment créé sur un tableau Jira

Accédez à Bitbucket et cliquez sur Create (Créer), puis sur Repository (Dépôt).

Création d'un dépôt dans Bitbucket

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.

Saisie d'informations lors de la création d'un dépôt dans Bitbucket

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).

Page des paramètres des clés d'accès dans Bitbucket

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).

Ajout d'une clé SSH dans Bitbucket

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.

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.


Partager cet article

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.

Illustration DevOps

Communauté DevOps

Illustration DevOps

Parcours de formation DevOps

Illustration d'une carte

Essayez la solution gratuitement

Inscrivez-vous à notre newsletter DevOps

Thank you for signing up