Artykuły
Samouczki
Interaktywne przewodniki
Wdrażanie aplikacji ImageLabeller za pomocą Bitbucket
Warren Marusiak
Starszy propagator techniczny
Aby zademonstrować sposób opracowywania i wdrażania aplikacji oraz zarządzania nimi przy użyciu Jira Software oraz różnych połączonych narzędzi, nasz zespół utworzył ImageLabeller, prostą aplikację demonstracyjną opartą na usłudze AWS, która wykorzystuje uczenie maszynowe do oznaczania etykietami obrazów.
Na tej stronie opisano, jak wdrożyć aplikację ImageLabeller za pomocą Bitbucket. Przed rozpoczęciem najlepiej zapoznać się ze stronami na temat architektury aplikacji ImageLabeller oraz konfiguracji AWS SageMaker, aby uzyskać kontekst.
Wymagania wstępne
Jeśli nie masz jeszcze skonfigurowanego klucza SSH dla swojego konta Bitbucket, postępuj zgodnie z tymi instrukcjami.
Publiczne repozytoria GitHub z kodem aplikacji ImageLabeller
Film demonstracyjny przedstawiający pipeline'y w Bitbucket
Utworzenie repozytorium dla infrastruktury AWS S3
Standardowa pętla pracy programisty polega zazwyczaj na pobraniu przez programistę zadania z systemu Jira, przeniesieniu go do kolumny prac w toku, a następnie wykonaniu prac programistycznych. Identyfikator zgłoszenia Jira jest kluczem łączącym pracę programisty ze zgłoszeniem Jira. Jest on podstawowym składnikiem integracji między dwoma systemami.
W systemie Jira utwórz nowe zgłoszenie dotyczące dodania repozytorium infrastruktury AWS S3 do Bitbucket. Zanotuj identyfikator zgłoszenia. W tym przykładzie jest to IM-5.
Przejdź do Bitbucket i wybierz kolejno opcje Create (Utwórz) > Repository (Repozytorium).
Wybierz odpowiednie ustawienia w polach Workspace (Przestrzeń robocza) i Project (Projekt). W polu Default branch name (Nazwa gałęzi domyślnej) wpisz mainline. Kliknij przycisk Create repository (Utwórz repozytorium), aby kontynuować.
W terminalu przejdź do repozytorium s3_infra i uruchom poniższe polecenie, aby wypchnąć plik template.yml AWS CloudFormation do Bitbucket.
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
Włącz Bitbucket Pipelines
Wybierz kolejno Repository settings (Ustawienia repozytorium) > Settings (Ustawienia) > Enable Pipelines (Włącz pipeline'y).
Dodawanie zmiennych repozytorium kluczy dostępu AWS
Przejdź do obszaru Repository variables (Zmienne repozytorium), wprowadź identyfikator klucza dostępu AWS i kliknij opcję Add (Dodaj). Następnie wprowadź tajny klucz dostępu AWS i kliknij przycisk Add (Dodaj).
Konfigurowanie środowisk wdrożeniowych
Kliknij opcję Deployments (Wdrożenia).
Kliknij przycisk Add environment (Dodaj środowisko), aby dodać nowe środowiska. W tym przykładzie są używane: środowisko testowe w regionie US-WEST-1, środowisko przejściowe w regionie US-EAST-2 i trzy środowiska produkcyjne w regionach US-WEST-2, US-EAST-1 i CA-CENTRAL-1.
Plik bitbucket-pipelines.yml wdrażania w AWS
Przejdź do repozytorium s3_infra w terminalu i utwórz gałąź o nazwie zgodnej z identyfikatorem zgłoszenia Jira.
git checkout -b IM-5
Utwórz plik bitbucket-pipelines.yml zawierający poniższy kod yaml. Definiuje on wdrożeniowy przepływ pracy dla środowiska testowego, przejściowego i produkcyjnego.
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
Informacje o pliku bitbucket-pipelines.yml
Definicje i kroki
W sekcji definitions zdefiniuj zestaw kroków steps. Każdy krok step ma alias, do którego w całym pliku bitbucket-pipelines.yml występują odwołania, nazwę name wyświetlaną na ekranie wdrożenia w Bitbucket oraz skrypt script. Zawartość sekcji script jest zbiorem składającym się z co najmniej jednego polecenia.
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
W tym kroku zastosowano pipe atlassian/aws-cloudformation-deploy
do wdrożenia zasobników AWS S3 zdefiniowanych w pliku template.yml repozytorium s3_infra.
- pipe: atlassian/aws-cloudformation-deploy:0.10.0
Zbiór dostępnych pipe'ów można znaleźć tutaj. Dokumentacja pipe'u atlassian/aws-cloudformation-deploy
znajduje się tutaj.
Procesy organizacji produkcji
Pipeline'y uruchamiają zbiór kroków. Pipeline domyślny default jest zbiorem kroków uruchamianych dla gałęzi, które nie zostały wyraźnie nazwane w sekcji pipelines. Ten pipeline domyślny uruchamia kroki, których celem jest przeprowadzenie wdrożenia do środowiska testowego i przejściowego.
pipelines:
default:
- step:
<<: *deploy-test-usw1
deployment: Test us-west-1
- step:
<<: *deploy-staging-use2
deployment: Staging us-east-2
Wdrożenia umożliwiają integrację między systemem Jira i Bitbucket.
deployment: Test us-west-1
W sekcji branches można zdefiniować zbiór kroków uruchamianych dla konkretnej nazwanej gałęzi. Poniższy fragment definiuje zbiór kroków dla gałęzi mainline.
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
Więcej informacji na ten temat znajdziesz w tym artykule referencyjnym.
Wypychanie do gałęzi funkcji
Wykonaj poniższą instrukcję z poziomu wiersza polecenia, aby wypchnąć zmiany do gałęzi IM-5 repozytorium s3_infra. Uwzględnij identyfikator zgłoszenia Jira w komunikatach commita oraz nazwach gałęzi, aby wykorzystać integrację systemu Jira z Bitbucket do śledzenia, co dzieje się z Twoim projektem.
git add --all
git commit -m "IM-5 add bitbucket-pipelines.yml"
git push -u origin IM-5
Kliknij Pipelines (Pipeline'y), a następnie IM-5, aby zobaczyć uruchomiony pipeline.
Kliknij sam pipeline, aby zobaczyć szczegóły jego wykonywania. Pipeline wykonał kroki wdrożenia do środowiska testowego w regionie us-west-1 i środowiska przejściowego w regionie us-east-2.
Tworzenie pull requestu
Aby utworzyć pull request, kliknij Pull requests (Pull requesty), a następnie przycisk Create pull request (Utwórz pull request).
Wybierz gałąź funkcji jako gałąź źródłową, zaznacz pole wyboru Close branch (Zamknij gałąź), a następnie kliknij przycisk Create pull request (Utwórz pull request).
Przejrzyj zmiany kodu, a następnie kliknij kolejno Approve (Zatwierdź) i Merge (Scal), aby scalić pull request.
Kliknięcie przycisku Merge (Scal) spowoduje otwarcie ekranu scalania pull requestu. Zaznacz pole wyboru Transition issue (Zmień stan zgłoszenia) i kliknij przycisk Merge (Scal).
Kliknij Pipelines (Pipeline'y), aby monitorować pipeline gałęzi mainline.
Gałąź IM-5 zniknęła. Gałąź mainline pozostała, a pipeline jest uruchomiony. Kliknij pipeline.
Pipeline wykonał kroki wdrożenia w środowiskach produkcyjnych w regionach us-west-2, us-east-1 i ca-central-1. Jeśli pipeline zakończy się niepowodzeniem, można uruchomić go ponownie, klikając przycisk Rerun (Uruchom ponownie).
Cofanie błędnego wdrożenia
Aby wycofać wdrożenie, kliknij Deployments (Wdrożenia).
Kliknij środowisko, z którego chcesz wycofać wdrożenie, a następnie pobierz listę historycznych wdrożeń, wybierz wersję, do której chcesz cofnąć, a następnie kliknij przycisk Redeploy (Wdróż ponownie).
Sprawdź, czy zmiana jest poprawna, a następnie kliknij przycisk Redeploy (Wdróż ponownie).
Ponownie wdrożone zostanie wyłącznie wybrane środowisko.
Utworzenie repozytorium dla funkcji AWS Lambda SubmitImage
Przejdź do systemu Jira i utwórz zgłoszenie Jira dotyczące dodania repozytorium SubmitImage do Bitbucket. Zanotuj identyfikator tego zgłoszenia Jira. W tym przykładzie jest to IM-6.
Przejdź do Bitbucket i kliknij kolejno Create (Utwórz) i Repository (Repozytorium).
Wybierz odpowiednie ustawienia w polach Workspace (Przestrzeń robocza) i Project (Projekt). W polu Default branch name (Nazwa gałęzi domyślnej) wpisz mainline. Kliknij przycisk Create repository (Utwórz repozytorium), aby kontynuować.
W terminalu przejdź do repozytorium SumbitImage i uruchom poniższe polecenie, aby wypchnąć kod AWS Lambda do Bitbucket. Uwzględnij identyfikator zgłoszenia Jira w komunikatach commita oraz nazwach gałęzi, aby wykorzystać integrację systemu Jira z Bitbucket do śledzenia, co dzieje się z Twoim projektem.
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
Włączanie pipeline'ów
Wybierz kolejno Repository settings (Ustawienia repozytorium), Settings (Ustawienia) i Enable Pipelines (Włącz pipeline'y).
Dodawanie zmiennych repozytorium
Kliknij Repository variables (Zmienne repozytorium), aby dodać identyfikator klucza dostępu AWS, tajny klucz dostępu AWS i identyfikator konta AWS. Przyznaj użytkownikowi IAM powiązanemu z kluczem dostępu AWS dostęp administratora. Możesz zdecydować się na użycie bardziej szczegółowych ustawień kontroli dostępu, wybierając poszczególne zasady dostępu AWS.
Dodawanie środowisk wdrożeniowych
Kliknij Deployments (Wdrożenia), a następnie przycisk Add environment (Dodaj środowisko), aby dodać nowe środowiska. W tym przykładzie są używane: środowisko testowe w regionie us-west-1, środowisko przejściowe w regionie us-east-2 i trzy środowiska produkcyjne w regionach us-west-2, us-east-1 i ca-central-1.
Tworzenie kluczy SSH
Przejdź do repozytorium SubmitImage w Bitbucket i kliknij kolejno Repository settings (Ustawienia repozytorium), SSH keys (Klucze SSH) i Generate keys (Generuj klucze).
Ten klucz SSH będzie potrzebny podczas tworzenia repozytorium SystemTests.
Plik bitbucket-pipelines.yml wdrażania w AWS
Przejdź do repozytorium SubmitImage w terminalu i utwórz gałąź o nazwie zgodnej z identyfikatorem zgłoszenia Jira.
git checkout -b IM-6
Utwórz plik bitbucket-pipelines.yml zawierający poniższy kod yaml. Definiuje on pipeline Bitbucket dla środowisk testowego, przejściowego i produkcyjnego. Musisz zaktualizować wiersz git clone dla SystemTests zgodnie z Twoim repozytorium SystemTests.
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
Wykonanie testów integracyjnych jest na ten moment ujęte w komentarz. Testy systemowe zakończą się powodzeniem tylko wówczas, gdy cała aplikacja zostanie wdrożona. Po wdrożeniu wszystkich komponentów aplikacji ImageLabeller usuń oznaczenie komentarzem kroki testów integracyjnych w swoim repozytorium i wykonaj kolejne wypchnięcie, aby uruchomić pipeline wdrożenia. Musisz zaktualizować wiersz git clone dla SystemTests zgodnie z Twoim repozytorium SystemTests.
Informacje o pliku bitbucket-pipelines.yml
Ten krok uruchamia testy jednostkowe z bazy kodu SubmitImage.
-step: &rununittests
name: run unit tests
image: golang:buster
script:
- cd submitImage
- go test ./opendevopslambda/...
Ten krok wykorzystuje AWS SAM do wdrożenia funkcji AWS Lambda SubmitImage w regionie us-west-2. Dokumentację dotyczącą tego pipe'a można znaleźć tutaj.
-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'
To zadanie klonuje repozytorium SystemTests i uruchamia testy integracyjne w regionie us-west-2. Musisz zaktualizować wiersz git clone dla SystemTests zgodnie z Twoim repozytorium SystemTests.
-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
Wypychanie do gałęzi funkcji
Z poziomu wiersza polecenia uruchom poniższe polecenie, aby wypchnąć zmiany do gałęzi IM-8 repozytorium SubmitImage.
git add --all
git commit -m "IM-6 add bitbucket-pipelines.yml to SubmitImage"
git push -u origin IM-6
Kliknij Pipelines (Pipeline'y), a następnie IM-6, aby zobaczyć uruchomiony pipeline.
Tworzenie pull requestu
Aby utworzyć pull request, kliknij Pull requests (Pull requesty), a następnie przycisk Create pull request (Utwórz pull request). Zakończ pull request i kliknij Pipelines (Pipeline'y), aby zobaczyć wdrożenie produkcyjne.
Utworzenie repozytorium dla funkcji AWS Lambda InvokeLabeller
Przejdź do systemu Jira i utwórz zgłoszenie Jira dotyczące dodania repozytorium InvokeLabeller do Bitbucket. Zanotuj identyfikator tego zgłoszenia Jira. W tym przykładzie jest to IM-10.
Przejdź do Bitbucket i kliknij kolejno Create (Utwórz) i Repository (Repozytorium). Wybierz odpowiednie ustawienia w polach Workspace (Przestrzeń robocza) i Project (Projekt). W polu Default branch name (Nazwa gałęzi domyślnej) wpisz mainline. Kliknij przycisk Create repository (Utwórz repozytorium), aby kontynuować.
W terminalu przejdź do repozytorium InvokeLabeller i uruchom poniższe polecenie, aby wypchnąć kod AWS Lambda do Bitbucket. Uwzględnij identyfikator zgłoszenia Jira w komunikatach commita oraz nazwach gałęzi, aby wykorzystać integrację systemu Jira z Bitbucket do śledzenia, co dzieje się z Twoim projektem.
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
Włączanie pipeline'ów
Wybierz kolejno Repository settings (Ustawienia repozytorium), Settings (Ustawienia) i Enable Pipelines (Włącz pipeline'y).
Dodawanie zmiennych repozytorium
Kliknij Repository variables (Zmienne repozytorium), aby dodać identyfikator klucza dostępu AWS, tajny klucz dostępu AWS i identyfikator konta AWS. Przyznaj użytkownikowi IAM powiązanemu z kluczem dostępu AWS dostęp administratora. Możesz zdecydować się na użycie bardziej szczegółowych ustawień kontroli dostępu, wybierając poszczególne zasady dostępu AWS, ale te szczegóły pozostawiamy czytelnikowi.
Dodawanie środowisk wdrożeniowych
Kliknij Deployments (Wdrożenia), a następnie przycisk Add environment (Dodaj środowisko), aby dodać nowe środowiska. W tym przykładzie są używane: środowisko testowe w regionie us-west-1, środowisko przejściowe w regionie us-east-2 i trzy środowiska produkcyjne w regionach us-west-2, us-east-1 i ca-central-1.
Tworzenie kluczy SSH
Przejdź do repozytorium SubmitImage w Bitbucket i kliknij kolejno Repository settings (Ustawienia repozytorium), SSH keys (Klucze SSH) i Generate keys (Generuj klucze).
Plik bitbucket-pipelines.yml wdrażania w AWS
Przejdź do repozytorium InvokeLabeller w terminalu i utwórz gałąź o nazwie zgodnej z identyfikatorem zgłoszenia Jira.
git checkout -b IM-10
Utwórz plik bitbucket-pipelines.yml zawierający poniższy kod yaml. Definiuje on pipeline Bitbucket dla środowisk testowego, przejściowego i produkcyjnego. Musisz zaktualizować wiersz git clone dla SystemTests zgodnie z Twoim repozytorium SystemTests.
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
Wykonanie testów integracyjnych jest na ten moment ujęte w komentarz. Testy systemowe zakończą się powodzeniem tylko wówczas, gdy cała aplikacja zostanie wdrożona. Po wdrożeniu wszystkich komponentów aplikacji ImageLabeller usuń oznaczenie komentarzem kroki testów integracyjnych w swoim repozytorium i wykonaj kolejne wypchnięcie, aby uruchomić pipeline wdrożenia. Musisz zaktualizować wiersz git clone dla SystemTests zgodnie z Twoim repozytorium SystemTests.
Informacje o pliku bitbucket-pipelines.yml
Ten krok uruchamia testy jednostkowe z bazy kodu InvokeLabeller.
-step: &rununittests
name: run unit tests
image: golang:buster
script:
- cd submitImage
- go test ./opendevopslambda/...
Aktualizacja pliku src/app.py o punkt końcowy AWS SageMager
Otwórz plik src/app.py w repozytorium InvokeLabeller i wyszukaj pozycję query_endpoint. Zmień wartości endpoint_name i client region_name zgodnie z notesem AWS SageMaker.
def query_endpoint(img):
endpoint_name = 'jumpstart-dft-image-labeller-endpoint'
client = boto3.client(service_name='runtime.sagemaker', region_name='us-west-1')
response = client.invoke_endpoint(EndpointName=endpoint_name, ContentType='application/x-image', Body=img)
model_predictions = json.loads(response['Body'].read())['predictions'][0]
return model_predictions
Wypychanie do gałęzi funkcji
Z poziomu wiersza polecenia uruchom poniższe polecenie, aby wypchnąć zmiany do gałęzi IM-10 repozytorium InvokeLabeller.
git add --all
git commit -m "IM-10 add bitbucket-pipelines.yml to InvokeLabeller"
git push -u origin IM-10
Kliknij Pipelines (Pipeline'y), a następnie IM-10, aby zobaczyć uruchomiony pipeline.
Tworzenie pull requestu
Aby utworzyć pull request, kliknij Pull requests (Pull requesty), a następnie przycisk Create pull request (Utwórz pull request). Zakończ pull request i kliknij Pipelines (Pipeline'y), aby zobaczyć wdrożenie produkcyjne.
Tworzenie repozytorium SystemTests
Przejdź do systemu Jira i utwórz nowe zgłoszenie dotyczące dodania repozytorium SystemTests do Bitbucket. Zanotuj identyfikator zgłoszenia. W tym przykładzie jest to IM-7.
Przejdź do Bitbucket i kliknij kolejno Create (Utwórz) i Repository (Repozytorium).
Wybierz odpowiednie ustawienia w polach Workspace (Przestrzeń robocza) i Project (Projekt). W polu Default branch name (Nazwa gałęzi domyślnej) wpisz mainline. Kliknij przycisk Create repository (Utwórz repozytorium), aby kontynuować.
W terminalu przejdź do repozytorium SystemTests i uruchom poniższe polecenie, aby wypchnąć kod do Bitbucket.
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
Repozytorium SystemTests nie wymaga pliku bitbucket-pipelines.yml. Nie ma własnych pipeline'ów, ponieważ udostępnia testy do uruchomienia w innych pipeline'ach. Zwróć uwagę na zdalny adres URL repozytorium SystemTests. Pipeline'y CI/CD SubmitImage, GetImageLabel i InvokeLabeller będą klonować repozytorium SystemTests podczas poszczególnych kroków testów. Konieczne będzie zaktualizowanie plików bitbucket-pipelines.yml utworzonych później repozytoriów o poprawny adres URL.
Dodawanie kluczy SSH z repozytoriów SubmitImage, GetImageLabel i InvokeLabeller
Kliknij Repository settings (Ustawienia repozytorium), a następnie Access keys (Klucze dostępu).
Kliknij przycisk Add key (Dodaj klucz), wklej klucz SSH skopiowany z repozytorium SubmitImage, GetImageLabel lub InvokeLabeller, a następnie kliknij przycisk Add SSH key (Dodaj klucz SSH).
Jeśli udało Ci się dotrzeć aż tutaj, to gratuluję! Aplikacja ImageLabeller została wdrożona. Kolejnym krokiem będzie skonfigurowanie monitorowania aplikacji ImageLabeller przy użyciu Opsgenie.
Udostępnij ten artykuł
Następny temat
Zalecane lektury
Dodaj te zasoby do zakładek, aby dowiedzieć się więcej na temat rodzajów zespołów DevOps lub otrzymywać aktualności na temat metodyki DevOps w Atlassian.