Bereitstellen von ImageLabeller mit Bitbucket
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
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".
Klicke in Bitbucket auf Erstellen > 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.
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).
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.
Einrichten von Deployment-Umgebungen
Klicke auf Deployments.
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.
"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.
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.
Pull Requests erstellen
Um eine Pull-Anfrage zu erstellen, klicke auf Pull-Anfragen und dann auf Pull-Anfrage erstellen.
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.
Überprüfe die Code-Änderungen, genehmige und merge die Pull-Anfrage.
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.
Klicke auf Pipelines, um die "mainline"-Pipeline zu überwachen.
Der Branch "IM-5" ist nicht mehr vorhanden. Der "mainline"-Branch ist noch übrig und eine Pipeline wird ausgeführt. Klicke auf die Pipeline.
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.
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).
Vergewissere dich, dass die Änderung korrekt ist, und klicke auf Redeploy (Erneut bereitstellen).
Nur die gewählte Umgebung wird neu bereitgestellt.
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".
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.
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).
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.
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.
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).
Du benötigst diesen SSH-Schlüssel beim Erstellen des SystemTests-Repositorys.
"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.
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.
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".
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.
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).
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 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.
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).
"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.
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.
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".
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.
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.
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).
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.
Diesen Artikel teilen
Nächstes Thema
Lesenswert
Füge diese Ressourcen deinen Lesezeichen hinzu, um mehr über DevOps-Teams und fortlaufende Updates zu DevOps bei Atlassian zu erfahren.