Close

Wdrażanie aplikacji ImageLabeller za pomocą Bitbucket

Warren Marusiak — zdjęcie portretowe
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

https://github.com/AtlassianOpenDevOpsGuides

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.

Zrzut ekranu przedstawiający zgłoszenie Jira dotyczące dodania repozytorium infrastruktury AWS S3 do Bitbucket

Przejdź do Bitbucket i wybierz kolejno opcje Create (Utwórz) > Repository (Repozytorium).

Tworzenie repozytorium w Bitbucket

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ć.

Wyskakujące okienko do tworzenia nowego repozytorium w Bitbucket

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).

Włączanie pipeline'ów w Bitbucket

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).

Zmienne repozytorium w Bitbucket

Konfigurowanie środowisk wdrożeniowych

Kliknij opcję Deployments (Wdrożenia).

Ekran ustawień wdrożeń w Bitbucket

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.

Dodawanie środowisk wdrożeniowych w Bitbucket

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.

Uruchamianie pipeline'u w Bitbucket

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.

Szczegóły wykonania pipeline'u w Bitbucket

Tworzenie pull requestu

Aby utworzyć pull request, kliknij Pull requests (Pull requesty), a następnie przycisk Create pull request (Utwórz pull request).

Tworzenie pull requestu w Bitbucket

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).

Okno modalne tworzenia pull requestu w Bitbucket

Przejrzyj zmiany kodu, a następnie kliknij kolejno Approve (Zatwierdź) i Merge (Scal), aby scalić pull request.

Zatwierdzanie i scalanie pull requestu w Bitbucket

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).

Zaznaczanie pola wyboru „Wykonaj przejście zgłoszenia” podczas scalania pull requestu w Bitbucket

Kliknij Pipelines (Pipeline'y), aby monitorować pipeline gałęzi mainline.

Monitorowanie głównego pipeline'u w Bitbucket

Gałąź IM-5 zniknęła. Gałąź mainline pozostała, a pipeline jest uruchomiony. Kliknij pipeline.

Ekran pipeline'u gałęzi mainline w Bitbucket

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).

Ekran wdrożeń w Bitbucket

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).

Wybieranie środowiska, a następnie wersji, do której ma zostać wycofane wdrożenie w Bitbucket

Sprawdź, czy zmiana jest poprawna, a następnie kliknij przycisk Redeploy (Wdróż ponownie).

Weryfikowanie zmian przed wybraniem opcji ponownego wdrożenia w Bitbucket

Ponownie wdrożone zostanie wyłącznie wybrane środowisko.

Okno modalne pipeline'u w Bitbucket przedstawiające wyłącznie ponownie wdrażane 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.

Tworzenie w Jira Software zgłoszenia dotyczącego dodania repozytorium SubmitImage do Bitbucket

Przejdź do Bitbucket i kliknij kolejno Create (Utwórz) i Repository (Repozytorium).

Tworzenie repozytorium w Bitbucket

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ć.

Wyskakujące okno modalne podczas tworzenia nowego repozytorium w Bitbucket

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).

Włączanie pipeline'ów w ustawieniach Pipelines w Bitbucket

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.

Włączanie pipeline'ów w ustawieniach Pipelines w Bitbucket

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.

Środowiska wdrożeniowe w Bitbucket

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).

Generowanie kluczy SSH w Bitbucket

Ten klucz SSH będzie potrzebny podczas tworzenia repozytorium SystemTests.

Szczegóły klucza SSH w Bitbucket

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.

Zrzut ekranu pipeline'ów w Bitbucket Cloud

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.

Pipeline wdrażania w środowisku produkcyjnym w Bitbucket Cloud

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.

Zrzut ekranu przedstawiający zgłoszenia Jira na tablicy Jira

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ć.

Tworzenie repozytorium InvokeLabeller w Bitbucket

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).

Włączanie pipeline'ów w ustawieniach w Bitbucket

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 zmiennych repozytorium w Bitbucket

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.

Środowiska wdrożeniowe w Bitbucket

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).

Szczegóły klucza SSH w Bitbucket Cloud

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.

Wyświetlanie uruchomionych pipeline'ów w Bitbucket Cloud

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.

Wyświetlanie wdrożenia produkcyjnego w Bitbucket Pipelines

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.

Wyświetlanie nowo utworzonego zgłoszenia Jira na tablicy Jira

Przejdź do Bitbucket i kliknij kolejno Create (Utwórz) i Repository (Repozytorium).

Tworzenie repozytorium w Bitbucket

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ć.

Wprowadzanie informacji podczas tworzenia nowego repozytorium w Bitbucket

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).

Strona ustawień kluczy dostępu w Bitbucket

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).

Dodawanie klucza SSH w Bitbucket

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.

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.


Udostępnij ten artykuł

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.

Ilustracja DevOps

Społeczność DevOps

Ilustracja DevOps

Ścieżka szkoleniowa DevOps

Ilustracja przedstawiająca mapę

Zacznij korzystać za darmo

Zapisz się do newslettera DevOps

Thank you for signing up