Close

Wdrażanie aplikacji ImageLabeller za pomocą GitHub

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ą GitHub. 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 organizacji GitHub, utwórz ją od podstaw, wykonując procedurę opisaną w tym przewodniku GitHub.

Publiczne repozytoria GitHub z kodem aplikacji ImageLabeller

https://github.com/AtlassianOpenDevOpsGuides

Film z demonstracją integracji systemu Jira z GitHub

Integracja systemu Jira z GitHub

W systemie Jira kliknij kolejno opcje Tablica, Aplikacje, a następnie GitHub.

Menu rozwijane aplikacji w JSW

Kliknij przycisk Pobierz teraz.

Aplikacja GitHub dla JSW

Kliknij Aplikacje, a następnie Zarządzaj aplikacjami i rozwiń pozycję GitHub.

Obraz przedstawiający ekran zarządzania aplikacjami w JSW

Kliknij przycisk Rozpocznij.

Kliknij przycisk Rozpocznij.

Obraz przedstawiający ekran konfiguracji GitHub

Instalacja wtyczki Jira w GitHub

Kliknij opcję Install Jira (Zainstaluj system Jira), aby zainstalować wtyczkę Jira w GitHub. Ten krok jest konieczny, jeśli wtyczka Jira nie została jeszcze zainstalowana w GitHub.

Obraz przedstawiający ekran łączenia organizacji GitHub z systemem Jira

System Jira rozpocznie synchronizację danych z GitHub.

Po zakończeniu synchronizacji Status synchronizacji zmieni się na UKOŃCZONO.

Zrzut ekranu zmiany stanu synchronizacji

Konfiguracja dostępu SSH

Skonfiguruj klucze SSH GitHub dla swojego konta, wykonując instrukcje opisane tutaj. Tutaj możesz znaleźć dodatkowe materiały referencyjne.

Konfiguracja osobistego tokena dostępu

Skonfiguruj osobisty token dostępu (PAT) zgodnie z tym przewodnikiem. Służy on do klonowania repozytorium SystemTests podczas procedury testowania integracji. Przyznaj tokenowi dostęp do repozytorium i przepływu pracy.

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 przystąpieniu do 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.

Przejdź do systemu Jira i utwórz nowe zgłoszenie dotyczące dodania repozytorium infrastruktury AWS S3 do GitHub. Zanotuj identyfikator zgłoszenia. W tym przykładzie jest to IM-9.

Infrastruktura AWS S3

Przejdź do GitHub i kliknij opcję New (Nowy). Wybierz odpowiednią organizację w pozycji Owner (Właściciel). Kliknij przycisk Create repository (Utwórz repozytorium), aby kontynuować.

Dodawanie zmiennych repozytorium kluczy dostępu AWS

Kliknij kolejno opcje Settings (Ustawienia) i Secrets (Klucze tajne). Kliknij opcję New repository secret (Nowy klucz tajny repozytorium), a następnie dodaj identyfikator klucza dostępu AWS oraz klucz tajny dostępu 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.

W terminalu przejdź do repozytorium s3_infra i uruchom poniższe polecenie, aby wypchnąć je do GitHub.

git add --all
git commit -m "IM-9 add s3_infra repository to github"
git remote add origin git@github.com:PmmQuickStartGuides01/s3_infra.git
git branch -m mainline
git push -u origin mainline

Czynności GitHub wdrażania w AWS

Przejdź do repozytorium s3_infra w terminalu, utwórz gałąź o nazwie odpowiadającej identyfikatorowi zgłoszenia Jira i utwórz katalog .github/workflows.

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

W nowo utworzonym katalogu .github/workflows utwórz plik deploy-test-staging.yml zawierający poniższy kod yaml. Spowoduje to zdefiniowanie wdrożeniowego przepływu pracy dla środowisk testowych i przejściowych, który będzie uruchamiany podczas wypychania kodu do gałęzi innych niż mainline.

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

jobs:
  deploy-us-west-1:
    runs-on: ubuntu-latest
    outputs:
      env-name: ${{ steps.env-name.outputs.environment }}
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Configure AWS credentials
        id: creds
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: "us-west-1"
      - name: Deploy to AWS CloudFormation
        uses: aws-actions/aws-cloudformation-github-deploy@v1
        with:
          name: OpenDevOpsS3Infra
          template: template.yml
          no-fail-on-empty-changeset: "1"

  deploy-us-east-2:
    runs-on: ubuntu-latest
    needs: deploy-us-west-1
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Configure AWS credentials
        id: creds
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: "us-east-2"
      - name: Deploy to AWS CloudFormation
        uses: aws-actions/aws-cloudformation-github-deploy@v1
        with:
          name: OpenDevOpsS3Infra
          template: template.yml
          no-fail-on-empty-changeset: "1"

Następnie utwórz plik deploy-prod.yml zawierający poniższy kod yaml. Spowoduje to zdefiniowanie wdrożeniowego przepływu pracy dla środowisk produkcyjnych, który będzie uruchamiany podczas scalania zmian z pull requestu z gałęzią mainline.

name: deploy-s3-infra-prod
on:
  pull_request:
    branches:
      - mainline

jobs:
  deploy-us-west-2:
    runs-on: ubuntu-latest
    outputs:
      env-name: ${{ steps.env-name.outputs.environment }}
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Configure AWS credentials
        id: creds
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: "us-west-2"
      - name: Deploy to AWS CloudFormation
        uses: aws-actions/aws-cloudformation-github-deploy@v1
        with:
          name: OpenDevOpsS3Infra
          template: template.yml
          no-fail-on-empty-changeset: "1"

  deploy-ca-central-1:
    runs-on: ubuntu-latest
    needs: deploy-us-west-2
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Configure AWS credentials
        id: creds
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: "ca-central-1"
      - name: Deploy to AWS CloudFormation
        uses: aws-actions/aws-cloudformation-github-deploy@v1
        with:
          name: OpenDevOpsS3Infra
          template: template.yml
          no-fail-on-empty-changeset: "1"

  deploy-us-east-1:
    runs-on: ubuntu-latest
    needs: deploy-ca-central-1
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Configure AWS credentials
        id: creds
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: "us-east-1"
      - name: Deploy to AWS CloudFormation
        uses: aws-actions/aws-cloudformation-github-deploy@v1
        with:
          name: OpenDevOpsS3Infra
          template: template.yml
          no-fail-on-empty-changeset: "1"

Informacje o czynnościach GitHub

Wyzwalacze

Nad tymi plikami zadeklaruj zdarzenia, które będą wyzwalały przepływ pracy. W pliku deploy-test-staging.yml zdarzenie jest wypychane do wszystkich gałęzi z wyjątkiem mainline.

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

Wiele zdarzeń może wyzwalać przepływy pracy. Więcej informacji znajdziesz w dokumentacji dostępnej tutaj.

Zadania

Przepływ pracy zawiera wiele zadań, które są uruchamiane, gdy wystąpi zdarzenie wyzwalające. Każde zadanie składa się ze zbioru kroków, które są uruchamiane podczas wykonywania zadania. W tym przykładzie przewidziano krok wyewidencjonowania kodu z repozytorium, skonfigurowania poświadczeń AWS oraz wdrożenia do AWS przy użyciu AWS CloudFormation.

jobs:
  deploy-us-west-1:
    runs-on: ubuntu-latest
    outputs:
      env-name: ${{ steps.env-name.outputs.environment }}
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Configure AWS credentials
        id: creds
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: "us-west-1"
      - name: Deploy to AWS CloudFormation
        uses: aws-actions/aws-cloudformation-github-deploy@v1
        with:
          name: OpenDevOpsS3Infra
          template: template.yml
          no-fail-on-empty-changeset: "1"

Więcej informacji na temat zadań znajdziesz tutaj, a na temat kroków tutaj.

Wymuszanie kolejności za pomocą polecenia needs

Można zdefiniować kolejność wykonywania zadań za pomocą polecenia needs. Domyślnie GitHub uruchomi wszystkie kroki równolegle. Za pomocą polecenia needs można uzależnić jeden krok od drugiego.

deploy-us-east-1:
    runs-on: ubuntu-latest
    needs: deploy-ca-central-1
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Configure AWS credentials
        id: creds
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: "us-east-1"
      - name: Deploy to AWS CloudFormation
        uses: aws-actions/aws-cloudformation-github-deploy@v1
        with:
          name: OpenDevOpsS3Infra
          template: template.yml
          no-fail-on-empty-changeset: "1"

Wypychanie do gałęzi funkcji

Z poziomu wiersza polecenia uruchom poniższe polecenie, aby wypchnąć kod do gałęzi IM-9 repozytorium s3_infra.

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

Kliknij Actions (Czynności), aby zobaczyć uruchomione przepływy pracy.

Obraz przedstawiający ekran uruchomionych przepływów pracy

Tworzenie pull requestu

Kliknij Pull requests (Pull requesty), a następnie przycisk Create pull request (Utwórz pull request).

Obraz przedstawiający ekran porównywania zmian

Wybierz gałąź funkcji jako gałąź źródłową, a następnie kliknij przycisk Create pull request (Utwórz pull request).

Obraz przedstawiający ekran tworzenia pull requestu

Przejrzyj zmiany kodu, a następnie kliknij przycisk Merge pull request (Scal pull request), aby zaakceptować zmiany.

Kliknij Actions (Czynności), aby sprawdzić, czy wdrożenie produkcyjne zostało uruchomione. GitHub uruchamia zadania w pliku deploy-prod.yml, ponieważ jest to gałąź mainline.

Utworzenie repozytorium dla funkcji AWS Lambda SubmitImage

Przejdź do systemu Jira i utwórz zgłoszenie Jira dotyczące dodania repozytorium funkcji AWS Lambda SubmitImage do GitHub. Zanotuj identyfikator tego zgłoszenia Jira. W tym przykładzie jest to IM-8.

Obraz przedstawiający tablicę IM

Przejdź do GitHub i kliknij opcję New (Nowy). Wybierz odpowiednią organizację w pozycji Owner (Właściciel). Kliknij przycisk Create repository (Utwórz repozytorium), aby kontynuować.

Kliknij kolejno opcje Settings (Ustawienia) i Secrets (Klucze tajne). Dodaj swój osobisty token dostępu jako ACCESS_KEY, identyfikator Twojego klucza dostępu AWS jako AWS_ACCESS_KEY_ID, Twój tajny klucz dostępu AWS jako AWS_SECRET_ACCESS_KEY oraz identyfikator Twojego konta AWS jako AWS_ACCOUNT_ID.

W terminalu przejdź do repozytorium SumbitImage i uruchom poniższe polecenie, aby wypchnąć kod do GitHub.

git add --all
git commit -m "IM-8 add SubmitImage to github"
git remote add origin git@github.com:PmmQuickStartGuides01/submitImage.git
git branch -m mainline
git push -u origin mainline
Czynności GitHub wdrażania w AWS

Przejdź do repozytorium SubmitImage w terminalu, utwórz gałąź o nazwie odpowiadającej identyfikatorowi zgłoszenia Jira i utwórz katalog .github/workflows.

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

W nowo utworzonym katalogu .github/workflows utwórz plik deploy-test-staging.yml zawierający poniższy kod yaml. Spowoduje to zdefiniowanie wdrożeniowego przepływu pracy dla środowisk testowych i przejściowych, który będzie uruchamiany podczas wypychania kodu do gałęzi innych niż mainline. Musisz zaktualizować wiersz git clone dla SystemTests zgodnie z Twoim repozytorium SystemTests.

name: deploy-submit-image-test-staging
on:
  push:
    branches:
      - '*'
      - '!mainline'

env:
  aws_account_id: ${{secrets.AWS_ACCOUNT_ID}}

jobs:
  run-unit-tests:
    runs-on: ubuntu-latest
    steps:
      - name: Install Go
        uses: actions/setup-go@v2
        with:
          go-version: 1.16.x
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Test
        run: |
          cd ${{ github.workspace }}/submitImage
          ls
          go test ./opendevopslambda...

  deploy-us-west-1:
    runs-on: ubuntu-latest
    needs: run-unit-tests
    outputs:
      env-name: ${{ steps.env-name.outputs.environment }}
    steps:
      - name: Install Go
        uses: actions/setup-go@v2
        with:
          go-version: 1.16.x
      - uses: actions/checkout@v2
      - name: Configure AWS credentials
        id: creds
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: "us-west-1"
      - name: SAM Validate
        run: |
          sam --version
          sam validate
      - name: SAM Build
        run: |
          sam build
      - name: SAM Deploy
        continue-on-error: true
        run: |
          sam deploy --template-file .aws-sam/build/template.yaml \
            --stack-name "OpenDevOpsSubmitImage" \
            --s3-bucket "open-devops-code-us-west-1-${aws_account_id}" \
            --capabilities CAPABILITY_IAM CAPABILITY_NAMED_IAM

            #  integration-test-us-west-1:
            #    runs-on: ubuntu-latest
            #    needs: deploy-us-west-1
            #    steps:
            #      - name: Pull systemTests repo
            #        uses: actions/checkout@master
            #        with:
            #          repository: PmmQuickStartGuides01/systemTests
            #          token: ${{ secrets.ACCESS_KEY }}
            #      - name: Configure AWS credentials
            #        id: creds
            #        uses: aws-actions/configure-aws-credentials@v1
            #        with:
            #          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
            #          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
            #          aws-region: "us-west-1"
            #      - name: Install Go
            #        uses: actions/setup-go@v2
            #        with:
            #          go-version: 1.16.x
            #      - name: Run integration tests
            #        run: go test -v ./... -aws_region=us-west-1

  deploy-us-east-2:
    runs-on: ubuntu-latest
    needs: deploy-us-west-1
    outputs:
      env-name: ${{ steps.env-name.outputs.environment }}
    steps:
      - name: Install Go
        uses: actions/setup-go@v2
        with:
          go-version: 1.16.x
      - uses: actions/checkout@v2
      - name: Configure AWS credentials
        id: creds
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: "us-east-2"
      - name: SAM Validate
        run: |
          sam --version
          sam validate
      - name: SAM Build
        run: |
          sam build
      - name: SAM Deploy
        continue-on-error: true
        run: |
          sam deploy --template-file .aws-sam/build/template.yaml \
            --stack-name "OpenDevOpsSubmitImage" \
            --s3-bucket "open-devops-code-us-east-2-${aws_account_id}" \
            --capabilities CAPABILITY_IAM CAPABILITY_NAMED_IAM

            #  integration-test-us-east-2:
            #    runs-on: ubuntu-latest
            #    needs: deploy-us-east-2
            #    steps:
            #      - name: Pull systemTests repo
            #        uses: actions/checkout@master
            #        with:
            #          repository: PmmQuickStartGuides01/systemTests
            #          token: ${{ secrets.ACCESS_KEY }}
            #      - name: Configure AWS credentials
            #        id: creds
            #        uses: aws-actions/configure-aws-credentials@v1
            #        with:
            #          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
            #          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
            #          aws-region: "us-east-2"
            #      - name: Install Go
            #        uses: actions/setup-go@v2
            #        with:
            #          go-version: 1.16.x
            #      - name: Run integration tests
            #        run: go test -v ./... -aws_region=us-east-2

Następnie utwórz plik deploy-prod.yml zawierający poniższy kod yaml. Spowoduje to zdefiniowanie wdrożeniowego przepływu pracy dla środowisk produkcyjnych, który będzie uruchamiany podczas scalania zmian z pull requestu z gałęzią mainline.

name: deploy-submit-image-prod
on:
  pull_request:
    branches:
      - mainline

env:
  aws_account_id: ${{secrets.AWS_ACCOUNT_ID}}

jobs:
  deploy-us-west-2:
    runs-on: ubuntu-latest
    outputs:
      env-name: ${{ steps.env-name.outputs.environment }}
    steps:
      - name: Install Go
        uses: actions/setup-go@v2
        with:
          go-version: 1.16.x
      - uses: actions/checkout@v2
      - name: Configure AWS credentials
        id: creds
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: "us-west-2"
      - name: SAM Validate
        run: |
          sam --version
          sam validate
      - name: SAM Build
        run: |
          sam build
      - name: SAM Deploy
        continue-on-error: true
        run: |
          sam deploy --template-file .aws-sam/build/template.yaml \
            --stack-name "OpenDevOpsSubmitImage" \
            --s3-bucket "open-devops-code-us-west-2-${aws_account_id}" \
            --capabilities CAPABILITY_IAM CAPABILITY_NAMED_IAM

            #  integration-test-us-west-2:
            #    runs-on: ubuntu-latest
            #    needs: deploy-us-west-2
            #    steps:
            #      - name: Pull systemTests repo
            #        uses: actions/checkout@master
            #        with:
            #          repository: PmmQuickStartGuides01/systemTests
            #          token: ${{ secrets.ACCESS_KEY }}
            #      - name: Configure AWS credentials
            #        id: creds
            #        uses: aws-actions/configure-aws-credentials@v1
            #        with:
            #          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
            #          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
            #          aws-region: "us-west-2"
            #      - name: Install Go
            #        uses: actions/setup-go@v2
            #        with:
            #          go-version: 1.16.x
            #      - name: Run integration tests
            #        run: go test -v ./... -aws_region=us-west-2

  deploy-us-east-1:
    runs-on: ubuntu-latest
    needs: deploy-us-west-2
    outputs:
      env-name: ${{ steps.env-name.outputs.environment }}
    steps:
      - name: Install Go
        uses: actions/setup-go@v2
        with:
          go-version: 1.16.x
      - uses: actions/checkout@v2
      - name: Configure AWS credentials
        id: creds
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: "us-east-1"
      - name: SAM Validate
        run: |
          sam --version
          sam validate
      - name: SAM Build
        run: |
          sam build
      - name: SAM Deploy
        continue-on-error: true
        run: |
          sam deploy --template-file .aws-sam/build/template.yaml \
            --stack-name "OpenDevOpsSubmitImage" \
            --s3-bucket "open-devops-code-us-east-1-${aws_account_id}" \
            --capabilities CAPABILITY_IAM CAPABILITY_NAMED_IAM

            #  integration-test-us-east-1:
            #    runs-on: ubuntu-latest
            #    needs: deploy-us-east-1
            #    steps:
            #      - name: Pull systemTests repo
            #        uses: actions/checkout@master
            #        with:
            #          repository: PmmQuickStartGuides01/systemTests
            #          token: ${{ secrets.ACCESS_KEY }}
            #      - name: Configure AWS credentials
            #        id: creds
            #        uses: aws-actions/configure-aws-credentials@v1
            #        with:
            #          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
            #          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
            #          aws-region: "us-east-1"
            #      - name: Install Go
            #        uses: actions/setup-go@v2
            #        with:
            #          go-version: 1.16.x
            #      - name: Run integration tests
            #        run: go test -v ./... -aws_region=us-east-1

  deploy-ca-central-1:
    runs-on: ubuntu-latest
    needs: deploy-us-east-1
    outputs:
      env-name: ${{ steps.env-name.outputs.environment }}
    steps:
      - name: Install Go
        uses: actions/setup-go@v2
        with:
          go-version: 1.16.x
      - uses: actions/checkout@v2
      - name: Configure AWS credentials
        id: creds
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: "ca-central-1"
      - name: SAM Validate
        run: |
          sam --version
          sam validate
      - name: SAM Build
        run: |
          sam build
      - name: SAM Deploy
        continue-on-error: true

        run: |
          sam deploy --template-file .aws-sam/build/template.yaml \
            --stack-name "OpenDevOpsSubmitImage" \
            --s3-bucket "open-devops-code-ca-central-1-${aws_account_id}" \
            --capabilities CAPABILITY_IAM CAPABILITY_NAMED_IAM

            #  integration-test-ca-central-1:
            #    runs-on: ubuntu-latest
            #    needs: deploy-ca-central-1
            #    steps:
            #      - name: Pull systemTests repo
            #        uses: actions/checkout@master
            #        with:
            #          repository: PmmQuickStartGuides01/systemTests
            #          token: ${{ secrets.ACCESS_KEY }}
            #      - name: Configure AWS credentials
            #        id: creds
            #        uses: aws-actions/configure-aws-credentials@v1
            #        with:
            #          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
            #          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
            #          aws-region: "ca-central-1"
            #      - name: Install Go
            #        uses: actions/setup-go@v2
            #        with:
            #          go-version: 1.16.x
            #      - name: Run integration tests
            #        run: go test -v ./... -aws_region=ca-central-1

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. Zaktualizuj sekcję needs, aby poszczególne kroki zostały wykonane w odpowiedniej kolejności. Musisz zaktualizować wiersz git clone dla SystemTests zgodnie z Twoim repozytorium SystemTests.

needs: deploy-us-east-1
Informacje o czynnościach GitHub

To zadanie wykorzystuje AWS SAM do wdrożenia funkcji AWS Lambda SubmitImage w regionie us-west-2.

deploy-us-west-2:
    runs-on: ubuntu-latest
    outputs:
      env-name: ${{ steps.env-name.outputs.environment }}
    steps:
      - name: Install Go
        uses: actions/setup-go@v2
        with:
          go-version: 1.16.x
      - uses: actions/checkout@v2
      - name: Configure AWS credentials
        id: creds
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: "us-west-2"
      - name: SAM Validate
        run: |
          sam --version
          sam validate
      - name: SAM Build
        run: |
          sam build
      - name: SAM Deploy
        continue-on-error: true
        run: |
          sam deploy --template-file .aws-sam/build/template.yaml \
            --stack-name "OpenDevOpsSubmitImage" \
            --s3-bucket "open-devops-code-us-west-2-${aws_account_id}" \
            --capabilities CAPABILITY_IAM CAPABILITY_NAMED_IAM

To zadanie klonuje repozytorium SystemTests i uruchamia testy integracyjne w regionie us-west-2.

integration-test-us-west-2:
    runs-on: ubuntu-latest
    needs: deploy-us-west-2
    steps:
      - name: Pull systemTests repo
        uses: actions/checkout@master
        with:
          repository: PmmQuickStartGuides01/systemTests
          token: ${{ secrets.ACCESS_KEY }}
      - name: Configure AWS credentials
        id: creds
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: "us-west-2"
      - name: Install Go
        uses: actions/setup-go@v2
        with:
          go-version: 1.16.x
      - name: Run integration tests
        run: go test -v ./... -aws_region=us-west-2

Ten krok wykorzystuje osobisty token dostępu do sklonowania repozytorium SystemTests.

    - name: Pull systemTests repo
        uses: actions/checkout@master
        with:
          repository: PmmQuickStartGuides01/systemTests
          token: ${{ secrets.ACCESS_KEY }}
Wypychanie do gałęzi funkcji

Wykonaj poniższą instrukcję z poziomu wiersza polecenia, aby wypchnąć zmiany do gałęzi IM-8 repozytorium SubmitImage. Uwzględnij identyfikator zgłoszenia Jira w komunikatach commita oraz nazwach gałęzi, aby wykorzystać integrację systemu Jira z GitHub do śledzenia, co dzieje się z Twoim projektem.

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

Kliknij Actions (Czynności), aby zobaczyć uruchomione przepływy pracy.

Zwróć uwagę, że zadanie testu jednostkowego zostało zakończone z pomyślnym wynikiem i rozpoczęto wdrażanie do środowiska testowego w regionie us-west-1.

Zdefiniowane wcześniej testy systemowe są uruchamiane w ramach zadań integration-test-us-west-1 i integration-test-us-east-2.

Tworzenie pull requestu

Aby utworzyć pull request, kliknij Pull requests (Pull requesty), a następnie opcję New pull request (Nowy pull request).

Wybierz opcję scalenia z poziomu gałęzi funkcji.

Kliknij przycisk Create pull request (Utwórz pull request).

Scal pull request i usuń gałąź funkcji. Kliknij Actions (Czynności), aby monitorować wdrożenie produkcyjne.

Utworzenie repozytorium dla funkcji AWS Lambda InvokeLabeller

Przejdź do systemu Jira i utwórz zgłoszenie Jira dotyczące dodania repozytorium funkcji AWS Lambda InvokeLabeller do GitHub. Zanotuj identyfikator tego zgłoszenia Jira. W tym przykładzie jest to IM-11.

Przejdź do GitHub i kliknij opcję New (Nowy). Wybierz odpowiednią organizację w pozycji Owner (Właściciel). Kliknij przycisk Create repository (Utwórz repozytorium), aby kontynuować.

Kliknij kolejno opcje Settings (Ustawienia) i Secrets (Klucze tajne). Dodaj swój osobisty token dostępu jako ACCESS_KEY, identyfikator Twojego klucza dostępu AWS jako AWS_ACCESS_KEY_ID, Twój tajny klucz dostępu AWS jako AWS_SECRET_ACCESS_KEY oraz identyfikator Twojego konta AWS jako AWS_ACCOUNT_ID.

W terminalu przejdź do repozytorium InvokeLabeller i uruchom poniższe polecenie, aby wypchnąć kod do GitHub.

git add --all
git commit -m "IM-11 add InvokeLabeller to github"
git remote add origin git@github.com:PmmQuickStartGuides01/InvokeLabeller.git
git branch -m mainline
git push -u origin mainline
Czynności GitHub wdrażania w AWS

Przejdź do repozytorium InvokeLabeller w terminalu, utwórz gałąź o nazwie odpowiadającej identyfikatorowi zgłoszenia Jira i utwórz katalog .github/workflows.

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

W nowo utworzonym katalogu .github/workflows utwórz plik deploy-test-staging.yml zawierający poniższy kod yaml. Spowoduje to zdefiniowanie wdrożeniowego przepływu pracy dla środowisk testowych i przejściowych, który będzie uruchamiany podczas wypychania kodu do gałęzi innych niż mainline. Musisz zaktualizować wiersz git clone dla SystemTests zgodnie z Twoim repozytorium SystemTests.

name: deploy-invoke-labeller-test-staging
on:
  push:
    branches:
      - '*'
      - '!mainline'

env:
  aws_account_id: ${{secrets.AWS_ACCOUNT_ID}}

jobs:
  run-unit-tests:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      - uses: actions/setup-python@v2
        with:
          python-version: '3.x'
      - name: Test
        run: |
          pip3 install pytest
          pip3 install moto
          pip3 install -r tst/requirements.txt --user
          python3 -m pytest -v tst/unit --junitxml=test-reports/report.xml

  deploy-us-west-1:
    runs-on: ubuntu-latest
    needs: run-unit-tests
    outputs:
      env-name: ${{ steps.env-name.outputs.environment }}
    steps:
      - name: Install Go
        uses: actions/setup-go@v2
        with:
          go-version: 1.16.x
      - uses: actions/checkout@v2
      - name: Configure AWS credentials
        id: creds
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: "us-west-1"
      - name: SAM Validate
        run: |
          sam --version
          sam validate
      - name: SAM Build
        run: |
          sam build
      - name: SAM Deploy
        continue-on-error: true
        run: |
          sam deploy --template-file .aws-sam/build/template.yaml \
            --stack-name "OpenDevOpsImageLabeller" \
            --s3-bucket "open-devops-code-us-west-1-${aws_account_id}" \
            --capabilities CAPABILITY_IAM CAPABILITY_NAMED_IAM

            #  integration-test-us-west-1:
            #    runs-on: ubuntu-latest
            #    needs: deploy-us-west-1
            #    steps:
            #      - name: Pull systemTests repo
            #        uses: actions/checkout@master
            #        with:
            #          repository: PmmQuickStartGuides01/systemTests
            #          token: ${{ secrets.ACCESS_KEY }}
            #      - name: Configure AWS credentials
            #        id: creds
            #        uses: aws-actions/configure-aws-credentials@v1
            #        with:
            #          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
            #          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
            #          aws-region: "us-west-1"
            #      - name: Install Go
            #        uses: actions/setup-go@v2
            #        with:
            #          go-version: 1.16.x
            #      - name: Run integration tests
            #        run: go test -v ./... -aws_region=us-west-1

  deploy-us-east-2:
    runs-on: ubuntu-latest
    needs: deploy-us-west-1
    outputs:
      env-name: ${{ steps.env-name.outputs.environment }}
    steps:
      - name: Install Go
        uses: actions/setup-go@v2
        with:
          go-version: 1.16.x
      - uses: actions/checkout@v2
      - name: Configure AWS credentials
        id: creds
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: "us-east-2"
      - name: SAM Validate
        run: |
          sam --version
          sam validate
      - name: SAM Build
        run: |
          sam build
      - name: SAM Deploy
        continue-on-error: true
        run: |
          sam deploy --template-file .aws-sam/build/template.yaml \
            --stack-name "OpenDevOpsImageLabeller" \
            --s3-bucket "open-devops-code-us-east-2-${aws_account_id}" \
            --capabilities CAPABILITY_IAM CAPABILITY_NAMED_IAM

            #  integration-test-us-east-2:
            #    runs-on: ubuntu-latest
            #    needs: deploy-us-east-2
            #    steps:
            #      - name: Pull systemTests repo
            #        uses: actions/checkout@master
            #        with:
            #          repository: PmmQuickStartGuides01/systemTests
            #          token: ${{ secrets.ACCESS_KEY }}
            #      - name: Configure AWS credentials
            #        id: creds
            #        uses: aws-actions/configure-aws-credentials@v1
            #        with:
            #          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
            #          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
            #          aws-region: "us-east-2"
            #      - name: Install Go
            #        uses: actions/setup-go@v2
            #        with:
            #          go-version: 1.16.x
            #      - name: Run integration tests
            #        run: go test -v ./... -aws_region=us-east-2

Następnie utwórz plik deploy-prod.yml zawierający poniższy kod yaml. Spowoduje to zdefiniowanie wdrożeniowego przepływu pracy dla środowisk produkcyjnych, który będzie uruchamiany podczas scalania zmian z pull requestu z gałęzią mainline.

name: deploy-invoke-labeller-prod
on:
  pull_request:
    branches:
      - mainline

env:
  aws_account_id: ${{secrets.AWS_ACCOUNT_ID}}

jobs:
  deploy-us-west-2:
    runs-on: ubuntu-latest
    outputs:
      env-name: ${{ steps.env-name.outputs.environment }}
    steps:
      - name: Install Go
        uses: actions/setup-go@v2
        with:
          go-version: 1.16.x
      - uses: actions/checkout@v2
      - name: Configure AWS credentials
        id: creds
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: "us-west-2"
      - name: SAM Validate
        run: |
          sam --version
          sam validate
      - name: SAM Build
        run: |
          sam build
      - name: SAM Deploy
        continue-on-error: true
        run: |
          sam deploy --template-file .aws-sam/build/template.yaml \
            --stack-name "OpenDevOpsImageLabeller" \
            --s3-bucket "open-devops-code-us-west-2-${aws_account_id}" \
            --capabilities CAPABILITY_IAM CAPABILITY_NAMED_IAM

            #  integration-test-us-west-2:
            #    runs-on: ubuntu-latest
            #    needs: deploy-us-west-2
            #    steps:
            #      - name: Pull systemTests repo
            #        uses: actions/checkout@master
            #        with:
            #          repository: PmmQuickStartGuides01/systemTests
            #          token: ${{ secrets.ACCESS_KEY }}
            #      - name: Configure AWS credentials
            #        id: creds
            #        uses: aws-actions/configure-aws-credentials@v1
            #        with:
            #          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
            #          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
            #          aws-region: "us-west-2"
            #      - name: Install Go
            #        uses: actions/setup-go@v2
            #        with:
            #          go-version: 1.16.x
            #      - name: Run integration tests
            #        run: go test -v ./... -aws_region=us-west-2

  deploy-us-east-1:
    runs-on: ubuntu-latest
    needs: deploy-us-west-2
    outputs:
      env-name: ${{ steps.env-name.outputs.environment }}
    steps:
      - name: Install Go
        uses: actions/setup-go@v2
        with:
          go-version: 1.16.x
      - uses: actions/checkout@v2
      - name: Configure AWS credentials
        id: creds
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: "us-east-1"
      - name: SAM Validate
        run: |
          sam --version
          sam validate
      - name: SAM Build
        run: |
          sam build
      - name: SAM Deploy
        continue-on-error: true
        run: |
          sam deploy --template-file .aws-sam/build/template.yaml \
            --stack-name "OpenDevOpsImageLabeller" \
            --s3-bucket "open-devops-code-us-east-1-${aws_account_id}" \
            --capabilities CAPABILITY_IAM CAPABILITY_NAMED_IAM

            #  integration-test-us-east-1:
            #    runs-on: ubuntu-latest
            #    needs: deploy-us-east-1
            #    steps:
            #      - name: Pull systemTests repo
            #        uses: actions/checkout@master
            #        with:
            #          repository: PmmQuickStartGuides01/systemTests
            #          token: ${{ secrets.ACCESS_KEY }}
            #      - name: Configure AWS credentials
            #        id: creds
            #        uses: aws-actions/configure-aws-credentials@v1
            #        with:
            #          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
            #          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
            #          aws-region: "us-east-1"
            #      - name: Install Go
            #        uses: actions/setup-go@v2
            #        with:
            #          go-version: 1.16.x
            #      - name: Run integration tests
            #        run: go test -v ./... -aws_region=us-east-1

  deploy-ca-central-1:
    runs-on: ubuntu-latest
    needs: deploy-us-east-1
    outputs:
      env-name: ${{ steps.env-name.outputs.environment }}
    steps:
      - name: Install Go
        uses: actions/setup-go@v2
        with:
          go-version: 1.16.x
      - uses: actions/checkout@v2
      - name: Configure AWS credentials
        id: creds
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: "ca-central-1"
      - name: SAM Validate
        run: |
          sam --version
          sam validate
      - name: SAM Build
        run: |
          sam build
      - name: SAM Deploy
        continue-on-error: true

        run: |
          sam deploy --template-file .aws-sam/build/template.yaml \
            --stack-name "OpenDevOpsImageLabeller" \
            --s3-bucket "open-devops-code-ca-central-1-${aws_account_id}" \
            --capabilities CAPABILITY_IAM CAPABILITY_NAMED_IAM

            #  integration-test-ca-central-1:
            #    runs-on: ubuntu-latest
            #    needs: deploy-ca-central-1
            #    steps:
            #      - name: Pull systemTests repo
            #        uses: actions/checkout@master
            #        with:
            #          repository: PmmQuickStartGuides01/systemTests
            #          token: ${{ secrets.ACCESS_KEY }}
            #      - name: Configure AWS credentials
            #        id: creds
            #        uses: aws-actions/configure-aws-credentials@v1
            #        with:
            #          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
            #          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
            #          aws-region: "ca-central-1"
            #      - name: Install Go
            #        uses: actions/setup-go@v2
            #        with:
            #          go-version: 1.16.x
            #      - name: Run integration tests
            #        run: go test -v ./... -aws_region=ca-central-1

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. Zaktualizuj sekcję needs, aby poszczególne kroki zostały wykonane w odpowiedniej kolejności. Musisz zaktualizować wiersz git clone dla SystemTests zgodnie z Twoim repozytorium SystemTests.

needs: deploy-us-east-1
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

Wykonaj poniższą instrukcję z poziomu wiersza polecenia, aby wypchnąć zmiany do gałęzi IM-11 repozytorium InvokeLabeller. Uwzględnij identyfikator zgłoszenia Jira w komunikatach commita oraz nazwach gałęzi, aby wykorzystać integrację systemu Jira z GitHub do śledzenia, co dzieje się z Twoim projektem.

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

Kliknij Actions (Czynności), aby zobaczyć uruchomione przepływy pracy. Zdefiniowane wcześniej testy systemowe są uruchamiane w ramach zadań integration-test-us-west-1 i integration-test-us-east-2.

Tworzenie pull requestu

Aby utworzyć pull request, kliknij Pull requests (Pull requesty), a następnie opcję New pull request (Nowy pull request). Wybierz opcję scalenia z poziomu gałęzi funkcji.

Kliknij Actions (Czynności), aby monitorować wdrożenie produkcyjne.

Utworzenie repozytorium SystemTests

Przejdź do systemu Jira i utwórz zgłoszenie Jira dotyczące dodania repozytorium SystemTests do GitHub. Zanotuj identyfikator tego zgłoszenia Jira. W tym przykładzie jest to IM-7.

Przejdź do GitHub i kliknij opcję New (Nowy). Wybierz odpowiednią organizację w pozycji Owner (Właściciel). Kliknij przycisk Create repository (Utwórz repozytorium), aby kontynuować.

W terminalu przejdź do repozytorium SystemTests i uruchom poniższe polecenie, aby wypchnąć kod do GitHub.

git add --all
git commit -m "IM-7 add SystemTests repository to GitHub"
git remote add origin git@github.com:PmmQuickStartGuides01/systemTests.git
git branch -M mainline
git push -u origin mainline

Repozytorium SystemTests nie wymaga wykonywania żadnych czynności GitHub. Nie ma własnych pipeline'ów, ponieważ udostępnia testy do uruchomienia w innych pipeline'ach. Po wdrożeniu wszystkich komponentów aplikacji ImageLabeller można usunąć oznaczenie komentarzem, zatwierdzić i wypchnąć wszystkie kroki testów integracyjnych plików przepływu pracy CI/CD. Testy zostaną ukończone z pomyślnym wynikiem tylko wtedy, gdy wszystkie składniki aplikacji będą działać poprawnie.

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 gitlab-ci.yml utworzonych później repozytoriów o poprawny adres URL.

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