Close

Bitbucket으로 ImageLabeller 배포

Warren Marusiak 얼굴 사진
Warren Marusiak

선임 기술 에반젤리스트

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

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

필수 조건

아직 Bitbucket 계정에 SSH를 구성하지 않았다면 다음 안내를 따르세요.

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

https://github.com/AtlassianOpenDevOpsGuides

Bitbucket Pipelines 데모 동영상

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

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

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

Bitbucket에 AWS S3 인프라 리포지토리를 추가하기 위한 Jira 이슈를 보여주는 스크린샷

Bitbucket > 만들기 > 리포지토리로 이동합니다.

Bitbucket에서 리포지토리 만들기

적절한 작업 영역프로젝트를 선택합니다. 기본 브랜치 이름을 메인 라인으로 설정합니다. 리포지토리 만들기를 클릭하여 계속 진행합니다.

Bitbucket에서 새 리포지토리를 만들 수 있는 팝업 창

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

Bitbucket Pipelines 사용

리포지토리 설정 > 설정 > 파이프라인 사용으로 이동합니다.

Bitbucket에서 파이프라인 사용

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

리포지토리 변수로 이동하여 AWS 액세스 키 ID를 입력하고 추가를 클릭합니다. 그런 다음 AWS 암호 액세스 키를 입력하고 추가를 클릭합니다.

Bitbucket의 리포지토리 변수

배포 환경 설정

배포를 클릭합니다.

Bitbucket의 배포 설정 화면

새 환경을 추가하려면 환경 추가를 클릭합니다. 이 예에는 US-WEST-1에 테스트 환경, US-EAST-2에 스테이징 환경, US-WEST-2, US-EAST-1, CA-CENTRAL-1에 세 개의 프로덕션 환경이 있습니다.

Bitbucket에 배포 환경 추가

AWS에 배포할 bitbucket-pipelines.yml

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

git checkout -b IM-5

다음 yaml로 bitbucket-pipelines.yml 파일을 만듭니다. 이것은 테스트, 스테이징, 프로덕션 환경을 위한 배포 워크플로를 정의합니다.

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

bitbucket-pipelines.yml 파일 이해하기

정의 및 단계

정의 섹션에서 일련의 단계를 정의합니다. 단계마다 bitbucket-pipelines.yml 파일 전체에서 참조되는 별칭, Bitbucket 배포 화면에 표시되는 이름, 스크립트가 있습니다. 스크립트는 하나 이상의 명령의 모음입니다.

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

이 단계에서는 atlassian/aws-cloudformation-deploy 파이프를 사용하여 s3_infra template.yml 파일에 정의된 AWS S3 버킷을 배포합니다.

- pipe: atlassian/aws-cloudformation-deploy:0.10.0

사용 가능한 파이프 세트는 여기에서 찾을 수 있습니다. atlassian/aws-cloudformation-deploy 파이프에 대한 설명서는 여기에서 찾을 수 있습니다.

파이프라인

파이프라인은 일련의 단계를 거칩니다. 기본 파이프라인은 파이프라인 아래에 명시적으로 이름이 지정되지 않은 브랜치에 대해 실행되는 단계의 집합입니다. 기본 파이프라인은 테스트 및 스테이징 환경에 배포하는 단계를 실행합니다.

pipelines:
  default:
    - step:
        <<: *deploy-test-usw1
        deployment: Test us-west-1
    - step:
        <<: *deploy-staging-use2
        deployment: Staging us-east-2

배포는 Jira Bitbucket 간의 통합을 가능하게 합니다.

deployment: Test us-west-1

브랜치 아래에서 이름이 지정된 특정 브랜치에 대해 실행되는 일련의 단계를 정의할 수 있습니다. 아래의 스니펫은 메인 라인 브랜치에 대한 일련의 단계를 정의합니다.

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

이 주제에 대한 자세한 내용은 참조 문서를 읽어보세요.

기능 브랜치로 푸시

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

git add --all
git commit -m "IM-5 add bitbucket-pipelines.yml"
git push -u origin IM-5

파이프라인을 클릭한 다음 IM-5를 클릭하여 실행 중인 파이프라인을 확인하세요.

Bitbucket에서 파이프라인 실행

파이프라인 자체를 클릭하면 실행의 세부 정보를 확인할 수 있습니다. 파이프라인은 us-west-1의 테스트 환경과 us-east-2의 스테이징 환경에 screenshot_s를 배포하는 단계를 실행했습니다.

Bitbucket의 파이프라인 실행 세부 정보

풀리퀘스트 만들기

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

Bitbucket에서 풀리퀘스트 만들기

기능 브랜치를 소스 브랜치로 선택하고 브랜치 닫기 확인란에 체크한 다음 풀리퀘스트 만들기를 클릭하세요.

Bitbucket에서 풀리퀘스트 모달 만들기.

코드 변경 사항을 검토한 다음 풀리퀘스트를 승인병합하세요.

Bitbucket에서 풀리퀘스트 승인 및 병합

병합을 클릭하면 병합 풀리퀘스트 화면이 열립니다. 전환 이슈 확인란을 선택하고 병합을 클릭합니다.

Bitbucket에서 풀리퀘스트를 병합할 때 "전환 이슈" 확인란을 선택합니다

파이프라인을 클릭하여 메인 라인 파이프라인을 모니터링합니다.

Bitbucket의 메인 파이프라인 모니터링

IM-5 브랜치는 사라졌습니다. 메인 라인 브랜치가 남아 있으며 파이프라인이 실행 중입니다. 파이프라인을 클릭합니다.

Bitbucket의 메인 라인 브랜치 파이프라인 화면

파이프라인은 us-west-2, us-east-1 및 ca-central-1의 프로덕션 환경에 배포하는 단계를 실행했습니다. 파이프라인이 실패하면 다시 실행 버튼을 클릭하여 파이프라인을 다시 실행할 수 있습니다.

잘못된 배포를 롤백

배포를 롤백하려면 배포를 클릭합니다.

Bitbucket의 배포 화면

롤백할 환경을 클릭하여 이전 배포의 목록을 확인하고 롤백할 버전을 선택한 다음 다시 배포를 클릭합니다.

환경을 선택한 다음 Bitbucket에서 롤백할 버전을 선택합니다

변경 사항이 올바른지 확인하고 다시 배포를 클릭합니다.

Bitbucket에서 "다시 배포"를 선택하기 전에 변경 사항이 정확한지 확인합니다

선택한 환경만 다시 배포됩니다.

선택된 환경만 다시 배포되고 있는 것을 보여주는 Bitbucket의 파이프라인 모달

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

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

Jira Software에서 Bitbucket에 SubmitImage 리포지토리를 추가하기 위한 이슈 만들기

Bitbucket으로 이동하고 만들기를 클릭한 다음 리포지토리를 클릭합니다.

Bitbucket에서 리포지토리 만들기

적절한 작업 영역프로젝트를 선택합니다. 기본 브랜치 이름을 메인 라인으로 설정합니다. 리포지토리 만들기를 클릭하여 계속 진행합니다.

Bitbucket에서 새 리포지토리를 만들 때의 팝업 모달

터미널에서 SubmitImage 리포지토리로 이동하고 다음을 실행하여 AWS Lambda 코드를 Bitbucket으로 푸시합니다. 커밋 메시지에 Jira 이슈 ID 및 브랜치 이름을 포함하면 Jira Bitbucket 통합이 프로젝트 진행 상황을 추적하도록 할 수 있습니다.

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

파이프라인 사용

리포지토리 설정으로 이동하여 설정을 클릭한 다음 파이프라인 사용을 클릭합니다.

Bitbucket Pipelines 설정에서 파이프라인 사용

리포지토리 변수 추가

리포지토리 변수를 클릭하여 AWS 액세스 키 ID, AWS 암호 액세스 키, AWS 계정 ID를 추가합니다. AWS 액세스 키와 연결된 IAM 사용자에게 AdministratorAccess를 제공합니다. 개별 AWS 액세스 정책을 선택하여 더 세밀한 액세스 제어를 사용할 수도 있습니다.

Bitbucket Pipelines 설정에서 파이프라인 사용

배포 환경 추가

새 환경을 추가하려면 배포를 클릭한 다음 환경 추가를 클릭합니다. 이 예에는 us-west-1에 테스트 환경, us-east-2에 스테이징 환경, us-west-2, us-east-1, ca-central-1에 세 개의 프로덕션 환경이 있습니다.

Bitbucket의 배포 환경

SSH 키 만들기

Bitbucket의 SubmitImage 리포지토리로 이동하여 리포지토리 설정, SSH 키, 키 생성을 차례로 클릭합니다.

Bitbucket에서 SSH 키 생성

SystemTests 리포지토리를 만들 때 이 SSH 키가 필요합니다.

Bitbucket의 SSH 키 세부 정보

AWS에 배포할 bitbucket-pipelines.yml

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

git checkout -b IM-6

다음 yaml로 bitbucket-pipelines.yml 파일을 만듭니다. 이것은 테스트, 스테이징, 프로덕션 환경을 위한 Bitbucket Pipelines를 정의합니다. SystemTests가 SystemTests 리포지토리가 되려면 git clone 라인을 업데이트해야 합니다.

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

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

bitbucket-pipelines.yml 파일 이해하기

이 단계는 SubmitImage 코드 베이스에서 단위 테스트를 실행합니다.

-step: &rununittests
        name: run unit tests
        image: golang:buster
        script:
          - cd submitImage
          - go test ./opendevopslambda/...

이 단계는 AWS SAM을 사용하여 SubmitImage AWS Lambda를 us-west-2에 배포합니다. 이 파이프에 대한 설명서는 여기에서 찾아볼 수 있습니다.

-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'

이 단계는 SystemTests 리포지토리를 복제하고 us-west-2에서 통합 테스트를 실행합니다. SystemTests가 SystemTests 리포지토리가 되려면 git clone 라인을 업데이트해야 합니다.

-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

기능 브랜치로 푸시

명령줄에서 다음을 실행하여 변경 사항을 SubmitImage 리포지토리의 IM-8 브랜치로 푸시합니다.

git add --all
git commit -m "IM-6 add bitbucket-pipelines.yml to SubmitImage"
git push -u origin IM-6

파이프라인을 클릭한 다음 IM-6을 클릭하여 실행 중인 파이프라인을 확인하세요.

Bitbucket Cloud 파이프라인의 스크린샷

풀리퀘스트 만들기

풀리퀘스트를 만들려면 풀리퀘스트를 클릭한 다음 풀리퀘스트 만들기를 클릭합니다. 풀리퀘스트를 완료하고 파이프라인을 클릭하여 프로덕션 배포를 확인합니다.

Bitbucket Cloud의 프로덕션 배포 파이프라인

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

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

Jira 보드에 Jira 이슈가 표시된 스크린샷

Bitbucket으로 이동하고 만들기를 클릭한 다음 리포지토리를 클릭합니다. 적절한 작업 영역프로젝트를 선택합니다. 기본 브랜치 이름을 메인 라인으로 설정합니다. 리포지토리 만들기를 클릭하여 계속 진행합니다.

Bitbucket에 invokelabeller 리포지토리 만들기

터미널에서 InvokeLabeller 리포지토리로 이동하고 다음을 실행하여 AWS Lambda 코드를 Bitbucket으로 푸시합니다. 커밋 메시지에 Jira 이슈 ID 및 브랜치 이름을 포함하면 Jira Bitbucket 통합이 프로젝트 진행 상황을 추적하도록 할 수 있습니다.

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

파이프라인 사용

리포지토리 설정으로 이동하여 설정을 클릭한 다음 파이프라인 사용을 클릭합니다.

Bitbucket의 설정에서 파이프라인 사용

리포지토리 변수 추가

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

Bitbucket에 리포지토리 변수 추가

배포 환경 추가

새 환경을 추가하려면 배포를 클릭한 다음 환경 추가를 클릭합니다. 이 예에는 us-west-1에 테스트 환경, us-east-2에 스테이징 환경, us-west-2, us-east-1, ca-central-1에 세 개의 프로덕션 환경이 있습니다.

Bitbucket의 배포 환경

SSH 키 만들기

Bitbucket의 SubmitImage 리포지토리로 이동하여 리포지토리 설정, SSH 키, 키 생성을 차례로 클릭합니다.

Bitbucket Cloud의 SSH 키 세부 정보

AWS에 배포할 bitbucket-pipelines.yml

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

git checkout -b IM-10

다음 yaml로 bitbucket-pipelines.yml 파일을 만듭니다. 이것은 테스트, 스테이징, 프로덕션 환경을 위한 Bitbucket Pipelines를 정의합니다. SystemTests가 SystemTests 리포지토리가 되려면 git clone 라인을 업데이트해야 합니다.

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

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

bitbucket-pipelines.yml 파일 이해하기

이 단계는 InvokeLabeller 코드 베이스에서 단위 테스트를 실행합니다.

-step: &rununittests
        name: run unit tests
        image: golang:buster
        script:
          - cd submitImage
          - go test ./opendevopslambda/...

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-10 브랜치로 푸시합니다.

git add --all
git commit -m "IM-10 add bitbucket-pipelines.yml to InvokeLabeller"
git push -u origin IM-10

파이프라인을 클릭한 다음 IM-10을 클릭하여 실행 중인 파이프라인을 확인하세요.

Bitbucket Cloud에서 실행 중인 파이프라인 보기

풀리퀘스트 만들기

풀리퀘스트를 만들려면 풀리퀘스트를 클릭한 다음 풀리퀘스트 만들기를 클릭합니다. 풀리퀘스트를 완료하고 파이프라인을 클릭하여 프로덕션 배포를 확인합니다.

Bitbucket Pipelines에서 프로덕션 배포 보기

시스템 테스트용 리포지토리 만들기

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

Jira 보드에서 새로 만든 Jira 이슈 보기

Bitbucket으로 이동하고 만들기를 클릭한 다음 리포지토리를 클릭합니다.

Bitbucket에서 리포지토리 만들기

적절한 작업 영역프로젝트를 선택합니다. 기본 브랜치 이름을 메인 라인으로 설정합니다. 리포지토리 만들기를 클릭하여 계속 진행합니다.

Bitbucket에서 새 리포지토리를 만들 때 정보 입력

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

SystemTests 리포지토리에는 bitbucket-pipelines.yml 파일이 필요하지 않습니다. 기타 파이프라인의 실행을 위한 테스트를 제공하므로 자체 파이프라인이 없습니다. SystemTests의 원격 URL을 기록해 두세요. SubmitImage, GetImageLabel, InvokeLabeller CI/CD 파이프라인을 호출하면 테스트 단계에서 SystemTests 리포지토리가 복제됩니다. 이후 리포지토리의 bitbucket-pipelines.yml을 올바른 URL로 업데이트해야 합니다.

SubmitImage, GetImageLabel, InvokeLabeller에서 SSH 키 추가

리포지토리 설정을 클릭한 다음 액세스 키를 클릭합니다.

Bitbucket의 액세스 키 설정 페이지

키 추가를 클릭하고 SubmitImage, GetImageLabel 또는 InvokeLabeller에서 복사한 SSH 키를 붙여넣은 다음 SSH 키 추가를 클릭합니다.

Bitbucket에 SSH 키 추가

여기까지 완료하셨나요? 축하합니다! 방금 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