Close

Déployer ImageLabeller avec GitHub

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 GitHub. 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 vous n'avez pas encore d'organisation GitHub, suivez les étapes indiquées dans ce guide GitHub pour en créer une de A à Z.

Dépôts GitHub publics avec code ImageLabeller

https://github.com/AtlassianOpenDevOpsGuides

Vidéo de démo de l'intégration de Jira et GitHub

Intégrer Jira et GitHub

Depuis Jira, cliquez sur Board (Tableau), sur Apps, puis sur GitHub.

Menu déroulant de l'application JSW

Cliquez sur Get it now (Télécharger maintenant).

App GitHub pour JSW

Cliquez sur Apps, puis sur Manage applications (Gérer les applications) et développez GitHub.

Image Gérer les applications JSW

Cliquez sur Get started (Commencer).

Cliquez sur Get started (Commencer).

Image de configuration GitHub

Installer le plug-in Jira dans GitHub

Cliquez sur Install Jira (Installer Jira) pour installer le plug-in Jira dans GitHub. Cette étape est nécessaire si le plug-in Jira n'est pas déjà installé dans GitHub.

Image de connexion d'une organisation GitHub à Jira

Jira va commencer à synchroniser les données depuis GitHub.

Lorsque la synchronisation est terminée, l'état de la synchronisation (Sync Status) passe à COMPLETE (TERMINÉE).

Capture d'écran du changement d'état de la synchronisation

Configurer l'accès SSH

Configurez les clés SSH GitHub pour votre compte en suivant ces instructions. Des documents de référence supplémentaires sont disponibles ici.

Configurer un jeton d'accès personnel

Pour configurer un jeton d'accès personnel, suivez ce guide. Le jeton d'accès personnel est utilisé pour cloner le dépôt SystemTests pendant les étapes des tests d'intégration. Accordez au jeton d'accès personnel l'accès au dépôt et au workflow.

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 le travail de développement au ticket Jira. C'est le principal composant d'intégration entre les deux systèmes.

Accédez à Jira et créez un ticket pour ajouter un dépôt d'infrastructure AWS S3 dans GitHub. Notez l'identifiant du ticket. Dans cet exemple : IM-9.

Infrastructure AWS S3

Accédez à GitHub et cliquez sur New (Nouveau). Choisissez l'organisation appropriée dans Owner (Propriétaire). Cliquez sur Create repository (Créer un dépôt) pour continuer.

Ajouter une clé d'accès AWS à des variables de dépôt

Cliquez sur Settings (Paramètres), puis sur Secrets. Cliquez sur New repository secret (Nouveau secret de dépôt) et ajoutez l'identifiant de la clé d'accès AWS et la clé d'accès secrète 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.

Dans votre terminal, accédez à votre dépôt s3_infra et exécutez les commandes suivantes pour pusher du code vers GitHub.

git add --all
git commit -m "IM-9 add s3_infra repository to github"
git remote add origin git@github.com:PmmQuickStartGuides01/s3_infra.git
git branch -m mainline
git push -u origin mainline

Actions GitHub 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, puis créez un répertoire .github/workflows.

git checkout -b IM-9
mkdir -p .github/workflows && cd .github/workflows

Créez un fichier deploy-test-staging.yml avec le code yaml suivant dans le nouveau répertoire .github/workflows. Cela définit un workflow de déploiement pour vos environnements de test et de staging qui s'exécute lors des pushs vers des branches autres que la branche principale.

name: deploy-s3-infra-test-staging
on:
  push:
    branches:
      - '*'
      - '!mainline'

jobs:
  deploy-us-west-1:
    runs-on: ubuntu-latest
    outputs:
      env-name: ${{ steps.env-name.outputs.environment }}
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Configure AWS credentials
        id: creds
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: "us-west-1"
      - name: Deploy to AWS CloudFormation
        uses: aws-actions/aws-cloudformation-github-deploy@v1
        with:
          name: OpenDevOpsS3Infra
          template: template.yml
          no-fail-on-empty-changeset: "1"

  deploy-us-east-2:
    runs-on: ubuntu-latest
    needs: deploy-us-west-1
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Configure AWS credentials
        id: creds
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: "us-east-2"
      - name: Deploy to AWS CloudFormation
        uses: aws-actions/aws-cloudformation-github-deploy@v1
        with:
          name: OpenDevOpsS3Infra
          template: template.yml
          no-fail-on-empty-changeset: "1"

Ensuite, créez un fichier deploy-prod.yml avec le code yaml suivant. Cela définit un workflow de déploiement pour vos environnements de production qui s'exécute lorsqu'une pull request merge des changements dans la branche principale.

name: deploy-s3-infra-prod
on:
  pull_request:
    branches:
      - mainline

jobs:
  deploy-us-west-2:
    runs-on: ubuntu-latest
    outputs:
      env-name: ${{ steps.env-name.outputs.environment }}
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Configure AWS credentials
        id: creds
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: "us-west-2"
      - name: Deploy to AWS CloudFormation
        uses: aws-actions/aws-cloudformation-github-deploy@v1
        with:
          name: OpenDevOpsS3Infra
          template: template.yml
          no-fail-on-empty-changeset: "1"

  deploy-ca-central-1:
    runs-on: ubuntu-latest
    needs: deploy-us-west-2
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Configure AWS credentials
        id: creds
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: "ca-central-1"
      - name: Deploy to AWS CloudFormation
        uses: aws-actions/aws-cloudformation-github-deploy@v1
        with:
          name: OpenDevOpsS3Infra
          template: template.yml
          no-fail-on-empty-changeset: "1"

  deploy-us-east-1:
    runs-on: ubuntu-latest
    needs: deploy-ca-central-1
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Configure AWS credentials
        id: creds
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: "us-east-1"
      - name: Deploy to AWS CloudFormation
        uses: aws-actions/aws-cloudformation-github-deploy@v1
        with:
          name: OpenDevOpsS3Infra
          template: template.yml
          no-fail-on-empty-changeset: "1"

Comprendre les actions GitHub

Déclencheurs

Déclarez les événements qui déclenchent le workflow en haut de ces fichiers. Dans le fichier deploy-test-staging.yml, l'événement est envoyé à toutes les branches sauf à la branche principale.

name: deploy-s3-infra-test-staging
on:
  push:
    branches:
      - '*'
      - '!mainline'

De nombreux événements peuvent déclencher des workflows. Pour plus d'informations, veuillez consulter la documentation ici.

Emplois

Un workflow contient de nombreuses tâches qui s'exécutent lorsque l'événement déclencheur se produit. Chaque tâche comporte une série d'étapes qui s'exécutent lorsqu'elle est lancée. Dans cet exemple, vous voyez une étape pour extraire le code du dépôt, une étape pour configurer les identifiants AWS et une étape pour le déploiement sur AWS à l'aide d'AWS CloudFormation.

jobs:
  deploy-us-west-1:
    runs-on: ubuntu-latest
    outputs:
      env-name: ${{ steps.env-name.outputs.environment }}
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Configure AWS credentials
        id: creds
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: "us-west-1"
      - name: Deploy to AWS CloudFormation
        uses: aws-actions/aws-cloudformation-github-deploy@v1
        with:
          name: OpenDevOpsS3Infra
          template: template.yml
          no-fail-on-empty-changeset: "1"

Pour en savoir plus sur les tâches, cliquez ici et sur les étapes à suivre, ici.

Appliquer l'ordre en fonction des besoins

Vous pouvez spécifier un ordre pour vos tâches en fonctions des besoins. Par défaut, GitHub exécute toutes les étapes en parallèle. Utilisez des besoins pour créer des dépendances entre les étapes.

deploy-us-east-1:
    runs-on: ubuntu-latest
    needs: deploy-ca-central-1
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Configure AWS credentials
        id: creds
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: "us-east-1"
      - name: Deploy to AWS CloudFormation
        uses: aws-actions/aws-cloudformation-github-deploy@v1
        with:
          name: OpenDevOpsS3Infra
          template: template.yml
          no-fail-on-empty-changeset: "1"

Faire un push vers une branche de fonctionnalité

À partir de la ligne de commande, exécutez la commande suivante pour pusher votre code vers la branche IM-9 de votre dépôt s3_infra.

git add --all
git commit -m "IM-9 add GitHub actions to s3_infra"
git push -u origin IM-9

Cliquez sur Actions pour voir les workflows en cours d'exécution.

Image montrant des workflows en cours d'exécution

Créer une pull request

Cliquez sur Pull requests puis sur Create pull request (Créer une pull request).

Image montrant la comparaison de changements

Choisissez votre branche de fonctionnalité comme branche source, puis cliquez sur Create pull request (Créer une pull request).

Image montrant la création de pull request

Passez en revue les changements de code, puis cliquez sur Merge pull request (Merger une pull request) pour accepter les changements.

Cliquez sur Actions pour vérifier que le déploiement en production a démarré. GitHub exécute les tâches dans le fichier deploy-prod.yml, car la branche est principale.

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 AWS Lambda dans GitHub. Notez l'identifiant du ticket Jira. Dans cet exemple : IM-8.

Image du tableau IM

Accédez à GitHub et cliquez sur New (Nouveau). Choisissez l'organisation appropriée dans Owner (Propriétaire). Cliquez sur Create repository (Créer un dépôt) pour continuer.

Cliquez sur Settings (Paramètres), puis sur Secrets. Ajoutez votre jeton d'accès personnel dans ACCESS_KEY, votre identifiant de clé d'accès AWS sous AWS_ACCESS_KEY_ID, votre clé d'accès secrète AWS sous AWS_SECRET_ACCESS_KEY et votre identifiant de compte AWS sous AWS_ACCOUNT_ID.

Dans votre terminal, accédez à votre dépôt SubmitImage et exécutez les commandes suivantes pour pusher votre code vers GitHub.

git add --all
git commit -m "IM-8 add SubmitImage to github"
git remote add origin git@github.com:PmmQuickStartGuides01/submitImage.git
git branch -m mainline
git push -u origin mainline
Actions GitHub 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, puis créez un répertoire .github/workflows.

git checkout -b IM-8
mkdir -p .github/workflows && cd .github/workflows

Créez un fichier deploy-test-staging.yml avec le code yaml suivant dans le nouveau répertoire .github/workflows. Cela définit un workflow de déploiement pour vos environnements de test et de staging qui s'exécute lors des pushs vers des branches autres que la branche principale. Vous devez mettre à jour la ligne git clone pour que SystemTests devienne votre dépôt SystemTests.

name: deploy-submit-image-test-staging
on:
  push:
    branches:
      - '*'
      - '!mainline'

env:
  aws_account_id: ${{secrets.AWS_ACCOUNT_ID}}

jobs:
  run-unit-tests:
    runs-on: ubuntu-latest
    steps:
      - name: Install Go
        uses: actions/setup-go@v2
        with:
          go-version: 1.16.x
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Test
        run: |
          cd ${{ github.workspace }}/submitImage
          ls
          go test ./opendevopslambda...

  deploy-us-west-1:
    runs-on: ubuntu-latest
    needs: run-unit-tests
    outputs:
      env-name: ${{ steps.env-name.outputs.environment }}
    steps:
      - name: Install Go
        uses: actions/setup-go@v2
        with:
          go-version: 1.16.x
      - uses: actions/checkout@v2
      - name: Configure AWS credentials
        id: creds
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: "us-west-1"
      - name: SAM Validate
        run: |
          sam --version
          sam validate
      - name: SAM Build
        run: |
          sam build
      - name: SAM Deploy
        continue-on-error: true
        run: |
          sam deploy --template-file .aws-sam/build/template.yaml \
            --stack-name "OpenDevOpsSubmitImage" \
            --s3-bucket "open-devops-code-us-west-1-${aws_account_id}" \
            --capabilities CAPABILITY_IAM CAPABILITY_NAMED_IAM

            #  integration-test-us-west-1:
            #    runs-on: ubuntu-latest
            #    needs: deploy-us-west-1
            #    steps:
            #      - name: Pull systemTests repo
            #        uses: actions/checkout@master
            #        with:
            #          repository: PmmQuickStartGuides01/systemTests
            #          token: ${{ secrets.ACCESS_KEY }}
            #      - name: Configure AWS credentials
            #        id: creds
            #        uses: aws-actions/configure-aws-credentials@v1
            #        with:
            #          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
            #          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
            #          aws-region: "us-west-1"
            #      - name: Install Go
            #        uses: actions/setup-go@v2
            #        with:
            #          go-version: 1.16.x
            #      - name: Run integration tests
            #        run: go test -v ./... -aws_region=us-west-1

  deploy-us-east-2:
    runs-on: ubuntu-latest
    needs: deploy-us-west-1
    outputs:
      env-name: ${{ steps.env-name.outputs.environment }}
    steps:
      - name: Install Go
        uses: actions/setup-go@v2
        with:
          go-version: 1.16.x
      - uses: actions/checkout@v2
      - name: Configure AWS credentials
        id: creds
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: "us-east-2"
      - name: SAM Validate
        run: |
          sam --version
          sam validate
      - name: SAM Build
        run: |
          sam build
      - name: SAM Deploy
        continue-on-error: true
        run: |
          sam deploy --template-file .aws-sam/build/template.yaml \
            --stack-name "OpenDevOpsSubmitImage" \
            --s3-bucket "open-devops-code-us-east-2-${aws_account_id}" \
            --capabilities CAPABILITY_IAM CAPABILITY_NAMED_IAM

            #  integration-test-us-east-2:
            #    runs-on: ubuntu-latest
            #    needs: deploy-us-east-2
            #    steps:
            #      - name: Pull systemTests repo
            #        uses: actions/checkout@master
            #        with:
            #          repository: PmmQuickStartGuides01/systemTests
            #          token: ${{ secrets.ACCESS_KEY }}
            #      - name: Configure AWS credentials
            #        id: creds
            #        uses: aws-actions/configure-aws-credentials@v1
            #        with:
            #          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
            #          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
            #          aws-region: "us-east-2"
            #      - name: Install Go
            #        uses: actions/setup-go@v2
            #        with:
            #          go-version: 1.16.x
            #      - name: Run integration tests
            #        run: go test -v ./... -aws_region=us-east-2

Ensuite, créez un fichier deploy-prod.yml avec le code yaml suivant. Cela définit un workflow de déploiement pour vos environnements de production qui s'exécute lorsqu'une pull request merge des changements dans la branche principale.

name: deploy-submit-image-prod
on:
  pull_request:
    branches:
      - mainline

env:
  aws_account_id: ${{secrets.AWS_ACCOUNT_ID}}

jobs:
  deploy-us-west-2:
    runs-on: ubuntu-latest
    outputs:
      env-name: ${{ steps.env-name.outputs.environment }}
    steps:
      - name: Install Go
        uses: actions/setup-go@v2
        with:
          go-version: 1.16.x
      - uses: actions/checkout@v2
      - name: Configure AWS credentials
        id: creds
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: "us-west-2"
      - name: SAM Validate
        run: |
          sam --version
          sam validate
      - name: SAM Build
        run: |
          sam build
      - name: SAM Deploy
        continue-on-error: true
        run: |
          sam deploy --template-file .aws-sam/build/template.yaml \
            --stack-name "OpenDevOpsSubmitImage" \
            --s3-bucket "open-devops-code-us-west-2-${aws_account_id}" \
            --capabilities CAPABILITY_IAM CAPABILITY_NAMED_IAM

            #  integration-test-us-west-2:
            #    runs-on: ubuntu-latest
            #    needs: deploy-us-west-2
            #    steps:
            #      - name: Pull systemTests repo
            #        uses: actions/checkout@master
            #        with:
            #          repository: PmmQuickStartGuides01/systemTests
            #          token: ${{ secrets.ACCESS_KEY }}
            #      - name: Configure AWS credentials
            #        id: creds
            #        uses: aws-actions/configure-aws-credentials@v1
            #        with:
            #          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
            #          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
            #          aws-region: "us-west-2"
            #      - name: Install Go
            #        uses: actions/setup-go@v2
            #        with:
            #          go-version: 1.16.x
            #      - name: Run integration tests
            #        run: go test -v ./... -aws_region=us-west-2

  deploy-us-east-1:
    runs-on: ubuntu-latest
    needs: deploy-us-west-2
    outputs:
      env-name: ${{ steps.env-name.outputs.environment }}
    steps:
      - name: Install Go
        uses: actions/setup-go@v2
        with:
          go-version: 1.16.x
      - uses: actions/checkout@v2
      - name: Configure AWS credentials
        id: creds
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: "us-east-1"
      - name: SAM Validate
        run: |
          sam --version
          sam validate
      - name: SAM Build
        run: |
          sam build
      - name: SAM Deploy
        continue-on-error: true
        run: |
          sam deploy --template-file .aws-sam/build/template.yaml \
            --stack-name "OpenDevOpsSubmitImage" \
            --s3-bucket "open-devops-code-us-east-1-${aws_account_id}" \
            --capabilities CAPABILITY_IAM CAPABILITY_NAMED_IAM

            #  integration-test-us-east-1:
            #    runs-on: ubuntu-latest
            #    needs: deploy-us-east-1
            #    steps:
            #      - name: Pull systemTests repo
            #        uses: actions/checkout@master
            #        with:
            #          repository: PmmQuickStartGuides01/systemTests
            #          token: ${{ secrets.ACCESS_KEY }}
            #      - name: Configure AWS credentials
            #        id: creds
            #        uses: aws-actions/configure-aws-credentials@v1
            #        with:
            #          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
            #          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
            #          aws-region: "us-east-1"
            #      - name: Install Go
            #        uses: actions/setup-go@v2
            #        with:
            #          go-version: 1.16.x
            #      - name: Run integration tests
            #        run: go test -v ./... -aws_region=us-east-1

  deploy-ca-central-1:
    runs-on: ubuntu-latest
    needs: deploy-us-east-1
    outputs:
      env-name: ${{ steps.env-name.outputs.environment }}
    steps:
      - name: Install Go
        uses: actions/setup-go@v2
        with:
          go-version: 1.16.x
      - uses: actions/checkout@v2
      - name: Configure AWS credentials
        id: creds
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: "ca-central-1"
      - name: SAM Validate
        run: |
          sam --version
          sam validate
      - name: SAM Build
        run: |
          sam build
      - name: SAM Deploy
        continue-on-error: true

        run: |
          sam deploy --template-file .aws-sam/build/template.yaml \
            --stack-name "OpenDevOpsSubmitImage" \
            --s3-bucket "open-devops-code-ca-central-1-${aws_account_id}" \
            --capabilities CAPABILITY_IAM CAPABILITY_NAMED_IAM

            #  integration-test-ca-central-1:
            #    runs-on: ubuntu-latest
            #    needs: deploy-ca-central-1
            #    steps:
            #      - name: Pull systemTests repo
            #        uses: actions/checkout@master
            #        with:
            #          repository: PmmQuickStartGuides01/systemTests
            #          token: ${{ secrets.ACCESS_KEY }}
            #      - name: Configure AWS credentials
            #        id: creds
            #        uses: aws-actions/configure-aws-credentials@v1
            #        with:
            #          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
            #          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
            #          aws-region: "ca-central-1"
            #      - name: Install Go
            #        uses: actions/setup-go@v2
            #        with:
            #          go-version: 1.16.x
            #      - name: Run integration tests
            #        run: go test -v ./... -aws_region=ca-central-1

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. Mettez à jour la section « needs » (besoins) pour exécuter les étapes dans l'ordre. Vous devez mettre à jour la ligne git clone pour que SystemTests devienne votre dépôt SystemTests.

needs: deploy-us-east-1
Comprendre les actions GitHub

Cette tâche utilise AWS SAM pour déployer votre SubmitImage AWS Lambda sur us-west-2.

deploy-us-west-2:
    runs-on: ubuntu-latest
    outputs:
      env-name: ${{ steps.env-name.outputs.environment }}
    steps:
      - name: Install Go
        uses: actions/setup-go@v2
        with:
          go-version: 1.16.x
      - uses: actions/checkout@v2
      - name: Configure AWS credentials
        id: creds
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: "us-west-2"
      - name: SAM Validate
        run: |
          sam --version
          sam validate
      - name: SAM Build
        run: |
          sam build
      - name: SAM Deploy
        continue-on-error: true
        run: |
          sam deploy --template-file .aws-sam/build/template.yaml \
            --stack-name "OpenDevOpsSubmitImage" \
            --s3-bucket "open-devops-code-us-west-2-${aws_account_id}" \
            --capabilities CAPABILITY_IAM CAPABILITY_NAMED_IAM

Cette tâche clone le dépôt SystemTests et exécute des tests d'intégration dans us-west-2.

integration-test-us-west-2:
    runs-on: ubuntu-latest
    needs: deploy-us-west-2
    steps:
      - name: Pull systemTests repo
        uses: actions/checkout@master
        with:
          repository: PmmQuickStartGuides01/systemTests
          token: ${{ secrets.ACCESS_KEY }}
      - name: Configure AWS credentials
        id: creds
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: "us-west-2"
      - name: Install Go
        uses: actions/setup-go@v2
        with:
          go-version: 1.16.x
      - name: Run integration tests
        run: go test -v ./... -aws_region=us-west-2

Cette étape utilise le jeton d'accès personnel pour cloner le dépôt SystemTests.

    - name: Pull systemTests repo
        uses: actions/checkout@master
        with:
          repository: PmmQuickStartGuides01/systemTests
          token: ${{ secrets.ACCESS_KEY }}
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-8 de votre dépôt SubmitImage. Incluez l'identifiant du ticket Jira dans les messages de commit et les noms des branches pour permettre à l'intégration Jira GitHub de suivre l'évolution de votre projet.

git add --all
git commit -m "IM-8 add github actions to SubmitImage"
git push -u origin IM-8

Cliquez sur Actions pour voir les workflows en cours d'exécution.

Notez que la tâche de test unitaire a réussi et que le déploiement vers Test us-west-1 a démarré.

Les tests système définis précédemment sont exécutés dans le cadre des tâches integration-test-us-west-1 et integration-test-us-east-2.

Création d'une pull request

Pour créer une pull request, cliquez sur Pull requests, puis sur New pull request (Nouvelle pull request).

Choisissez l'option permettant de merger à partir de votre branche de fonctionnalité.

Cliquez sur Create pull request (Créer une pull request).

Mergez la pull request, puis supprimez la branche de fonctionnalité. Cliquez sur Actions pour surveiller 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 AWS Lambda dans GitHub. Notez l'identifiant du ticket Jira. Dans cet exemple : IM-11.

Accédez à GitHub et cliquez sur New (Nouveau). Choisissez l'organisation appropriée dans Owner (Propriétaire). Cliquez sur Create repository (Créer un dépôt) pour continuer.

Cliquez sur Settings (Paramètres), puis sur Secrets. Ajoutez votre jeton d'accès personnel dans ACCESS_KEY, votre identifiant de clé d'accès AWS sous AWS_ACCESS_KEY_ID, votre clé d'accès secrète AWS sous AWS_SECRET_ACCESS_KEY et votre identifiant de compte AWS sous AWS_ACCOUNT_ID.

Dans votre terminal, accédez à votre dépôt InvokeLabeller et exécutez les commandes suivantes pour pusher votre code vers GitHub.

git add --all
git commit -m "IM-11 add InvokeLabeller to github"
git remote add origin git@github.com:PmmQuickStartGuides01/InvokeLabeller.git
git branch -m mainline
git push -u origin mainline
Actions GitHub 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, puis créez un répertoire .github/workflows.

git checkout -b IM-11
mkdir -p .github/workflows && cd .github/workflows

Créez un fichier deploy-test-staging.yml avec le code yaml suivant dans le nouveau répertoire .github/workflows. Cela définit un workflow de déploiement pour vos environnements de test et de staging qui s'exécute lors des pushs vers des branches autres que la branche principale. Vous devez mettre à jour la ligne git clone pour que SystemTests devienne votre dépôt SystemTests.

name: deploy-invoke-labeller-test-staging
on:
  push:
    branches:
      - '*'
      - '!mainline'

env:
  aws_account_id: ${{secrets.AWS_ACCOUNT_ID}}

jobs:
  run-unit-tests:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      - uses: actions/setup-python@v2
        with:
          python-version: '3.x'
      - name: Test
        run: |
          pip3 install pytest
          pip3 install moto
          pip3 install -r tst/requirements.txt --user
          python3 -m pytest -v tst/unit --junitxml=test-reports/report.xml

  deploy-us-west-1:
    runs-on: ubuntu-latest
    needs: run-unit-tests
    outputs:
      env-name: ${{ steps.env-name.outputs.environment }}
    steps:
      - name: Install Go
        uses: actions/setup-go@v2
        with:
          go-version: 1.16.x
      - uses: actions/checkout@v2
      - name: Configure AWS credentials
        id: creds
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: "us-west-1"
      - name: SAM Validate
        run: |
          sam --version
          sam validate
      - name: SAM Build
        run: |
          sam build
      - name: SAM Deploy
        continue-on-error: true
        run: |
          sam deploy --template-file .aws-sam/build/template.yaml \
            --stack-name "OpenDevOpsImageLabeller" \
            --s3-bucket "open-devops-code-us-west-1-${aws_account_id}" \
            --capabilities CAPABILITY_IAM CAPABILITY_NAMED_IAM

            #  integration-test-us-west-1:
            #    runs-on: ubuntu-latest
            #    needs: deploy-us-west-1
            #    steps:
            #      - name: Pull systemTests repo
            #        uses: actions/checkout@master
            #        with:
            #          repository: PmmQuickStartGuides01/systemTests
            #          token: ${{ secrets.ACCESS_KEY }}
            #      - name: Configure AWS credentials
            #        id: creds
            #        uses: aws-actions/configure-aws-credentials@v1
            #        with:
            #          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
            #          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
            #          aws-region: "us-west-1"
            #      - name: Install Go
            #        uses: actions/setup-go@v2
            #        with:
            #          go-version: 1.16.x
            #      - name: Run integration tests
            #        run: go test -v ./... -aws_region=us-west-1

  deploy-us-east-2:
    runs-on: ubuntu-latest
    needs: deploy-us-west-1
    outputs:
      env-name: ${{ steps.env-name.outputs.environment }}
    steps:
      - name: Install Go
        uses: actions/setup-go@v2
        with:
          go-version: 1.16.x
      - uses: actions/checkout@v2
      - name: Configure AWS credentials
        id: creds
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: "us-east-2"
      - name: SAM Validate
        run: |
          sam --version
          sam validate
      - name: SAM Build
        run: |
          sam build
      - name: SAM Deploy
        continue-on-error: true
        run: |
          sam deploy --template-file .aws-sam/build/template.yaml \
            --stack-name "OpenDevOpsImageLabeller" \
            --s3-bucket "open-devops-code-us-east-2-${aws_account_id}" \
            --capabilities CAPABILITY_IAM CAPABILITY_NAMED_IAM

            #  integration-test-us-east-2:
            #    runs-on: ubuntu-latest
            #    needs: deploy-us-east-2
            #    steps:
            #      - name: Pull systemTests repo
            #        uses: actions/checkout@master
            #        with:
            #          repository: PmmQuickStartGuides01/systemTests
            #          token: ${{ secrets.ACCESS_KEY }}
            #      - name: Configure AWS credentials
            #        id: creds
            #        uses: aws-actions/configure-aws-credentials@v1
            #        with:
            #          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
            #          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
            #          aws-region: "us-east-2"
            #      - name: Install Go
            #        uses: actions/setup-go@v2
            #        with:
            #          go-version: 1.16.x
            #      - name: Run integration tests
            #        run: go test -v ./... -aws_region=us-east-2

Ensuite, créez un fichier deploy-prod.yml avec le code yaml suivant. Cela définit un workflow de déploiement pour vos environnements de production qui s'exécute lorsqu'une pull request merge des changements dans la branche principale.

name: deploy-invoke-labeller-prod
on:
  pull_request:
    branches:
      - mainline

env:
  aws_account_id: ${{secrets.AWS_ACCOUNT_ID}}

jobs:
  deploy-us-west-2:
    runs-on: ubuntu-latest
    outputs:
      env-name: ${{ steps.env-name.outputs.environment }}
    steps:
      - name: Install Go
        uses: actions/setup-go@v2
        with:
          go-version: 1.16.x
      - uses: actions/checkout@v2
      - name: Configure AWS credentials
        id: creds
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: "us-west-2"
      - name: SAM Validate
        run: |
          sam --version
          sam validate
      - name: SAM Build
        run: |
          sam build
      - name: SAM Deploy
        continue-on-error: true
        run: |
          sam deploy --template-file .aws-sam/build/template.yaml \
            --stack-name "OpenDevOpsImageLabeller" \
            --s3-bucket "open-devops-code-us-west-2-${aws_account_id}" \
            --capabilities CAPABILITY_IAM CAPABILITY_NAMED_IAM

            #  integration-test-us-west-2:
            #    runs-on: ubuntu-latest
            #    needs: deploy-us-west-2
            #    steps:
            #      - name: Pull systemTests repo
            #        uses: actions/checkout@master
            #        with:
            #          repository: PmmQuickStartGuides01/systemTests
            #          token: ${{ secrets.ACCESS_KEY }}
            #      - name: Configure AWS credentials
            #        id: creds
            #        uses: aws-actions/configure-aws-credentials@v1
            #        with:
            #          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
            #          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
            #          aws-region: "us-west-2"
            #      - name: Install Go
            #        uses: actions/setup-go@v2
            #        with:
            #          go-version: 1.16.x
            #      - name: Run integration tests
            #        run: go test -v ./... -aws_region=us-west-2

  deploy-us-east-1:
    runs-on: ubuntu-latest
    needs: deploy-us-west-2
    outputs:
      env-name: ${{ steps.env-name.outputs.environment }}
    steps:
      - name: Install Go
        uses: actions/setup-go@v2
        with:
          go-version: 1.16.x
      - uses: actions/checkout@v2
      - name: Configure AWS credentials
        id: creds
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: "us-east-1"
      - name: SAM Validate
        run: |
          sam --version
          sam validate
      - name: SAM Build
        run: |
          sam build
      - name: SAM Deploy
        continue-on-error: true
        run: |
          sam deploy --template-file .aws-sam/build/template.yaml \
            --stack-name "OpenDevOpsImageLabeller" \
            --s3-bucket "open-devops-code-us-east-1-${aws_account_id}" \
            --capabilities CAPABILITY_IAM CAPABILITY_NAMED_IAM

            #  integration-test-us-east-1:
            #    runs-on: ubuntu-latest
            #    needs: deploy-us-east-1
            #    steps:
            #      - name: Pull systemTests repo
            #        uses: actions/checkout@master
            #        with:
            #          repository: PmmQuickStartGuides01/systemTests
            #          token: ${{ secrets.ACCESS_KEY }}
            #      - name: Configure AWS credentials
            #        id: creds
            #        uses: aws-actions/configure-aws-credentials@v1
            #        with:
            #          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
            #          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
            #          aws-region: "us-east-1"
            #      - name: Install Go
            #        uses: actions/setup-go@v2
            #        with:
            #          go-version: 1.16.x
            #      - name: Run integration tests
            #        run: go test -v ./... -aws_region=us-east-1

  deploy-ca-central-1:
    runs-on: ubuntu-latest
    needs: deploy-us-east-1
    outputs:
      env-name: ${{ steps.env-name.outputs.environment }}
    steps:
      - name: Install Go
        uses: actions/setup-go@v2
        with:
          go-version: 1.16.x
      - uses: actions/checkout@v2
      - name: Configure AWS credentials
        id: creds
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: "ca-central-1"
      - name: SAM Validate
        run: |
          sam --version
          sam validate
      - name: SAM Build
        run: |
          sam build
      - name: SAM Deploy
        continue-on-error: true

        run: |
          sam deploy --template-file .aws-sam/build/template.yaml \
            --stack-name "OpenDevOpsImageLabeller" \
            --s3-bucket "open-devops-code-ca-central-1-${aws_account_id}" \
            --capabilities CAPABILITY_IAM CAPABILITY_NAMED_IAM

            #  integration-test-ca-central-1:
            #    runs-on: ubuntu-latest
            #    needs: deploy-ca-central-1
            #    steps:
            #      - name: Pull systemTests repo
            #        uses: actions/checkout@master
            #        with:
            #          repository: PmmQuickStartGuides01/systemTests
            #          token: ${{ secrets.ACCESS_KEY }}
            #      - name: Configure AWS credentials
            #        id: creds
            #        uses: aws-actions/configure-aws-credentials@v1
            #        with:
            #          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
            #          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
            #          aws-region: "ca-central-1"
            #      - name: Install Go
            #        uses: actions/setup-go@v2
            #        with:
            #          go-version: 1.16.x
            #      - name: Run integration tests
            #        run: go test -v ./... -aws_region=ca-central-1

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. Mettez à jour la section « needs » (besoins) pour exécuter les étapes dans l'ordre. Vous devez mettre à jour la ligne git clone pour que SystemTests devienne votre dépôt SystemTests.

needs: deploy-us-east-1
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é

Exécutez l'instruction suivante depuis la ligne de commande pour pusher vos changements vers la branche IM-11 de votre dépôt InvokeLabeller. Incluez l'identifiant du ticket Jira dans les messages de commit et les noms des branches pour permettre à l'intégration Jira GitHub de suivre l'évolution de votre projet.

git add --all
git commit -m "IM-11 add github actions to InvokeLabeller"
git push -u origin IM-11

Cliquez sur Actions pour voir les workflows en cours d'exécution. Les tests système définis précédemment sont exécutés dans le cadre des tâches integration-test-us-west-1 et integration-test-us-east-2.

Création d'une pull request

Pour créer une pull request, cliquez sur Pull requests, puis sur New pull request (Nouvelle pull request). Choisissez l'option permettant de merger à partir de votre branche de fonctionnalité.

Cliquez sur Actions pour surveiller le déploiement en production.

Créer un dépôt pour SystemTests

Accédez à Jira et créez un ticket Jira pour ajouter un dépôt SystemTests dans GitHub. Notez l'identifiant du ticket Jira. Dans cet exemple : IM-7.

Accédez à GitHub et cliquez sur New (Nouveau). Choisissez l'organisation appropriée dans Owner (Propriétaire). 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 GitHub.

git add --all
git commit -m "IM-7 add SystemTests repository to GitHub"
git remote add origin git@github.com:PmmQuickStartGuides01/systemTests.git
git branch -M mainline
git push -u origin mainline

Le dépôt SystemTests n'a pas besoin d'actions GitHub. Il n'a pas de pipeline propre, puisqu'il permet de tester le fonctionnement d'autres pipelines. Vous pouvez supprimer les commentaires pour les étapes de test d'intégration des fichiers du workflow de CI/CD, mais aussi commiter et pusher ces étapes une fois que tous les composants de l'application ImageLabeller sont déployés. Les tests ne seront réussis que si tous les composants de l'application fonctionnent correctement.

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 gitlab-ci.yml des dépôts ultérieurs avec la bonne URL.

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