Close

GitHub로 ImageLabeller 배포

Warren Marusiak 얼굴 사진
Warren Marusiak

선임 기술 에반젤리스트

Jira Software 및 다양한 연결된 도구를 사용하여 애플리케이션을 개발, 배포 및 관리하는 방법을 보여주기 위해 저희 팀에서는 머신러닝을 사용하여 이미지에 레이블을 적용하는 간단한 AWS 기반 데모 애플리케이션인 ImageLabeller를 만들었습니다.

이 페이지에서는 GitHub로 ImageLabeller를 배포하는 방법을 다룹니다. 시작하기 전에 컨텍스트를 알아보도록 ImageLabeller 아키텍처AWS SageMaker 설정 페이지를 읽어보는 것이 좋습니다.

필수 조건

아직 GitHub 조직이 없다면 GitHub 가이드의 단계에 따라 처음부터 만들어 보세요.

ImageLabeller 코드가 있는 공개 GitHub 리포지토리

https://github.com/AtlassianOpenDevOpsGuides

Jira GitHub 통합 데모 비디오

Jira 및 GitHub 통합

Jira에서 보드, , GitHub를 차례로 클릭합니다.

JSW 앱 드롭다운 메뉴

지금 받기를 클릭합니다.

JSW GitHub 앱

을 클릭한 다음 앱 관리를 클릭하고 GitHub를 펼칩니다.

JSW 앱 관리 이미지

시작하기를 클릭합니다.

시작하기를 클릭합니다.

GitHub 구성 이미지

GitHub에 Jira 플러그인 설치

Jira 설치를 클릭하여 GitHub에 Jira 플러그인을 설치합니다. GitHub에 Jira 플러그인이 아직 설치되어 있지 않은 경우 필수 단계입니다.

GitHub 조직을 Jira에 연결 이미지

Jira에서 GitHub의 데이터 동기화를 시작합니다.

동기화가 완료되면 동기화 상태가 완료로 변경됩니다.

동기화 상태 변경 스크린샷

SSH 액세스 설정

여기에 있는 지침에 따라 계정에 GitHub SSH 키를 설정합니다. 추가 참고 자료는 여기에서 확인할 수 있습니다.

개인용 액세스 토큰 설정

이 가이드에 따라 개인 액세스 토큰을 설정합니다. PAT는 통합 테스트 단계에서 SystemTest 리포지토리를 복제하는 데 사용됩니다. PAT 리포지토리워크플로 액세스 권한을 제공합니다.

AWS S3 인프라용 리포지토리 만들기

표준 개발자 루프에는 보통 개발자가 Jira에서 작업을 가져와서 진행 중인 작업으로 이동하고 개발 작업을 하는 것이 포함됩니다. Jira 이슈 ID는 개발 작업을 Jira 이슈와 연결해주는 열쇠입니다. 두 시스템 간의 핵심적인 통합 컴포넌트입니다.

Jira로 이동하여 GitHub에 AWS S3 인프라 리포지토리를 추가하기 위한 새 이슈를 만듭니다. 이슈 ID를 기록해 두세요. 이 예에서는 IM-9입니다.

AWS S3 인프라

GitHub로 이동하여 새로 만들기를 클릭합니다. 소유자에 대해 적합한 조직을 선택합니다. 리포지토리 만들기를 클릭하여 계속 진행합니다.

AWS 액세스 키 리포지토리 변수 추가

설정을 클릭한 다음 암호를 클릭합니다. 새 리포지토리 암호를 클릭하고 AWS 액세스 키 ID 및 AWS 암호 액세스 키를 추가합니다. AWS 액세스 키와 연결된 IAM 사용자에게 AdministratorAccess를 제공합니다. 개별 AWS 액세스 정책을 선택해서 더 세밀한 액세스 제어를 사용할 수도 있지만 자세한 사항을 결정하는 것은 독자의 몫입니다.

터미널에서 s3_infra 리포지토리로 이동하고 다음을 실행하여 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

AWS에 배포하기 위한 GitHub 작업

터미널에 있는 s3_infra 리포지토리로 이동하여 Jira 이슈 ID의 이름을 딴 브랜치를 만들고 .github/workflows 디렉터리를 만듭니다.

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

새 .github/workflows 디렉터리에서 다음 yaml로 deploy-test-staging.yml을 만듭니다. 메인 라인이 아닌 다른 브랜치로 푸시하는 동안 실행되는 테스트 및 스테이징 환경을 위한 배포 워크플로를 정의합니다.

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"

다음 yaml로 deploy-prod.yml을 만듭니다. 풀리퀘스트가 변경 사항을 메인 라인에 병합할 때 실행되는 프로덕션 환경을 위한 배포 워크플로를 정의합니다.

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"

GitHub 작업 이해하기

트리거

워크플로를 트리거하는 이벤트를 파일 상단에 선언합니다. deploy-test-staging.yml에서 이벤트는 메인 라인을 제외한 모든 브랜치로 푸시됩니다.

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

여러 이벤트가 워크플로를 트리거하도록 할 수 있습니다. 자세한 내용은 여기에서 설명서를 참조하세요.

작업

워크플로에는 트리거하는 이벤트가 발생할 때 실행되는 여러 작업이 포함되어 있습니다. 각 작업에는 작업이 실행될 때 이루어지는 일련의 단계가 있습니다. 이 예에서는 리포지토리 코드를 체크아웃하는 단계, AWS 자격 증명을 구성하는 단계, AWS CloudFormation을 사용해 AWS에 배포하는 단계가 있습니다.

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"

작업은 여기에서, 단계에 관한 내용은 여기에서 자세히 읽어보세요.

요구 사항에 따라 순서 시행

요구 사항을 사용하여 작업에 순서를 지정할 수 있습니다. GitHub는 기본적으로 모든 단계를 병렬로 실행합니다. 요구 사항을 사용하여 한 단계가 다른 단계에 종속되도록 하세요.

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"

기능 브랜치로 푸시

명령줄에서 다음을 실행하여 코드를 s3_infra 리포지토리의 IM-9 브랜치로 푸시합니다.

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

실행 중인 워크플로를 보려면 작업을 클릭합니다.

실행 중인 워크플로 이미지

풀리퀘스트 만들기

풀리퀘스트를 클릭한 다음 풀리퀘스트 만들기를 클릭합니다.

변경 사항 비교 이미지

기능 브랜치를 소스 브랜치로 선택한 다음 풀리퀘스트 만들기를 클릭합니다.

풀리퀘스트 만들기 이미지

코드 변경 사항을 검토하고 풀리퀘스트 병합을 클릭하여 변경 사항을 수락합니다.

작업을 클릭하면 프로덕션 배포가 시작됩니다. 브랜치가 메인 라인이므로 GitHub가 deploy-prod.yml에서 작업을 실행합니다.

SubmitImage AWS Lambda용 리포지토리 만들기

Jira로 이동하여 GitHub에 SubmitImage AWS Lambda 리포지토리를 추가하기 위한 Jira 이슈를 만듭니다. Jira 이슈 ID를 기록해 두세요. 이 예에서는 IM-8입니다.

IM 보드 이미지

GitHub로 이동하여 새로 만들기를 클릭합니다. 소유자에 대해 적합한 조직을 선택합니다. 리포지토리 만들기를 클릭하여 계속 진행합니다.

설정을 클릭한 다음 암호를 클릭합니다. 개인 액세스 토큰을 ACCESS_KEY로, AWS 액세스 키 ID를 AWS_ACCESS_KEY_ID로, AWS 암호 액세스 키를 AWS_SECRET_ACCESS_KEY로, AWS 계정 ID를 AWS_ACCOUNT_ID로 추가합니다.

터미널에서 SubmitImage 리포지토리로 이동하고 다음을 실행하여 코드를 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
AWS에 배포하기 위한 GitHub 작업

터미널에 있는 SubmitImage 리포지토리로 이동하여 Jira 이슈 ID의 이름을 딴 브랜치를 만들고 .github/workflows 디렉터리를 만듭니다.

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

새 .github/workflows 디렉터리에서 다음 yaml로 deploy-test-staging.yml을 만듭니다. 메인 라인이 아닌 다른 브랜치로 푸시하는 동안 실행되는 테스트 및 스테이징 환경을 위한 배포 워크플로를 정의합니다. SystemTests가 SystemTests 리포지토리가 되려면 git clone 라인을 업데이트해야 합니다.

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

다음 yaml로 deploy-prod.yml을 만듭니다. 풀리퀘스트가 변경 사항을 메인 라인에 병합할 때 실행되는 프로덕션 환경을 위한 배포 워크플로를 정의합니다.

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

통합 테스트 실행은 지금 주석 처리되어 있습니다. 시스템 테스트는 전체 애플리케이션이 배포된 후에만 통과합니다. 리포지토리 통합 테스트 단계의 주석 처리를 제거하고 ImageLabeller의 모든 컴포넌트가 배포된 후에 배포 파이프라인을 실행하려면 다시 한번 푸시하세요. 요구 사항 섹션을 업데이트하여 단계를 순서대로 실행합니다. SystemTests가 SystemTests 리포지토리가 되려면 git clone 라인을 업데이트해야 합니다.

needs: deploy-us-east-1
GitHub 작업 이해하기

이 작업은 AWS SAM을 사용하여 SubmitImage AWS Lambda를 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

이 작업은 SystemTests 리포지토리를 복제하고 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

이 단계는 개인 액세스 토큰을 사용하여 SystemTests 리포지토리를 복제합니다.

    - name: Pull systemTests repo
        uses: actions/checkout@master
        with:
          repository: PmmQuickStartGuides01/systemTests
          token: ${{ secrets.ACCESS_KEY }}
기능 브랜치로 푸시

명령줄에서 다음을 실행하여 SubmitImage 리포지토리의 IM-8 브랜치로 변경 사항을 푸시합니다. 커밋 메시지에 Jira 이슈 ID 및 브랜치 이름을 포함하면 Jira GitHub 통합이 프로젝트 진행 상황을 추적하도록 할 수 있습니다.

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

실행 중인 워크플로를 보려면 작업을 클릭합니다.

단위 테스트 작업이 통과했으며 테스트 us-west-1로의 배포가 시작되었습니다.

앞서 정의한 시스템 테스트는 integration-test-us-west-1 및 integration-test-us-east-2 작업의 일부로 실행됩니다.

풀리퀘스트 만들기

풀리퀘스트를 만들려면 풀리퀘스트를 클릭한 다음 새 풀리퀘스트를 클릭합니다.

기능 브랜치에서 병합 여부를 선택합니다.

Create pull request(풀리퀘스트 만들기)를 클릭합니다.

풀리퀘스트를 병합하고 기능 브랜치를 삭제합니다. 프로덕션 배포를 모니터링하려면 작업을 클릭합니다.

InvokeLabeller AWS Lambda용 리포지토리 만들기

Jira로 이동하여 GitHub에 InvokeLabeller AWS Lambda 리포지토리를 추가하기 위한 Jira 이슈를 만듭니다. Jira 이슈 ID를 기록해 두세요. 이 예에서는 IM-11입니다.

GitHub로 이동하여 새로 만들기를 클릭합니다. 소유자에 대해 적합한 조직을 선택합니다. 리포지토리 만들기를 클릭하여 계속 진행합니다.

설정을 클릭한 다음 암호를 클릭합니다. 개인 액세스 토큰을 ACCESS_KEY로, AWS 액세스 키 ID를 AWS_ACCESS_KEY_ID로, AWS 암호 액세스 키를 AWS_SECRET_ACCESS_KEY로, AWS 계정 ID를 AWS_ACCOUNT_ID로 추가합니다.

터미널에서 InvokeLabeller 리포지토리로 이동하고 다음을 실행하여 코드를 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
AWS에 배포하기 위한 GitHub 작업

터미널에 있는 InvokeLabeller 리포지토리로 이동하여 Jira 이슈 ID의 이름을 딴 브랜치를 만들고 .github/workflows 디렉터리를 만듭니다.

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

새 .github/workflows 디렉터리에서 다음 yaml로 deploy-test-staging.yml을 만듭니다. 메인 라인이 아닌 다른 브랜치로 푸시하는 동안 실행되는 테스트 및 스테이징 환경을 위한 배포 워크플로를 정의합니다. SystemTests가 SystemTests 리포지토리가 되려면 git clone 라인을 업데이트해야 합니다.

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

다음 yaml로 deploy-prod.yml을 만듭니다. 풀리퀘스트가 변경 사항을 메인 라인에 병합할 때 실행되는 프로덕션 환경을 위한 배포 워크플로를 정의합니다.

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

통합 테스트 실행은 지금 주석 처리되어 있습니다. 시스템 테스트는 전체 애플리케이션이 배포된 후에만 통과합니다. 리포지토리 통합 테스트 단계의 주석 처리를 제거하고 ImageLabeller의 모든 컴포넌트가 배포된 후에 배포 파이프라인을 실행하려면 다시 한번 푸시하세요. 요구 사항 섹션을 업데이트하여 단계를 순서대로 실행합니다. SystemTests가 SystemTests 리포지토리가 되려면 git clone 라인을 업데이트해야 합니다.

needs: deploy-us-east-1
AWS SageMaker 엔드포인트로 src/app.py 업데이트

InvokeLabeller의 src/app.py 파일을 열고 query_endpoint를 찾습니다. endpoint_name 및 클라이언트 region_name을 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
기능 브랜치로 푸시

명령줄에서 다음을 실행하여 InvokeLabeller 리포지토리의 IM-11 브랜치로 변경 사항을 푸시합니다. 커밋 메시지에 Jira 이슈 ID 및 브랜치 이름을 포함하면 Jira GitHub 통합이 프로젝트 진행 상황을 추적하도록 할 수 있습니다.

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

실행 중인 워크플로를 보려면 작업을 클릭합니다. 앞서 정의한 시스템 테스트는 integration-test-us-west-1 및 integration-test-us-east-2 작업의 일부로 실행됩니다.

풀리퀘스트 만들기

풀리퀘스트를 만들려면 풀리퀘스트를 클릭한 다음 새 풀리퀘스트를 클릭합니다. 기능 브랜치에서 병합 여부를 선택합니다.

프로덕션 배포를 모니터링하려면 작업을 클릭합니다.

SystemTests용 리포지토리 만들기

Jira로 이동하여 GitHub에 SystemTests 리포지토리를 추가하기 위한 Jira 이슈를 만듭니다. Jira 이슈 ID를 기록해 두세요. 이 예에서는 IM-7입니다.

GitHub로 이동하여 새로 만들기를 클릭합니다. 소유자에 대해 적합한 조직을 선택합니다. 리포지토리 만들기를 클릭하여 계속 진행합니다.

터미널에서 SystemTests 리포지토리로 이동하고 다음을 실행하여 코드를 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

SystemTests 리포지토리에는 GitHub 작업이 필요하지 않습니다. 기타 파이프라인의 실행을 위한 테스트를 제공하므로 자체 파이프라인이 없습니다. ImageLabeller 애플리케이션의 모든 컴포넌트가 배포되면 CI/CD 워크플로 파일의 통합 테스트 단계에서 주석 처리를 제거하고 커밋한 후 푸시할 수 있습니다. 애플리케이션의 모든 컴포넌트가 제대로 작동해야 테스트를 통과할 수 있습니다.

SystemTests의 원격 URL을 기록해 두세요. SubmitImage, GetImageLabel, InvokeLabeller CI/CD 파이프라인을 호출하면 테스트 단계에서 SystemTests 리포지토리가 복제됩니다. 이후 리포지토리의 gitlab-ci.yml을 올바른 URL로 업데이트해야 합니다.

여기까지 완료하셨나요? 축하합니다! 방금 ImageLabeller를 배포했습니다. 다음 단계는 Opsgenie로 ImageLabeller 모니터링을 설정하는 것입니다.

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.


이 문서 공유

여러분께 도움을 드릴 자료를 추천합니다.

이러한 리소스에 책갈피를 지정하여 DevOps 팀의 유형에 대해 알아보거나 Atlassian에서 DevOps에 대한 지속적인 업데이트를 확인하세요.

DevOps 일러스트레이션

DevOps 커뮤니티

DevOps 일러스트레이션

DevOps 학습 경로

맵 일러스트레이션

무료로 사용해보기

DevOps 뉴스레터 신청

Thank you for signing up