Close

Bereitstellen von ImageLabeller mit GitHub

Portrait Warren Marusiak
Warren Marusiak

Senior Technical Evangelist

Um zu demonstrieren, wie Anwendungen mit Jira Software und verschiedenen verbundenen Tools entwickelt, bereitgestellt und verwaltet werden können, hat unser Team ImageLabeller entwickelt. Dabei handelt es sich um eine einfache Demo-Anwendung, die auf AWS basiert und maschinelles Lernen nutzt, um Images mit Stichwörtern zu versehen.

Auf dieser Seite wird das Bereitstellen von ImageLabeller mit GitHub behandelt. Wir empfehlen dir, vorab die Seiten zur ImageLabeller-Architektur und zur AWS SageMaker-Einrichtung zu lesen, um mehr über den Kontext zu erfahren.

Voraussetzungen

Falls du noch keine GitHub-Organisation hast, befolge die Schritte in diesem GitHub-Leitfaden, um eine neue Organisation zu erstellen.

Öffentlich zugängliche GitHub-Repositorys mit ImageLabeller-Code

https://github.com/AtlassianOpenDevOpsGuides

Demo-Video zur Integration zwischen Jira und GitHub

Integrieren von Jira und GitHub

Klicke in Jira auf Board, dann auf Apps und dann auf GitHub.

JSW-App-Drop-down-Menü

Klicke auf Jetzt herunterladen.

JSW-GitHub-App

Klicke auf Apps, dann auf Apps verwalten, und erweitere GitHub.

Bild: JSW, Apps verwalten

Klicke auf Erste Schritte.

Klicke auf Erste Schritte.

Bild: GitHub-Konfiguration

Installieren des Jira-Plugins in GitHub

Klicke auf Install Jira (Jira installieren), um das Jira-Plugin in GitHub zu installieren. Dieser Schritt ist erforderlich, wenn das Jira-Plugin noch nicht in GitHub installiert wurde.

Bild: Verbinden der GitHub-Organisation mit Jira

Jira beginnt nun mit dem Synchronisieren der Daten von GitHub.

Wenn die Synchronisierung abgeschlossen ist, ändert sich der Synchronisierungsstatus in ABGESCHLOSSEN.

Screenshot: Synchronisieren einer Statusänderung

Einrichten von SSH-Zugriff

Richte GitHub-SSH-Schlüssel für dein Konto ein, indem du diese Anweisungen befolgst. Weiteres Referenzmaterial ist hier zu finden.

Einrichten eines persönlichen Zugriffstokens

Richte ein persönliches Zugriffstoken (Personal Access Token, PAT) ein, indem du diesen Leitfaden befolgst. Das PAT wird verwendet, um das Repository "SystemTests" während der Integrationstestschritte zu klonen. Gewähre dem PAT Repository- und Workflow-Zugriff.

Erstellen eines Repositorys für die AWS S3-Infrastruktur

In einem standardmäßigen Entwicklungszyklus wählen Entwickler normalerweise Tasks aus Jira aus, verschieben sie in den Bearbeitungsstatus und erledigen dann die Entwicklungsarbeit. Die Jira-Vorgangs-ID ist der Schlüssel, der die Entwicklungsarbeit mit dem Jira-Vorgang verbindet. Er ist die zentrale Integrationskomponente zwischen den beiden Systemen.

Erstelle in Jira einen neuen Vorgang für das Hinzufügen eines AWS S3-Infrastruktur-Repositorys zu GitHub. Notiere die Vorgangs-ID. In diesem Beispiel lautet sie "IM-9".

AWS S3-Infrastruktur

Klicke in GitHub auf Neu. Wähle unter Besitzer die passende Organisation aus. Klicke auf Repository erstellen, um fortzufahren.

Hinzufügen eines AWS-Zugriffsschlüssels zu den Repository-Variablen

Klicke auf "Einstellungen" und dann auf "Secrets" (Geheime Schlüssel). Klicke auf "New repository secret" (Neuer geheimer Repository-Schlüssel) und füge die AWS-Zugriffsschlüssel-ID und den geheimen AWS-Zugriffsschlüssel hinzu. Gewähre dem mit dem AWS-Zugriffsschlüssel verknüpften IAM-Benutzer Administratorzugriff. Du kannst dich für eine detailliertere Zugriffskontrolle entscheiden, indem du individuelle AWS-Zugriffsrichtlinien auswählst. Die Details bleiben dir selbst überlassen.

Wechsle in deinem Terminal zum Repository "s3_infra" und führe den folgenden Befehl aus, um an GitHub zu pushen.

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

GitHub-Aktionen für das Bereitstellen in AWS

Wechsle in deinem Terminal zum Repository "s3_infra", erstelle einen Branch, den du nach der Jira-Vorgangs-ID benennst, und erstelle das Verzeichnis ".github/workflows".

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

Erstelle "deploy-test-staging.yml" mit dem nachfolgend aufgeführten YAML im neuen Verzeichnis ".github/workflows". Dies definiert einen Deployment-Workflow für deine Test- und Staging-Umgebungen, der beim Pushen an andere Branches als den "mainline"-Branch ausgeführt wird.

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"

Erstelle dann "deploy-prod.yml" mit dem nachfolgend aufgeführten YAML. Dies definiert einen Deployment-Workflow für deine Produktionsumgebungen, der beim Mergen von Änderungen in den "mainline"-Branch per Pull-Anfrage ausgeführt wird.

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"

Erläuterungen zu GitHub-Aktionen

Trigger

Deklariere die Ereignisse, die den Workflow auslösen, oben in diesen Dateien. In "deploy-test-staging.yml" werden Ereignisse an alle Branches außer den "mainline"-Branch gepusht.

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

Viele Ereignisse können Workflows auslösen. Weitere Informationen findest du hier in der Dokumentation.

Stellenangebote

Ein Workflow enthält eine Reihe von Jobs, die ausgeführt werden, wenn das Trigger-Ereignis eintritt. Jeder Job umfasst bestimmte Schritte, die beim Ausführen des Jobs umgesetzt werden. In diesem Beispiel gibt es einen Schritt zum Auschecken des Repository-Codes, einen Schritt zum Konfigurieren der AWS-Anmeldedaten und einen Schritt zum Bereitstellen in AWS mithilfe von 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"

Weitere Informationen zu Jobs findest du hier, weitere Informationen zu Schritten hier.

Durchsetzen einer Reihenfolge mithilfe von Anforderungen

Du kannst mithilfe von Anforderungen eine Reihenfolge für deine Jobs festlegen. GitHub führt standardmäßig alle Schritte parallel aus. Verwende Anforderungen, um Abhängigkeiten zwischen Schritten zu erstellen.

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"

Pushen an einen Feature Branch

Führe über die Befehlszeile den nachfolgend angegebenen Befehl aus, um deinen Code an den Branch "IM-9" des Repositorys "s3_infra" zu pushen.

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

Klicke auf Aktionen, um die laufenden Workflows anzuzeigen.

Bild: Ausführen von Workflows

Erstellen einer Pull-Anfrage

Klicke auf Pull-Anfragen und dann auf Pull-Anfrage erstellen.

Bild: Vergleichen von Images

Wähle als Quell-Branch deinen Feature Branch aus, und klicke dann auf Pull-Anfrage erstellen.

Bild: Erstellen einer Pull-Anfrage

Überprüfe die Code-Änderungen, und klicke dann auf Merge pull request (Pull-Anfrage mergen), um die Änderungen zu akzeptieren.

Klicke auf Aktionen, um dich zu vergewissern, dass das Produktions-Deployment gestartet wurde. GitHub führt die Jobs in "deploy-prod.yml" aus, weil es sich um den "mainline"-Branch handelt.

Erstellen eines Repositorys für das AWS Lambda SubmitImage

Erstelle in Jira einen Jira-Vorgang für das Hinzufügen eines Repositorys für das AWS Lambda SubmitImage zu GitHub. Notiere die Jira-Vorgangs-ID. In diesem Beispiel lautet sie "IM-8".

Bild: IM-Board

Klicke in GitHub auf Neu. Wähle unter Besitzer die passende Organisation aus. Klicke auf Repository erstellen, um fortzufahren.

Klicke auf Einstellungen und dann auf Secrets (Geheime Schlüssel). Füge dein persönliches Zugriffstoken als ACCESS_KEY, deine AWS-Zugangsschlüssel-ID als AWS_ACCESS_KEY_ID, deinen geheimen AWS-Zugriffsschlüssel als AWS_SECRET_ACCESS_KEY und deine AWS-Konto-ID als AWS_ACCOUNT_ID hinzu.

Wechsle in deinem Terminal zum Repository "SubmitImage" und führe den folgenden Befehl aus, um deinen Code an GitHub zu pushen.

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
GitHub-Aktionen für das Bereitstellen in AWS

Wechsle in deinem Terminal zum Repository "SubmitImage", erstelle einen Branch, den du nach der Jira-Vorgangs-ID benennst, und erstelle das Verzeichnis ".github/workflows".

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

Erstelle "deploy-test-staging.yml" mit dem nachfolgend aufgeführten YAML im neuen Verzeichnis ".github/workflows". Dies definiert einen Deployment-Workflow für deine Test- und Staging-Umgebungen, der beim Pushen an andere Branches als den "mainline"-Branch ausgeführt wird. Du musst die "git clone"-Zeile aktualisieren, sodass SystemTests dein SystemTests-Repository ist.

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

Erstelle dann "deploy-prod.yml" mit dem nachfolgend aufgeführten YAML. Dies definiert einen Deployment-Workflow für deine Produktionsumgebungen, der beim Mergen von Änderungen in den "mainline"-Branch per Pull-Anfrage ausgeführt wird.

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

Die Durchführung der Integrationstests wird vorerst auskommentiert. Die Systemtests werden erst bestanden, wenn die gesamte Anwendung bereitgestellt wurde. Kommentiere die Integrationstestschritte in deinem Repository ein und führe einen weiteren Push durch, um die Deployment-Pipeline auszuführen, nachdem alle Komponenten von ImageLabeller bereitgestellt wurden. Aktualisiere den Abschnitt mit den Anforderungen, damit die Schritte in der gewünschten Reihenfolge ausgeführt werden. Du musst die "git clone"-Zeile aktualisieren, sodass SystemTests dein SystemTests-Repository ist.

needs: deploy-us-east-1
Erläuterungen zu GitHub-Aktionen

Bei diesem Job wird AWS SAM verwendet, um dein AWS Lambda SubmitImage in us-west-2 bereitzustellen.

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

Bei diesem Job wird das SystemTests-Repository geklont, und es werden Integrationstests in us-west-2 durchgeführt.

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

In diesem Schritt wird das persönliche Zugriffstoken verwendet, um das SystemTests-Repository zu klonen.

    - name: Pull systemTests repo
        uses: actions/checkout@master
        with:
          repository: PmmQuickStartGuides01/systemTests
          token: ${{ secrets.ACCESS_KEY }}
Pushen an einen Feature Branch

Führe über die Befehlszeile den nachfolgend angegebenen Befehl aus, um deine Änderungen an den Branch "IM-8" des Repositorys "SubmitImage" zu pushen. Füge die Jira-Vorgangs-ID in Commit-Nachrichten und Branch-Namen ein, damit die Integration zwischen Jira und GitHub die Änderungen am Projekt verfolgen kann.

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

Klicke auf Aktionen, um die laufenden Workflows anzuzeigen.

Wie hier zu sehen ist, wurde der Job für Unit-Tests bestanden und das Deployment in "Test us-west-1" hat begonnen.

Die zuvor definierten Systemtests werden als Teil der Jobs "integration-test-us-west-1" und "integration-test-us-east-2" ausgeführt.

Pull Requests erstellen

Um eine Pull-Anfrage zu erstellen, klicke auf Pull-Anfrage und dann auf New pull request (Neue Pull-Anfrage).

Wähle aus, dass der Merge von deinem Feature Branch aus erfolgen soll.

Klicke auf Create pull request (Pull-Anfrage erstellen).

Führe einen Merge der Pull-Anfrage durch und lösche den Feature Branch. Klicke auf Aktionen, um das Produktions-Deployment zu überwachen.

Erstellen eines Repositorys für das AWS Lambda InvokeLabeller

Erstelle in Jira einen Jira-Vorgang für das Hinzufügen eines Repositorys für das AWS Lambda InvokeLabeller zu GitHub. Notiere die Jira-Vorgangs-ID. In diesem Beispiel lautet sie "IM-11".

Klicke in GitHub auf Neu. Wähle unter Besitzer die passende Organisation aus. Klicke auf Repository erstellen, um fortzufahren.

Klicke auf Einstellungen und dann auf Secrets (Geheime Schlüssel). Füge dein persönliches Zugriffstoken als ACCESS_KEY, deine AWS-Zugangsschlüssel-ID als AWS_ACCESS_KEY_ID, deinen geheimen AWS-Zugriffsschlüssel als AWS_SECRET_ACCESS_KEY und deine AWS-Konto-ID als AWS_ACCOUNT_ID hinzu.

Wechsle in deinem Terminal zum InvokeLabeller-Repository und führe den folgenden Befehl aus, um deinen Code an GitHub zu pushen.

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
GitHub-Aktionen für das Bereitstellen in AWS

Wechsle in deinem Terminal zum InvokeLabeller-Repository, erstelle einen Branch, den du nach der Jira-Vorgangs-ID benennst und erstelle das Verzeichnis ".github/workflows".

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

Erstelle "deploy-test-staging.yml" mit dem nachfolgend aufgeführten YAML im neuen Verzeichnis ".github/workflows". Dies definiert einen Deployment-Workflow für deine Test- und Staging-Umgebungen, der beim Pushen an andere Branches als den "mainline"-Branch ausgeführt wird. Du musst die "git clone"-Zeile aktualisieren, sodass SystemTests dein SystemTests-Repository ist.

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

Erstelle dann "deploy-prod.yml" mit dem nachfolgend aufgeführten YAML. Dies definiert einen Deployment-Workflow für deine Produktionsumgebungen, der beim Mergen von Änderungen in den "mainline"-Branch per Pull-Anfrage ausgeführt wird.

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

Die Durchführung der Integrationstests wird vorerst auskommentiert. Die Systemtests werden erst bestanden, wenn die gesamte Anwendung bereitgestellt wurde. Kommentiere die Integrationstestschritte in deinem Repository ein und führe einen weiteren Push durch, um die Deployment-Pipeline auszuführen, nachdem alle Komponenten von ImageLabeller bereitgestellt wurden. Aktualisiere den Abschnitt mit den Anforderungen, damit die Schritte in der gewünschten Reihenfolge ausgeführt werden. Du musst die "git clone"-Zeile aktualisieren, sodass SystemTests dein SystemTests-Repository ist.

needs: deploy-us-east-1
Aktualisieren von "src/app.py" mit dem AWS SageMaker-Endpunkt

Öffne die InvokeLabeller-Datei "src/app.py" und suche nach "query_endpoint". Ändere die Einträge unter "endpoint_name" (Endpunktname) und "client region_name" (Client-Regionsname) so, dass sie zu deinem AWS SageMaker-Notebook passen.

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
Pushen an einen Feature Branch

Führe über die Befehlszeile den nachfolgend angegebenen Befehl aus, um deine Änderungen an den Branch "IM-11" des InvokeLabeller-Repositorys zu pushen. Füge die Jira-Vorgangs-ID in Commit-Nachrichten und Branch-Namen ein, damit die Integration zwischen Jira und GitHub die Änderungen am Projekt verfolgen kann.

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

Klicke auf Aktionen, um die laufenden Workflows anzuzeigen. Die zuvor definierten Systemtests werden als Teil der Jobs "integration-test-us-west-1" und "integration-test-us-east-2" ausgeführt.

Pull Requests erstellen

Um eine Pull-Anfrage zu erstellen, klicke auf Pull-Anfrage und dann auf New pull request (Neue Pull-Anfrage). Wähle aus, dass der Merge von deinem Feature Branch aus erfolgen soll.

Klicke auf Aktionen, um das Produktions-Deployment zu überwachen.

Erstellen eines Repositorys für SystemTests

Erstelle in Jira einen Jira-Vorgang für das Hinzufügen eines SystemTests-Repositorys zu GitHub. Notiere die Jira-Vorgangs-ID. In diesem Beispiel lautet sie "IM-7".

Klicke in GitHub auf Neu. Wähle unter Besitzer die passende Organisation aus. Klicke auf Repository erstellen, um fortzufahren.

Wechsle in deinem Terminal zum SystemTests-Repository und führe den folgenden Befehl aus, um deinen Code an GitHub zu pushen.

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

Das SystemTests-Repository erfordert keine GitHub-Aktionen. Es hat keine eigene Pipeline, da es Tests für andere Pipelines bereitstellt. Die Integrationstestschritte der CI/CD-Workflow-Dateien können einkommentiert, committet und gepusht werden, sobald alle Komponenten der ImageLabeller-Anwendung bereitgestellt sind. Die Tests werden nur bestanden, wenn alle Komponenten der Anwendung ordnungsgemäß funktionieren.

Notiere die SystemTests-Remote-URL. Die CI/CD-Pipelines von SubmitImage, GetImageLabel und InvokeLabeller klonen das SystemTests-Repository während der Testschritte. Du musst "gitlab-ci.yml" für spätere Repositorys mit der richtigen URL aktualisieren.

Wenn du es bis hierher geschafft hast, herzlichen Glückwunsch! Du hast gerade ImageLabeller bereitgestellt. Der nächste Schritt ist das Einrichten der ImageLabeller-Überwachung mit 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.


Diesen Artikel teilen

Lesenswert

Füge diese Ressourcen deinen Lesezeichen hinzu, um mehr über DevOps-Teams und fortlaufende Updates zu DevOps bei Atlassian zu erfahren.

Abbildung: DevOps

DevOps-Community

Abbildung: DevOps

DevOps-Lernpfad

Abbildung: Karte

Kostenlos loslegen

Melde dich für unseren DevOps-Newsletter an

Thank you for signing up