Close

Bereitstellen von ImageLabeller mit Bitbucket

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 Bitbucket 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

Wenn du SSH noch nicht für dein Bitbucket-Konto konfiguriert hast, befolge diese Anweisungen.

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

https://github.com/AtlassianOpenDevOpsGuides

Demo-Video zu Bitbucket Pipelines

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 Bitbucket. Notiere die Vorgangs-ID. In diesem Beispiel lautet sie "IM-5".

Screenshot: Jira-Vorgang zum Hinzufügen des AWS S3-Infrastruktur-Repositorys zu Bitbucket

Klicke in Bitbucket auf Erstellen > Repository.

Erstellen eines Repositorys in Bitbucket

Wähle den jeweiligen Arbeitsbereich und das richtige Projekt aus. Lege unter Standard-Branchname den Namen "mainline" fest. Klicke auf Repository erstellen, um fortzufahren.

Pop-up-Fenster zum Erstellen eines neuen Repositorys in Bitbucket

Wechsle in deinem Terminal zum Repository "s3_infra" und führe den folgenden Befehl aus, um deine AWS CloudFormation-Datei "template.yml" an Bitbucket zu pushen.

git add --all
git commit -m "IM-5 add s3_infra repository to Bitbucket"
git remote add origin git@bitbucket.org:pmmquickstartguides01/s3_infra.git
git branch -m mainline
git push -u origin mainline

Aktiviere Bitbucket Pipelines

Navigiere zu Repository-Einstellungen > Einstellungen > Enable Pipelines (Pipelines aktivieren).

Aktivieren von Pipelines in Bitbucket

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

Wechsle zu Repository-Variablen, gib deine AWS-Zugangsschlüssel-ID ein und klicke auf Hinzufügen. Gib dann deinen geheimen AWS-Zugriffsschlüssel ein und klicke auf Hinzufügen.

Repository-Variablen in Bitbucket

Einrichten von Deployment-Umgebungen

Klicke auf Deployments.

Bildschirm mit den Deployment-Einstellungen in Bitbucket

Klicke auf add environment (Umgebung hinzufügen), um neue Umgebungen hinzuzufügen. In diesem Beispiel gibt es in US-WEST-1 eine Testumgebung, in US-EAST-2 eine Staging-Umgebung sowie in US-WEST-2, US-EAST-1 und CA-CENTRAL-1 drei Produktionsumgebungen.

Hinzufügen von Deployment-Umgebungen in Bitbucket

"bitbucket-pipelines.yml" für das Bereitstellen in AWS

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

git checkout -b IM-5

Erstelle die Datei "bitbucket-pipelines.yml" mit dem nachfolgend angegebenen YAML. Dies definiert einen Deployment-Workflow für deine Test-, Staging- und Produktionsumgebungen.

definitions:
  steps:
    - step: &deploy-test-usw1
        name: Deploy Test us-west-1
        script:
        - pipe: atlassian/aws-cloudformation-deploy:0.10.0
          variables:
            AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
            AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
            AWS_DEFAULT_REGION: 'us-west-1'
            STACK_NAME: 'OpenDevOpsS3Infra'
            CAPABILITIES: ['CAPABILITY_IAM', 'CAPABILITY_AUTO_EXPAND']
            WAIT: 'true'
            TEMPLATE: 'template.yml'
    - step: &deploy-staging-use2
        name: Deploy Staging us-east-2
        script:
        - pipe: atlassian/aws-cloudformation-deploy:0.10.0
          variables:
            AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
            AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
            AWS_DEFAULT_REGION: 'us-east-2'
            STACK_NAME: 'OpenDevOpsS3Infra'
            CAPABILITIES: ['CAPABILITY_IAM', 'CAPABILITY_AUTO_EXPAND']
            WAIT: 'true'
            TEMPLATE: 'template.yml'
    - step: &deploy-production-usw2
        name: Deploy Production us-west-2
        script:
        - pipe: atlassian/aws-cloudformation-deploy:0.10.0
          variables:
            AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
            AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
            AWS_DEFAULT_REGION: 'us-west-2'
            STACK_NAME: 'OpenDevOpsS3Infra'
            CAPABILITIES: ['CAPABILITY_IAM', 'CAPABILITY_AUTO_EXPAND']
            WAIT: 'true'
            TEMPLATE: 'template.yml'
    - step: &deploy-production-use1
        name: Deploy Production us-east-1
        script:
        - pipe: atlassian/aws-cloudformation-deploy:0.10.0
          variables:
            AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
            AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
            AWS_DEFAULT_REGION: 'us-east-1'
            STACK_NAME: 'OpenDevOpsS3Infra'
            CAPABILITIES: ['CAPABILITY_IAM', 'CAPABILITY_AUTO_EXPAND']
            WAIT: 'true'
            TEMPLATE: 'template.yml'
    - step: &deploy-production-cac1
        name: Deploy Production ca-central-1
        script:
        - pipe: atlassian/aws-cloudformation-deploy:0.10.0
          variables:
            AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
            AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
            AWS_DEFAULT_REGION: 'ca-central-1'
            STACK_NAME: 'OpenDevOpsS3Infra'
            CAPABILITIES: ['CAPABILITY_IAM', 'CAPABILITY_AUTO_EXPAND']
            WAIT: 'true'
            TEMPLATE: 'template.yml'
pipelines:
  default:
    - step:
        <<: *deploy-test-usw1
        deployment: Test us-west-1
    - step:
        <<: *deploy-staging-use2
        deployment: Staging us-east-2
  branches:
    mainline:
      - step:
          <<: *deploy-production-usw2
          deployment: Production us-west-2
      - step:
          <<: *deploy-production-use1
          deployment: Production us-east-1
      - step:
          <<: *deploy-production-cac1
          deployment: Production ca-central-1

Erläuterungen zur Datei "bitbucket-pipelines.yml"

Definitionen und Schritte

Definiere eine Reihe von Schritten im Abschnitt definitions (Definitionen). Jeder Schritt hat einen Alias, auf den in der gesamten Datei "bitbucket-pipelines.yml" verwiesen wird, einen Namen, der im Bitbucket-Deployment-Fenster angezeigt wird, und ein Skript. Ein Skript ist eine Sammlung von einem oder mehreren Befehlen.

definitions:
  steps:
    - step: &deploy-test-usw1
        name: Deploy Test us-west-1
        script:
        - pipe: atlassian/aws-cloudformation-deploy:0.10.0
          variables:
            AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
            AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
            AWS_DEFAULT_REGION: 'us-west-1'
            STACK_NAME: 'OpenDevOpsS3Infra'
            CAPABILITIES: ['CAPABILITY_IAM', 'CAPABILITY_AUTO_EXPAND']
            WAIT: 'true'
            TEMPLATE: 'template.yml'

Pipes

In diesem Schritt wird die Pipe atlassian/aws-cloudformation-deploy verwendet, um die in der s3_infra-Datei "template.yml" definierten AWS S3-Buckets bereitzustellen.

- pipe: atlassian/aws-cloudformation-deploy:0.10.0

Die verfügbaren Pipes sind hier zu finden. Die Dokumentation zur Pipe atlassian/aws-cloudformation-deploy findest du hier.

Pipelines

Pipelines dienen zur Ausführung einer Reihe von Schritten. Die Standard-Pipeline umfasst die Schritte, die für Branches ausgeführt werden, die bei den Pipelines nicht explizit benannt sind. Mit dieser Standard-Pipeline werden Schritte für Deployments in Test- und Staging-Umgebungen ausgeführt.

pipelines:
  default:
    - step:
        <<: *deploy-test-usw1
        deployment: Test us-west-1
    - step:
        <<: *deploy-staging-use2
        deployment: Staging us-east-2

Deployments ermöglichen die Integration zwischen Jira und Bitbucket.

deployment: Test us-west-1

Du kannst eine Reihe von Schritten definieren, die für einen bestimmten unter Branches benannten Branch ausgeführt werden. Mit dem unten dargestellten Snippet wird eine Reihe von Schritten für den "mainline"-Branch definiert.

branches:
    mainline:
      - step:
          <<: *deploy-production-usw2
          deployment: Production us-west-2
      - step:
          <<: *deploy-production-use1
          deployment: Production us-east-1
      - step:
          <<: *deploy-production-cac1
          deployment: Production ca-central-1

In diesem Referenzartikel findest du weitere Informationen zu diesem Thema.

Pushen an einen Feature Branch

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

git add --all
git commit -m "IM-5 add bitbucket-pipelines.yml"
git push -u origin IM-5

Klicke auf Pipelines und dann auf IM-5, um die laufende Pipeline anzuzeigen.

Ausführen von Pipelines in Bitbucket

Klicke auf die Pipeline selbst, um Details zur Ausführung anzuzeigen. Von der Pipeline wurden Schritte zum Bereitstellen in einer Testumgebung in us-west-1 und in einer Staging-Umgebung in us-east-2 ausgeführt.

Details zur Pipeline-Ausführung in Bitbucket

Pull Requests erstellen

Um eine Pull-Anfrage zu erstellen, klicke auf Pull-Anfragen und dann auf Pull-Anfrage erstellen.

Erstellen einer Pull-Anfrage in Bitbucket

Wähle als Quell-Branch deinen Feature Branch aus, aktiviere das Kontrollkästchen Close branch (Branch schließen) und klicke dann auf Pull-Anfrage erstellen.

Erstellen eines modalen Fensters für Pull-Anfragen in Bitbucket

Überprüfe die Code-Änderungen, genehmige und merge die Pull-Anfrage.

Genehmigen und Mergen von Pull-Anfragen in Bitbucket

Wenn du auf Merge durchführen klickst, wird der Bildschirm zum Mergen von Pull-Anfragen geöffnet. Aktiviere das Kontrollkästchen Vorgang weitergeben und klicke dann auf Merge durchführen.

Aktiviere beim Mergen von Pull-Anfragen in Bitbucket das Kontrollkästchen "Vorgang weitergeben".

Klicke auf Pipelines, um die "mainline"-Pipeline zu überwachen.

Überwachen der Hauptpipeline in Bitbucket

Der Branch "IM-5" ist nicht mehr vorhanden. Der "mainline"-Branch ist noch übrig und eine Pipeline wird ausgeführt. Klicke auf die Pipeline.

Bildschirm mit der "mainline"-Branch-Pipeline in Bitbucket

Von der Pipeline wurden Schritte zum Bereitstellen in Produktionsumgebungen in us-west-2, us-east-1 und ca-central-1 ausgeführt. Wenn bei einer Pipeline ein Fehler auftritt, kannst du die erneute Ausführung dieser Pipeline veranlassen, indem du auf die Schaltfläche Wiederholen klickst.

Durchführen eines Rollbacks bei fehlerhaftem Deployment

Um ein Rollback für ein Deployment durchzuführen, klicke auf Deployments.

Deployments-Bildschirm in Bitbucket

Klicke auf die Umgebung, für die das Rollback durchgeführt werden soll, um eine Liste der bisherigen Deployments abzurufen. Wähle die Zielversion für das Rollback aus, und klicke dann auf Redeploy (Erneut bereitstellen).

Auswählen einer Umgebung und der gewünschten Version für das Rollback in Bitbucket

Vergewissere dich, dass die Änderung korrekt ist, und klicke auf Redeploy (Erneut bereitstellen).

Vergewissere dich, dass deine Änderungen korrekt sind, bevor du in Bitbucket "Redeploy" (Erneut bereitstellen) auswählst.

Nur die gewählte Umgebung wird neu bereitgestellt.

Modales Pipeline-Fenster in Bitbucket, das zeigt, dass nur die gewählte Umgebung neu bereitgestellt wird

Erstellen eines Repositorys für das AWS Lambda SubmitImage

Erstelle in Jira einen Jira-Vorgang für das Hinzufügen des Repositorys "SubmitImage" zu Bitbucket. Notiere die Jira-Vorgangs-ID. In diesem Beispiel lautet sie "IM-6".

Erstellen eines Vorgangs in Jira Software zum Hinzufügen eines SubmitImage-Repositorys zu Bitbucket

Klicke in Bitbucket auf Erstellen und dann auf Repository.

Erstellen eines Repositorys in Bitbucket

Wähle den jeweiligen Arbeitsbereich und das richtige Projekt aus. Lege unter Standard-Branchname den Namen "mainline" fest. Klicke auf Repository erstellen, um fortzufahren.

Modales Pop-up-Fenster beim Erstellen eines neuen Repositorys in Bitbucket

Wechsle in deinem Terminal zum Repository "SubmitImage" und führe den folgenden Befehl aus, um deinen AWS Lambda-Code an Bitbucket zu pushen. Füge die Jira-Vorgangs-ID in Commit-Nachrichten und Branch-Namen ein, damit die Integration zwischen Jira und Bitbucket die Änderungen am Projekt verfolgen kann.

git add --all
git commit -m "IM-6 add SubmitImage to Bitbucket"
git remote add origin git@bitbucket.org:pmmquickstartguides01/submitimage.git
git branch -m mainline
git push -u origin mainline

Aktivieren von Pipelines

Navigiere zu Repository-Einstellungen und klicke auf Einstellungen und dann auf Enable pipelines (Pipelines aktivieren).

Aktivieren von Pipelines in den Pipelines-Einstellungen in Bitbucket

Hinzufügen von Repository-Variablen

Klicke auf Repository variables (Repository-Variablen), um deine AWS-Zugriffsschlüssel-ID, deinen geheimen AWS-Zugriffsschlüssel und deine AWS-Konto-ID hinzuzufügen. 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.

Aktivieren von Pipelines in den Pipelines-Einstellungen in Bitbucket

Hinzufügen von Deployment-Umgebungen

Klicke auf Deployments und dann auf add environment (Umgebung hinzufügen), um neue Umgebungen hinzuzufügen. In diesem Beispiel gibt es in us-west-1 eine Testumgebung, in us-east-2 eine Staging-Umgebung sowie in us-west-2, us-east-1 und ca-central-1 drei Produktionsumgebungen.

Deployment-Umgebungen in Bitbucket

Erstellen von SSH-Schlüsseln

Wechsle in Bitbucket zum Repository "SubmitImage", und klicke auf Repository-Einstellungen, dann auf SSH-Schlüssel und dann auf Generate keys (Schlüssel generieren).

Generieren von SSH-Schlüsseln in Bitbucket

Du benötigst diesen SSH-Schlüssel beim Erstellen des SystemTests-Repositorys.

SSH-Schlüsseldetails in Bitbucket

"bitbucket-pipelines.yml" für das Bereitstellen in AWS

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

git checkout -b IM-6

Erstelle die Datei "bitbucket-pipelines.yml" mit dem nachfolgend angegebenen YAML. Dies definiert eine Bitbucket-Pipeline für deine Test-, Staging- und Produktionsumgebungen. Du musst die "git clone"-Zeile aktualisieren, sodass SystemTests dein SystemTests-Repository ist.

definitions:
  steps:
    -step: &rununittests
        name: run unit tests
        image: golang:buster
        script:
          - cd submitImage
          - go test ./opendevopslambda/...
    -step: &deploy-test-usw1
        name: Deploy Test us-west-1
        image: amazon/aws-sam-cli-build-image-provided
        script:
          - curl https://dl.google.com/go/go1.16.3.linux-amd64.tar.gz -o go1.16.3.tar.gz
          - rm -rf /usr/local/go
          - tar -C /usr/local -xzf go1.16.3.tar.gz
          - export PATH=$PATH:/usr/local/go/bin
          - go version
          - make
          - ls -lah /opt/atlassian/pipelines/agent/build/build/
          - pipe: atlassian/aws-sam-deploy:1.2.0
            variables:
              AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
              AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
              AWS_DEFAULT_REGION: 'us-west-1'
              STACK_NAME: 'OpenDevOpsSubmitImage'
              CAPABILITIES: [ 'CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND' ]
              TEMPLATE: 'https://s3.amazonaws.com/open-devops-code-us-west-1-${AWS_ACCOUNT_ID}/submit-image-packaged.yml'
              WAIT: 'true'
              DEBUG: 'true'
              S3_BUCKET: 'open-devops-code-us-west-1-${AWS_ACCOUNT_ID}'
              SAM_TEMPLATE: 'build/template.yaml'
    -step: &integration-test-usw1
      name: Integration test usw1
      image: golang:buster
      script:
        - git clone git@bitbucket.org:pmmquickstartguides01/systemtests.git
        - cd systemtests
        - go test -v ./... -aws_region=us-west-1
    -step: &deploy-staging-use2
        name: Deploy Staging us-east-2
        image: amazon/aws-sam-cli-build-image-provided
        script:
          - curl https://dl.google.com/go/go1.16.3.linux-amd64.tar.gz -o go1.16.3.tar.gz
          - rm -rf /usr/local/go
          - tar -C /usr/local -xzf go1.16.3.tar.gz
          - export PATH=$PATH:/usr/local/go/bin
          - go version
          - make
          - ls -lah /opt/atlassian/pipelines/agent/build/build/
          - BITBUCKET_PIPE_SHARED_STORAGE_DIR="/opt/atlassian/pipelines/agent/build/.bitbucket/pipelines/generated/pipeline/pipes"
          - chmod -R o+rw $BITBUCKET_PIPE_SHARED_STORAGE_DIR
          - pipe: atlassian/aws-sam-deploy:1.2.0
            variables:
              AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
              AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
              AWS_DEFAULT_REGION: 'us-east-2'
              STACK_NAME: 'OpenDevOpsSubmitImage'
              CAPABILITIES: [ 'CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND' ]
              TEMPLATE: 'https://s3.amazonaws.com/open-devops-code-us-east-2-${AWS_ACCOUNT_ID}/submit-image-packaged.yml'
              WAIT: 'true'
              DEBUG: 'true'
              S3_BUCKET: 'open-devops-code-us-east-2-${AWS_ACCOUNT_ID}'
              SAM_TEMPLATE: 'build/template.yaml'
    -step: &integration-test-use2
      name: Integration test use2
      image: golang:buster
      script:
        - git clone git@bitbucket.org:pmmquickstartguides01/systemtests.git
        - cd systemtests
        - go test -v ./... -aws_region=us-east-2
    -step: &deploy-production-usw2
        name: Deploy Production us-west-2
        image: amazon/aws-sam-cli-build-image-provided
        script:
          - curl https://dl.google.com/go/go1.16.3.linux-amd64.tar.gz -o go1.16.3.tar.gz
          - rm -rf /usr/local/go
          - tar -C /usr/local -xzf go1.16.3.tar.gz
          - export PATH=$PATH:/usr/local/go/bin
          - go version
          - make
          - ls -lah /opt/atlassian/pipelines/agent/build/build/
          - pipe: atlassian/aws-sam-deploy:1.2.0
            variables:
              AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
              AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
              AWS_DEFAULT_REGION: 'us-west-2'
              STACK_NAME: 'OpenDevOpsSubmitImage'
              CAPABILITIES: [ 'CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND' ]
              TEMPLATE: 'https://s3.amazonaws.com/open-devops-code-us-west-2-${AWS_ACCOUNT_ID}/submit-image-packaged.yml'
              WAIT: 'true'
              DEBUG: 'true'
              S3_BUCKET: 'open-devops-code-us-west-2-${AWS_ACCOUNT_ID}'
              SAM_TEMPLATE: 'build/template.yaml'
    -step: &integration-test-usw2
      name: Integration test usw2
      image: golang:buster
      script:
        - git clone git@bitbucket.org:pmmquickstartguides01/systemtests.git
        - cd systemtests
        - go test -v ./... -aws_region=us-west-2
    -step: &deploy-production-use1
        name: Deploy Production us-east-1
        image: amazon/aws-sam-cli-build-image-provided
        script:
          - curl https://dl.google.com/go/go1.16.3.linux-amd64.tar.gz -o go1.16.3.tar.gz
          - rm -rf /usr/local/go
          - tar -C /usr/local -xzf go1.16.3.tar.gz
          - export PATH=$PATH:/usr/local/go/bin
          - go version
          - make
          - ls -lah /opt/atlassian/pipelines/agent/build/build/
          - BITBUCKET_PIPE_SHARED_STORAGE_DIR="/opt/atlassian/pipelines/agent/build/.bitbucket/pipelines/generated/pipeline/pipes"
          - chmod -R o+rw $BITBUCKET_PIPE_SHARED_STORAGE_DIR
          - pipe: atlassian/aws-sam-deploy:1.2.0
            variables:
              AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
              AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
              AWS_DEFAULT_REGION: 'us-east-1'
              STACK_NAME: 'OpenDevOpsSubmitImage'
              CAPABILITIES: [ 'CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND' ]
              TEMPLATE: 'https://s3.amazonaws.com/open-devops-code-us-east-1-${AWS_ACCOUNT_ID}/submit-image-packaged.yml'
              WAIT: 'true'
              DEBUG: 'true'
              S3_BUCKET: 'open-devops-code-us-east-1-${AWS_ACCOUNT_ID}'
              SAM_TEMPLATE: 'build/template.yaml'
    -step: &integration-test-use1
      name: Integration test use1
      image: golang:buster
      script:
        - git clone git@bitbucket.org:pmmquickstartguides01/systemtests.git
        - cd systemtests
        - go test -v ./... -aws_region=us-east-1
    -step: &deploy-production-cac1
        name: Deploy Production ca-central-1
        image: amazon/aws-sam-cli-build-image-provided
        script:
          - curl https://dl.google.com/go/go1.16.3.linux-amd64.tar.gz -o go1.16.3.tar.gz
          - rm -rf /usr/local/go
          - tar -C /usr/local -xzf go1.16.3.tar.gz
          - export PATH=$PATH:/usr/local/go/bin
          - go version
          - make
          - ls -lah /opt/atlassian/pipelines/agent/build/build/
          - BITBUCKET_PIPE_SHARED_STORAGE_DIR="/opt/atlassian/pipelines/agent/build/.bitbucket/pipelines/generated/pipeline/pipes"
          - chmod -R o+rw $BITBUCKET_PIPE_SHARED_STORAGE_DIR
          - pipe: atlassian/aws-sam-deploy:1.2.0
            variables:
              AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
              AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
              AWS_DEFAULT_REGION: 'ca-central-1'
              STACK_NAME: 'OpenDevOpsSubmitImage'
              CAPABILITIES: [ 'CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND' ]
              TEMPLATE: 'https://s3.amazonaws.com/open-devops-code-ca-central-1-${AWS_ACCOUNT_ID}/submit-image-packaged.yml'
              WAIT: 'true'
              DEBUG: 'true'
              S3_BUCKET: 'open-devops-code-ca-central-1-${AWS_ACCOUNT_ID}'
              SAM_TEMPLATE: 'build/template.yaml'
    -step: &integration-test-cac1
      name: Integration test cac1
      image: golang:buster
      script:
        - git clone git@bitbucket.org:pmmquickstartguides01/systemtests.git
        - cd systemtests
        - go test -v ./... -aws_region=ca-central-1
pipelines:
  default:
    - step: *rununittests
    - step:
        <<: *deploy-test-usw1
        deployment: Test us-west-1
#    - step: *integration-test-usw1
    - step:
        <<: *deploy-staging-use2
        deployment: Staging us-east-2
#    - step: *integration-test-use2
  branches:
    mainline:
      - step:
          <<: *deploy-production-usw2
          deployment: Production us-west-2
#      - step: *integration-test-usw2
      - step:
          <<: *deploy-production-use1
          deployment: Production us-east-1
#      - step: *integration-test-use1
      - step:
          <<: *deploy-production-cac1
          deployment: Production ca-central-1
#      - step: *integration-test-cac1

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. Du musst die "git clone"-Zeile aktualisieren, sodass SystemTests dein SystemTests-Repository ist.

Erläuterungen zur Datei "bitbucket-pipelines.yml"

In diesem Schritt werden Unit-Tests von der SubmitImage-Codebasis aus ausgeführt.

-step: &rununittests
        name: run unit tests
        image: golang:buster
        script:
          - cd submitImage
          - go test ./opendevopslambda/...

In diesem Schritt wird AWS SAM verwendet, um dein AWS Lambda SubmitImage in us-west-2 bereitzustellen. Die Dokumentation zu dieser Pipe findest du hier.

-step: &deploy-usw2-prod
    name: deploy us-west-2 prod
    image: amazon/aws-sam-cli-build-image-provided
    script:
      - curl https://dl.google.com/go/go1.16.3.linux-amd64.tar.gz -o go1.16.3.tar.gz
      - rm -rf /usr/local/go
      - tar -C /usr/local -xzf go1.16.3.tar.gz
      - export PATH=$PATH:/usr/local/go/bin
      - go version
      - make
      - pipe: atlassian/aws-sam-deploy:1.2.0
        variables:
          AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
          AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
          AWS_DEFAULT_REGION: 'us-west-2'
          STACK_NAME: 'OpenDevOpsSubmitImage'
          CAPABILITIES: [ 'CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND' ]
          TEMPLATE: 'https://s3.amazonaws.com/open-devops-code-us-west-2-${AWS_ACCOUNT_ID}/submit-image-packaged.yml'
          WAIT: 'true'
          DEBUG: 'true'
          S3_BUCKET: 'open-devops-code-us-west-2-${AWS_ACCOUNT_ID}'
          SAM_TEMPLATE: 'build/template.yaml'

In diesem Schritt wird das SystemTests-Repository geklont und es werden Integrationstests in us-west-2 durchgeführt. Du musst die "git clone"-Zeile aktualisieren, sodass SystemTests dein SystemTests-Repository ist.

-step: &integration-test-usw2
      name: Integration test usw2
      image: golang:buster
      script:
        - git clone git@bitbucket.org:pmmquickstartguides01/systemtests.git
        - cd systemtests
        - go test -v ./... -aws_region=us-west-2

Pushen an einen Feature Branch

Führe über die Befehlszeile den nachfolgend angegebenen Befehl aus, um deine Änderungen an den Branch "IM-8" des SubmitImage-Repositorys zu pushen.

git add --all
git commit -m "IM-6 add bitbucket-pipelines.yml to SubmitImage"
git push -u origin IM-6

Klicke auf Pipelines und dann auf IM-6, um die laufende Pipeline anzuzeigen.

Screenshot: Bitbucket Cloud-Pipelines

Pull Requests erstellen

Um eine Pull-Anfrage zu erstellen, klicke auf Pull-Anfragen und dann auf Pull-Anfrage erstellen. Schließe die Pull-Anfrage ab und klicke dann auf Pipelines, um das Produktions-Deployment anzuzeigen.

Produktions-Deployment-Pipeline in Bitbucket Cloud

Erstellen eines Repositorys für das AWS Lambda InvokeLabeller

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

Screenshot: Jira-Vorgänge auf einem Jira-Board

Klicke in Bitbucket auf Erstellen und dann auf Repository. Wähle den jeweiligen Arbeitsbereich und das richtige Projekt aus. Lege unter Standard-Branchname den Namen "mainline" fest. Klicke auf Repository erstellen, um fortzufahren.

Erstellen eines InvokeLabeller-Repositorys in Bitbucket

Wechsle in deinem Terminal zum InvokeLabeller-Repository und führe den folgenden Befehl aus, um deinen AWS Lambda-Code an Bitbucket zu pushen. Füge die Jira-Vorgangs-ID in Commit-Nachrichten und Branch-Namen ein, damit die Integration zwischen Jira und Bitbucket die Änderungen am Projekt verfolgen kann.

git add --all
git commit -m "IM-10 add InvokeLabeller to Bitbucket"
git remote add origin git@bitbucket.org:pmmquickstartguides01/invokelabeller.git
git branch -m mainline
git push -u origin mainline

Aktivieren von Pipelines

Navigiere zu Repository-Einstellungen und klicke auf Einstellungen und dann auf Enable pipelines (Pipelines aktivieren).

Aktivieren von Pipelines in den Einstellungen von Bitbucket

Hinzufügen von Repository-Variablen

Klicke auf Repository variables (Repository-Variablen), um deine AWS-Zugriffsschlüssel-ID, deinen geheimen AWS-Zugriffsschlüssel und deine AWS-Konto-ID hinzuzufügen. 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.

Hinzufügen von Repository-Variablen in Bitbucket

Hinzufügen von Deployment-Umgebungen

Klicke auf Deployments und dann auf add environment (Umgebung hinzufügen), um neue Umgebungen hinzuzufügen. In diesem Beispiel gibt es in us-west-1 eine Testumgebung, in us-east-2 eine Staging-Umgebung sowie in us-west-2, us-east-1 und ca-central-1 drei Produktionsumgebungen.

Deployment-Umgebungen in Bitbucket

Erstellen von SSH-Schlüsseln

Wechsle in Bitbucket zu deinem SubmitImage-Repository, und klicke auf Repository-Einstellungen, dann auf "SSH-Schlüssel" und dann auf Generate keys (Schlüssel generieren).

SSH-Schlüsseldetails in Bitbucket Cloud

"bitbucket-pipelines.yml" für das Bereitstellen in AWS

Wechsle in deinem Terminal zum InvokeLabeller-Repository und erstelle einen Branch, den du nach der Jira-Vorgangs-ID benennst.

git checkout -b IM-10

Erstelle die Datei "bitbucket-pipelines.yml" mit dem nachfolgend angegebenen YAML. Dies definiert eine Bitbucket-Pipeline für deine Test-, Staging- und Produktionsumgebungen. Du musst die "git clone"-Zeile aktualisieren, sodass SystemTests dein SystemTests-Repository ist.

definitions:
  steps:
    -step: &rununittests
        name: run unit tests
        image: python:rc-buster
        script:
          - pip3 install pytest
          - pip3 install moto
          - pip3 install -r tst/requirements.txt --user
          - python3 -m pytest -v tst/unit --junitxml=test-reports/report.xml
    -step: &deploy-usw1-test
        name: deploy us-west-1 test
        image: amazon/aws-sam-cli-build-image-python3.8
        script:
          - pipe: atlassian/aws-sam-deploy:1.2.0
            variables:
              AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
              AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
              AWS_DEFAULT_REGION: 'us-west-1'
              STACK_NAME: 'OpenDevOpsImageLabeller'
              CAPABILITIES: [ 'CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND' ]
              TEMPLATE: 'https://s3.amazonaws.com/open-devops-code-us-west-1-${AWS_ACCOUNT_ID}/image-labeller-packaged.yml'
              WAIT: 'true'
              DEBUG: 'true'
              S3_BUCKET: 'open-devops-code-us-west-1-${AWS_ACCOUNT_ID}'
              SAM_TEMPLATE: 'template.yml'
    -step: &integration-test-usw1
      name: integration test usw1
      image: golang:buster
      script:
        - git clone git@bitbucket.org:pmmquickstartguides01/systemtests.git
        - cd systemtests
        - go test -v ./... -aws_region=us-west-1
    -step: &deploy-use2-staging
        name: deploy us-east-2 staging
        image: amazon/aws-sam-cli-build-image-python3.8
        script:
          - BITBUCKET_PIPE_SHARED_STORAGE_DIR="/opt/atlassian/pipelines/agent/build/.bitbucket/pipelines/generated/pipeline/pipes"
          - chmod -R o+rw $BITBUCKET_PIPE_SHARED_STORAGE_DIR
          - pipe: atlassian/aws-sam-deploy:1.2.0
            variables:
              AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
              AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
              AWS_DEFAULT_REGION: 'us-east-2'
              STACK_NAME: 'OpenDevOpsImageLabeller'
              CAPABILITIES: [ 'CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND' ]
              TEMPLATE: 'https://s3.amazonaws.com/open-devops-code-us-east-2-${AWS_ACCOUNT_ID}/image-labeller-packaged.yml'
              WAIT: 'true'
              DEBUG: 'true'
              S3_BUCKET: 'open-devops-code-us-east-2-${AWS_ACCOUNT_ID}'
              SAM_TEMPLATE: 'template.yml'
    -step: &integration-test-use2
      name: integration test use2
      image: golang:buster
      script:
        - git clone git@bitbucket.org:pmmquickstartguides01/systemtests.git
        - cd systemtests
        - go test -v ./... -aws_region=us-east-2
    -step: &deploy-usw2-prod
        name: deploy us-west-2 prod
        image: amazon/aws-sam-cli-build-image-python3.8
        script:
          - pipe: atlassian/aws-sam-deploy:1.2.0
            variables:
              AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
              AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
              AWS_DEFAULT_REGION: 'us-west-2'
              STACK_NAME: 'OpenDevOpsImageLabeller'
              CAPABILITIES: [ 'CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND' ]
              TEMPLATE: 'https://s3.amazonaws.com/open-devops-code-us-west-2-${AWS_ACCOUNT_ID}/image-labeller-packaged.yml'
              WAIT: 'true'
              DEBUG: 'true'
              S3_BUCKET: 'open-devops-code-us-west-2-${AWS_ACCOUNT_ID}'
              SAM_TEMPLATE: 'template.yml'
    -step: &integration-test-usw2
      name: integration test usw2
      image: golang:buster
      script:
        - git clone git@bitbucket.org:pmmquickstartguides01/systemtests.git
        - cd systemtests
        - go test -v ./... -aws_region=us-west-2
    -step: &deploy-use1-prod
        name: deploy us-east-1 prod
        image: amazon/aws-sam-cli-build-image-python3.8
        script:
          - BITBUCKET_PIPE_SHARED_STORAGE_DIR="/opt/atlassian/pipelines/agent/build/.bitbucket/pipelines/generated/pipeline/pipes"
          - chmod -R o+rw $BITBUCKET_PIPE_SHARED_STORAGE_DIR
          - pipe: atlassian/aws-sam-deploy:1.2.0
            variables:
              AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
              AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
              AWS_DEFAULT_REGION: 'us-east-1'
              STACK_NAME: 'OpenDevOpsImageLabeller'
              CAPABILITIES: [ 'CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND' ]
              TEMPLATE: 'https://s3.amazonaws.com/open-devops-code-us-east-1-${AWS_ACCOUNT_ID}/image-labeller-packaged.yml'
              WAIT: 'true'
              DEBUG: 'true'
              S3_BUCKET: 'open-devops-code-us-east-1-${AWS_ACCOUNT_ID}'
              SAM_TEMPLATE: 'template.yml'
    -step: &integration-test-use1
      name: integration test use1
      image: golang:buster
      script:
        - git clone git@bitbucket.org:pmmquickstartguides01/systemtests.git
        - cd systemtests
        - go test -v ./... -aws_region=us-east-1
    -step: &deploy-cac1-prod
        name: deply ca-central-1 prod
        image: amazon/aws-sam-cli-build-image-python3.8
        script:
          - BITBUCKET_PIPE_SHARED_STORAGE_DIR="/opt/atlassian/pipelines/agent/build/.bitbucket/pipelines/generated/pipeline/pipes"
          - chmod -R o+rw $BITBUCKET_PIPE_SHARED_STORAGE_DIR
          - pipe: atlassian/aws-sam-deploy:1.2.0
            variables:
              AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
              AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
              AWS_DEFAULT_REGION: 'ca-central-1'
              STACK_NAME: 'OpenDevOpsImageLabeller'
              CAPABILITIES: [ 'CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND' ]
              TEMPLATE: 'https://s3.amazonaws.com/open-devops-code-ca-central-1-${AWS_ACCOUNT_ID}/image-labeller-packaged.yml'
              WAIT: 'true'
              DEBUG: 'true'
              S3_BUCKET: 'open-devops-code-ca-central-1-${AWS_ACCOUNT_ID}'
              SAM_TEMPLATE: 'template.yml'
    -step: &integration-test-cac1
      name: integration test cac1
      image: golang:buster
      script:
        - git clone git@bitbucket.org:pmmquickstartguides01/systemtests.git
        - cd systemtests
        - go test -v ./... -aws_region=ca-central-1
pipelines:
  default:
    - step: *rununittests
    - step:
        <<: *deploy-usw1-test
        deployment: us-west-1 Test
#    - step: *integration-test-usw1
    - step:
        <<: *deploy-use2-staging
        deployment: us-east-2 Staging
#    - step: *integration-test-use2
  branches:
    mainline:
      - step:
          <<: *deploy-usw2-prod
          deployment: us-west-2 Prod
#      - step: *integration-test-usw2
      - step:
          <<: *deploy-use1-prod
          deployment: us-east-1 Prod
#      - step: *integration-test-use1
      - step:
          <<: *deploy-cac1-prod
          deployment: ca-central-1 Prod
#      - step: *integration-test-cac1

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. Du musst die "git clone"-Zeile aktualisieren, sodass SystemTests dein SystemTests-Repository ist.

Erläuterungen zur Datei "bitbucket-pipelines.yml"

In diesem Schritt werden Unit-Tests von der InvokeLabeller-Codebasis aus ausgeführt.

-step: &rununittests
        name: run unit tests
        image: golang:buster
        script:
          - cd submitImage
          - go test ./opendevopslambda/...

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-10" des InvokeLabeller-Repositorys zu pushen.

git add --all
git commit -m "IM-10 add bitbucket-pipelines.yml to InvokeLabeller"
git push -u origin IM-10

Klicke auf Pipelines und dann auf IM-10, um die laufende Pipeline anzuzeigen.

Anzeigen der laufenden Pipelines in Bitbucket Cloud

Pull Requests erstellen

Um eine Pull-Anfrage zu erstellen, klicke auf Pull-Anfragen und dann auf Pull-Anfrage erstellen. Schließe die Pull-Anfrage ab und klicke dann auf Pipelines, um das Produktions-Deployment anzuzeigen.

Anzeigen des Produktions-Deployments in Bitbucket Pipelines

Erstellen eines Repositorys für SystemTests

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

Anzeigen eines neu erstellten Jira-Vorgangs auf dem Jira-Board

Klicke in Bitbucket auf Erstellen und dann auf Repository.

Erstellen eines Repositorys in Bitbucket

Wähle den jeweiligen Arbeitsbereich und das richtige Projekt aus. Lege unter Standard-Branchname den Namen "mainline" fest. Klicke auf Repository erstellen, um fortzufahren.

Eingeben von Informationen beim Erstellen eines neuen Repositorys in Bitbucket

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

git add --all
git commit -m "IM-7 add SystemTests repository to Bitbucket"
git remote add origin git@bitbucket.org:pmmquickstartguides01/systemtests.git
git branch -M mainline
git push -u origin mainline

Das SystemTests-Repository erfordert keine Datei "bitbucket-pipelines.yml". Es hat keine eigene Pipeline, da es Tests für andere Pipelines bereitstellt. Notiere die SystemTests-Remote-URL. Die CI/CD-Pipelines von SubmitImage, GetImageLabel und InvokeLabeller klonen das SystemTests-Repository während der Testschritte. Du musst "bitbucket-pipelines.yml" für spätere Repositorys mit der richtigen URL aktualisieren.

Hinzufügen von SSH-Schlüsseln von SubmitImage, GetImageLabel und InvokeLabeller

Klicke auf Repository-Einstellungen und dann auf Zugriffsschlüssel.

Seite mit Einstellungen für Zugriffsschlüssel in Bitbucket

Klicke auf Schlüssel hinzufügen, füge den aus SubmitImage, GetImageLabel oder InvokeLabeller kopierten SSH-Schlüssel ein und klicke dann auf Add SSH key (SSH-Schlüssel hinzufügen).

Hinzufügen eines SSH-Schlüssels in Bitbucket

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