Close

Distribuzione di ImageLabeller con GitHub

Primo piano di Warren Marusiak
Warren Marusiak

Senior Technical Evangelist

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

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

Prerequisiti

Se non hai già un'organizzazione GitHub, segui i passaggi di questa guida GitHub per crearne una da zero.

Repository GitHub pubblici con codice ImageLabeller

https://github.com/AtlassianOpenDevOpsGuides

Video demo dell'integrazione con Jira GitHub

Integrazione tra Jira e GitHub

Da Jira clicca su Board, quindi su App e infine su GitHub.

Menu a discesa dell'app JSW

Clicca su Get it now (Installa ora).

App Jira Software GitHub

Clicca su App, quindi su Gestisci le app ed espandi GitHub.

Immagine della gestione delle app in JSW

Clicca su Get started (Inizia).

Clicca su Get started (Inizia).

Immagine della configurazione di GitHub

Installazione del plug-in Jira in GitHub

Clicca su Install Jira (Installa Jira) per installare il plug-in Jira su GitHub. Questo passaggio è necessario se il plug-in Jira non è già installato in GitHub.

Immagine della connessione dell'organizzazione GitHub a Jira

Jira inizierà a sincronizzare i dati da GitHub.

Al termine della sincronizzazione, in Sync Status (Stato sincronizzazione) viene visualizzato COMPLETE (COMPLETO).

Screenshot della modifica della sincronizzazione dello stato

Configurazione dell'accesso SSH

Configura le chiavi SSH di GitHub per il tuo account seguendo le istruzioni fornite qui. In questa pagina è disponibile materiale di riferimento aggiuntivo.

Configurazione di un token di accesso personale

Configura un token di accesso personale seguendo questa guida. Il token di accesso personale è utilizzato per clonare il repository SystemTests durante le fasi di test di integrazione. Concedi l'accesso al repository del token di accesso personale e al flusso di lavoro.

Creazione di un repository per l'infrastruttura AWS S3

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

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

Infrastruttura AWS S3

Vai su GitHub e clicca su New (Nuovo). In Owner (Responsabile) scegli l'organizzazione appropriata. Clicca su Create repository (Crea repository) per procedere.

Aggiunta di variabili del repository delle chiavi di accesso a AWS

Clicca su Settings (Impostazioni), quindi su Secrets (Segreti). Clicca su New repository secret (Nuovo segreto repository) e aggiungi l'ID della chiave di accesso AWS e la chiave di accesso segreta AWS. Fornisci la chiave di accesso AWS AdministratorAccess all'utente IAM associato. Puoi decidere di utilizzare un controllo degli accessi più dettagliato scegliendo le policy di accesso AWS individuali, ma i dettagli sono lasciati al lettore.

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

Azioni GitHub per la distribuzione in AWS

Vai al repository s3_infra nel terminale utilizzato, crea un branch che abbia lo stesso nome dell'ID del ticket Jira e crea una directory .github/workflows.

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

Crea deploy-test-staging.yml con il seguente yaml nella nuova directory .github/workflows. In questo modo si definisce un flusso di lavoro di distribuzione per gli ambienti di test e staging che viene eseguito durante i push verso branch diversi dalla mainline.

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"

Quindi, crea deploy-prod.yml con il seguente yaml. In questo modo si definisce un flusso di lavoro di distribuzione per i tuoi ambienti di produzione che viene eseguito quando una pull request effettua il merge delle modifiche nella mainline.

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"

Comprendere le azioni GitHub

Trigger

Dichiara gli eventi che attivano il flusso di lavoro nella parte superiore di questi file. In deploy-test-staging.yml l'evento viene inviato a tutti i branch tranne che alla mainline.

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

Gli eventi che possono attivare i flussi di lavoro sono numerosi. Consulta la documentazione qui per maggiori informazioni.

Processi

Un flusso di lavoro contiene molti processi che vengono eseguiti quando si verifica l'evento trigger. Ogni processo presenta una serie di passaggi che vengono effettuati quando il processo viene eseguito. È presente un passaggio per verificare il codice del repository, un passaggio per configurare le credenziali AWS e un passaggio per la distribuzione in AWS utilizzando AWS CloudFormation, come in questo esempio.

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"

Leggi di più sui processi in questa pagina e altre informazioni sui passaggi in questa pagina.

Applicazione di un ordine con needs

Puoi specificare un ordine per i tuoi processi utilizzando needs. GitHub esegue tutti i passaggi in parallelo per impostazione predefinita. Utilizza needs per far dipendere un passaggio da un altro.

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"

Push di un branch di funzioni

Dalla riga di comando esegui lo script riportato di seguito per effettuare il push del codice al branch IM-9 del repository s3_infra.

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

Clicca su Actions (Azioni) per vedere i flussi di lavoro in esecuzione.

Immagine dei flussi di lavoro in esecuzione

Creazione di una pull request

Clicca su Pull request seguito da Create pull request (Crea pull request).

Immagine del confronto delle modifiche

Scegli il branch di funzioni come branch di origine, quindi clicca su Create pull request (Crea pull request).

Immagine della creazione di una pull request

Rivedi le modifiche al codice, quindi clicca su Merge pull request (Effettua il merge delle pull request) per accettare le modifiche.

Clicca su Actions (Azioni) per vedere che la distribuzione della produzione è iniziata. GitHub esegue i processi in deploy-prod.yml perché il branch è la mainline.

Creazione di un repository per l'AWS Lambda SubmitImage

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

Immagine della board IM

Vai su GitHub e clicca su New (Nuovo). In Owner (Responsabile) scegli l'organizzazione appropriata. Clicca su Create repository (Crea repository) per procedere.

Clicca su Settings (Impostazioni), quindi su Secrets (Segreti). Aggiungi il tuo token di accesso personale come ACCESS_KEY, l'ID della tua chiave di accesso AWS come AWS_ACCESS_KEY_ID, la tua chiave di accesso segreta AWS come AWS_SECRET_ACCESS_KEY e l'ID del tuo account AWS come AWS_ACCOUNT_ID.

Nel terminale utilizzato, vai al repository SubmitImage ed esegui i comandi seguenti per effettuare il push del codice a 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
Azioni GitHub per la distribuzione in AWS

Vai al repository SubmitImage nel terminale utilizzato, crea un branch che abbia lo stesso nome dell'ID del ticket Jira e crea una directory .github/workflows.

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

Crea deploy-test-staging.yml con il seguente yaml nella nuova directory .github/workflows. In questo modo si definisce un flusso di lavoro di distribuzione per gli ambienti di test e staging che viene eseguito durante i push verso branch diversi dalla mainline. Devi aggiornare la riga git clone affinché SystemTests sia il tuo repository 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

Quindi, crea deploy-prod.yml con il seguente yaml. In questo modo si definisce un flusso di lavoro di distribuzione per i tuoi ambienti di produzione che viene eseguito quando una pull request effettua il merge delle modifiche nella mainline.

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'esecuzione dei test di integrazione è commentata per ora. I test di sistema passeranno solo quando viene distribuita l'intera applicazione. Decommenta i passaggi dei test di integrazione nel repository ed effettua un altro push per eseguire la pipeline di distribuzione dopo che tutti i componenti di ImageLabeller sono stati distribuiti. Aggiorna la sezione needs per eseguire i passaggi nell'ordine. Devi aggiornare la riga git clone affinché SystemTests sia il tuo repository SystemTests.

needs: deploy-us-east-1
Comprendere le azioni GitHub

Questo processo utilizza AWS SAM per distribuire l'AWS Lambda SubmitImage su 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

Questo processo clona il repository SystemTests ed esegue test di integrazione in 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

Questo passaggio utilizza il token di accesso personale per clonare il repository SystemTests.

    - name: Pull systemTests repo
        uses: actions/checkout@master
        with:
          repository: PmmQuickStartGuides01/systemTests
          token: ${{ secrets.ACCESS_KEY }}
Push di un branch di funzioni

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

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

Clicca su Actions (Azioni) per vedere i flussi di lavoro in esecuzione.

Tieni presente che il processo di test unitario è stato superato ed è iniziata la distribuzione al test us-west-1.

I test di sistema definiti in precedenza vengono eseguiti come parte dei processi integration-test-us-west-1 e integration-test-us-east-2.

Creare una pull request

Per creare una pull request, clicca su Pull request, quindi su New pull request (Nuova pull request).

Scegli di effettuare il merge dal branch di funzioni.

Clicca su Create pull request (Crea pull request).

Effettua il merge della pull request ed elimina il branch di funzioni. Clicca su Actions (Azioni) per monitorare la distribuzione della produzione.

Creazione di un repository per l'AWS Lambda InvokeLabeller

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

Vai su GitHub e clicca su New (Nuovo). In Owner (Responsabile) scegli l'organizzazione appropriata. Clicca su Create repository (Crea repository) per procedere.

Clicca su Settings (Impostazioni), quindi su Secrets (Segreti). Aggiungi il tuo token di accesso personale come ACCESS_KEY, l'ID della tua chiave di accesso AWS come AWS_ACCESS_KEY_ID, la tua chiave di accesso segreta AWS come AWS_SECRET_ACCESS_KEY e l'ID del tuo account AWS come AWS_ACCOUNT_ID.

Nel terminale utilizzato, vai al repository InvokeLabeller ed esegui i comandi seguenti per effettuare il push del codice a 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
Azioni GitHub per la distribuzione in AWS

Vai al repository InvokeLabeller nel terminale utilizzato, crea un branch che abbia lo stesso nome dell'ID del ticket Jira e crea una directory .github/workflows.

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

Crea deploy-test-staging.yml con il seguente yaml nella nuova directory .github/workflows. In questo modo si definisce un flusso di lavoro di distribuzione per gli ambienti di test e staging che viene eseguito durante i push verso branch diversi dalla mainline. Devi aggiornare la riga git clone affinché SystemTests sia il tuo repository 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

Quindi, crea deploy-prod.yml con il seguente yaml. In questo modo si definisce un flusso di lavoro di distribuzione per i tuoi ambienti di produzione che viene eseguito quando una pull request effettua il merge delle modifiche nella mainline.

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'esecuzione dei test di integrazione è commentata per ora. I test di sistema passeranno solo quando viene distribuita l'intera applicazione. Decommenta i passaggi dei test di integrazione nel repository ed effettua un altro push per eseguire la pipeline di distribuzione dopo che tutti i componenti di ImageLabeller sono stati distribuiti. Aggiorna la sezione needs per eseguire i passaggi nell'ordine. Devi aggiornare la riga git clone affinché SystemTests sia il tuo repository SystemTests.

needs: deploy-us-east-1
Aggiornamento di src/app.py con l'endpoint AWS SageMaker

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

def query_endpoint(img):
  endpoint_name = 'jumpstart-dft-image-labeller-endpoint'
  client = boto3.client(service_name='runtime.sagemaker', region_name='us-west-1')
  response = client.invoke_endpoint(EndpointName=endpoint_name, ContentType='application/x-image', Body=img)
  model_predictions = json.loads(response['Body'].read())['predictions'][0]
  return model_predictions
Push di un branch di funzioni

Esegui i comandi seguenti dalla riga di comando per effettuare il push delle modifiche al branch IM-11 del repository InvokeLabeller. Includi l'ID del ticket Jira nei messaggi di commit e i nomi dei branch per abilitare l'integrazione di Jira GitHub e tenere traccia di ciò che sta accadendo nel progetto.

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

Clicca su Actions (Azioni) per vedere i flussi di lavoro in esecuzione. I test di sistema definiti in precedenza vengono eseguiti come parte dei processi integration-test-us-west-1 e integration-test-us-east-2.

Creare una pull request

Per creare una pull request, clicca su Pull request, quindi su New pull request (Nuova pull request). Scegli di effettuare il merge dal branch di funzioni.

Clicca su Actions (Azioni) per monitorare la distribuzione della produzione.

Creazione di un repository per SystemTests

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

Vai su GitHub e clicca su New (Nuovo). In Owner (Responsabile) scegli l'organizzazione appropriata. Clicca su Create repository (Crea repository) per procedere.

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

Il repository SystemTests non richiede azioni GitHub. Non dispone di una pipeline propria poiché fornisce i test per l'esecuzione di altre pipeline. I passaggi del test di integrazione dei file di flusso di lavoro CI/CD possono essere decommentati, sottoposti a commit e sottoposti a push una volta distribuiti tutti i componenti dell'applicazione ImageLabeller. I test passeranno solo se tutti i componenti dell'applicazione funzionano correttamente.

Prendi nota dell'URL remoto del repository SystemTests. Le pipeline CI/CD di SubmitImage, GetImageLabel e InvokeLabeller cloneranno il repository SystemTests durante i passaggi di test. Dovrai aggiornare il file gitlab-ci.yml dei repository successivi con l'URL corretto.

Congratulazioni! Hai appena distribuito ImageLabeller. Il passaggio successivo prevede la configurazione del monitoraggio di ImageLabeller con Opsgenie.

Warren Marusiak
Warren Marusiak

Warren is a Canadian developer from Vancouver, BC with over 10 years of experience. He came to Atlassian from AWS in January of 2021.


Condividi l'articolo
Argomento successivo

Letture consigliate

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

Illustrazione su Devops

Community DevOps

Illustrazione su Devops

Percorso di apprendimento DevOps

Illustrazione di una mappa

Inizia gratis

Iscriviti alla nostra newsletter DevOps

Thank you for signing up