GitLab으로 ImageLabeller 배포

개발자 출신인 Warren은 2021년 기술 에반젤리스트로 Atlassian에 합류했습니다. 메인프레임에서 실행되는 COBOL 통신 소프트웨어부터 AWS의 최신 클라우드 인프라에 이르기까지 모든 분야에서 활약했습니다. 기술에 대한 관심이 지대하며 머신러닝 분야를 연구한 경력이 있습니다. 기술 에반젤리스트로서 Warren은 데모, 글쓰기 및 동영상을 통해 Atlassian 제품 및 파트너 통합 기능에 대한 인지도를 높이고 있습니다. 여가 시간에는 브라질 주짓수를 열정적으로 연습합니다.
Jira Software 및 다양한 연결된 도구를 사용하여 애플리케이션을 개발, 배포 및 관리하는 방법을 보여주기 위해 저희 팀에서는 머신러닝을 사용하여 이미지에 레이블을 적용하는 간단한 AWS 기반 데모 애플리케이션인 ImageLabeller를 만들었습니다.
이 페이지에서는 GitLab으로 ImageLabeller를 배포하는 방법을 다룹니다. 시작하기 전에 컨텍스트를 알아보도록 ImageLabeller 아키텍처 및 AWS SageMaker 설정 페이지를 읽어보는 것이 좋습니다.
필수 조건
아직 GitLab 그룹이 없다면 GitLab 가이드의 단계에 따라 처음부터 만들어 보세요.
ImageLabeller 코드가 있는 공개 GitHub 리포지토리
Jira GitLab 통합 데모 비디오
Jira 및 GitLab 통합
Jira에서 보드, 앱, GitLab을 차례로 클릭합니다.

지금 받기를 클릭합니다.

앱을 클릭한 다음 앱 관리를 클릭합니다.

Jira용 GitLab을 펼칩니다.

네임스페이스 추가를 클릭합니다.

기존 네임스페이스를 선택하고 링크를 클릭합니다. 이 가이드에서는 이미 기존 GitLab 계정과 GitLab 그룹이 있다고 가정합니다.

GitLab에 SSH 키 추가
오른쪽 상단에 있는 프로필 아이콘을 클릭하고 기본 설정을 클릭합니다.

SSH 키를 클릭하고 안내에 따라 새 SSH 키를 생성하거나 기존 SSH 키를 사용하세요.
AWS S3 인프라용 리포지토리 만들기
표준 개발자 루프에는 보통 개발자가 Jira에서 작업을 가져와서 진행 중인 작업으로 이동하고 개발 작업을 하는 것이 포함됩니다. Jira 이슈 ID는 개발 작업을 Jira 이슈와 연결해주는 열쇠입니다. 두 시스템 간의 핵심적인 통합 컴포넌트입니다.
Jira로 이동하여 GitLab에 AWS S3 인프라 리포지토리를 추가하기 위한 새 이슈를 만듭니다. 이슈 ID를 기록해 두세요. 이 예에서는 IM-5입니다.

GitLab으로 이동하여 새 프로젝트를 클릭합니다.

빈 프로젝트 만들기를 클릭합니다.

프로젝트 이름을 추가하고 프로젝트 URL에서 적절한 그룹을 선택합니다. 프로젝트 만들기를 클릭하여 진행합니다.

터미널에서 s3_infra 리포지토리로 이동하고 다음을 실행하여 AWS CloudFormation template.yml 파일을 GitLab으로 푸시합니다.
1git add --all
2git commit -m "IM-5 add s3_infra repository to gitlab"
3git remote add origin git@gitlab.com:pmmquickstartguides/s3_infra.git
4git branch -m mainline
5git push -u origin mainlineAWS 액세스 키 추가
설정을 클릭한 다음 CI/CD를 클릭합니다. 아래로 스크롤하여 변수를 펼칩니다. 변수 추가를 클릭합니다.

변수를 두 개 만듭니다. 하나는 AWS 액세스 키 ID, 다른 하나는 AWS 암호 액세스 키를 위한 변수입니다.

변수를 보호된 브랜치에서 실행되는 파이프라인과 태그에서만 사용하도록 보호합니다. AWS 액세스 키와 연결된 IAM 사용자에게 AdministratorAccess를 제공합니다. 개별 AWS 액세스 정책을 선택해서 더 세밀한 액세스 제어를 사용할 수도 있습니다.

보호되는 변수에 접근할 수 있도록 보호되는 브랜치 구성
설정을 클릭한 다음 리포지토리를 클릭합니다. 아래로 스크롤하여 보호되는 브랜치를 펼칩니다.
Jira 이슈 ID 접두사와 *를 입력합니다.
이 예에서 Jira 이슈 ID는 IM-5, IM-6과 같습니다. 접두사는 IM-입니다.
IM-*를 입력하고 보호를 클릭합니다.

메인 라인과 IM-*가 보호 브랜치로 표시됩니다.
배포 환경 설정
배포를 클릭한 다음 환경을 클릭합니다. 새 환경을 추가하려면 새 환경을 클릭합니다. 이 예에는 US-WEST-1 및 US-EAST-2에 테스트 환경, US-WEST-2, US-EAST-1, CA-CENTRAL-1에 프로덕션 환경이 있습니다.

AWS에 배포하기 위한 .gitlab-ci.yml
터미널에 있는 s3_infra 리포지토리로 이동하여 Jira 이슈 ID의 이름을 딴 브랜치를 만듭니다.
1git checkout -b IM-5다음 yaml로 .gitlab-ci.yml 파일을 만듭니다. 이것은 테스트, 스테이징, 프로덕션 환경을 위한 배포 워크플로를 정의합니다.
1stages:
2 - merge-request
3 - test-us-west-1
4 - test-us-east-2
5 - production-us-west-2
6 - production-us-east-1
7 - production-ca-central-1
8
9merge-request-pipeline-job:
10 stage: merge-request
11 rules:
12 - if: $CI_PIPELINE_SOURCE == "merge_request_event"
13 script:
14 - echo "This pipeline always succeeds and enables merges during merge requests"
15 - echo true
16
17deploy-test-us-west-1:
18 stage: test-us-west-1
19 environment: test-us-west-1
20 rules:
21 - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
22 image: registry.gitlab.com/gitlab-org/cloud-deploy/aws-base:latest
23 script:
24 - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
25 - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
26 - aws cloudformation deploy --region us-west-1 --template-file template.yml --stack-name OpenDevOpsS3Infra
27
28deploy-test-us-east-2:
29 stage: test-us-east-2
30 environment: test-us-east-2
31 rules:
32 - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
33 image: registry.gitlab.com/gitlab-org/cloud-deploy/aws-base:latest
34 script:
35 - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
36 - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
37 - aws cloudformation deploy --region us-east-2 --template-file template.yml --stack-name OpenDevOpsS3Infra
38
39deploy-production-us-west-2:
40 stage: production-us-west-2
41 environment: production-us-west-2
42 rules:
43 - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
44 image: registry.gitlab.com/gitlab-org/cloud-deploy/aws-base:latest
45 script:
46 - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
47 - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
48 - aws cloudformation deploy --region us-west-2 --template-file template.yml --stack-name OpenDevOpsS3Infra
49
50deploy-production-us-east-1:
51 stage: production-us-east-1
52 environment: production-us-east-1
53 rules:
54 - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
55 image: registry.gitlab.com/gitlab-org/cloud-deploy/aws-base:latest
56 script:
57 - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
58 - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
59 - aws cloudformation deploy --region us-east-1 --template-file template.yml --stack-name OpenDevOpsS3Infra
60
61deploy-production-ca-central-1:
62 stage: production-ca-central-1
63 environment: production-ca-central-1
64 rules:
65 - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
66 image: registry.gitlab.com/gitlab-org/cloud-deploy/aws-base:latest
67 script:
68 - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
69 - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
70 - aws cloudformation deploy --region ca-central-1 --template-file template.yml --stack-name OpenDevOpsS3Infra.gitlab-ci.yml 파일 이해하기
스테이지
GitLab 파이프라인의 실행 순서를 정의하려면 스테이지 블록을 추가합니다. 스테이지는 스테이지 블록에 정의된 순서대로 실행됩니다. 스테이지와 관련된 작업은 병렬로 실행됩니다.
1stages:
2 - merge-request
3 - test-us-west-1
4 - test-us-east-2
5 - production-us-west-2
6 - production-us-east-1
7 - production-ca-central-1작업
작업은 스테이지와 연결되고 환경과 연결될 수 있습니다. 규칙은 특정 작업이 실행될지 여부를 제어합니다. 이 예제의 규칙은 파이프라인 브랜치가 기본 브랜치가 아닌지, 파이프라인이 병합 요청의 일부로 자동으로 실행되지 않는지 확인합니다.
작업마다 다른 이미지를 지정할 수 있습니다. 작업 스크립트에 필요한 도구로 이미지를 설정할 수 있습니다. 스크립트 섹션은 작업이 실행될 때 이루어지는 일련의 단계를 정의합니다.
1deploy-test-us-west-1:
2 stage: test-us-west-1
3 environment: test-us-west-1
4 rules:
5 - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
6 image: registry.gitlab.com/gitlab-org/cloud-deploy/aws-base:latest
7 script:
8 - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
9 - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
10 - aws cloudformation deploy --region us-west-1 --template-file template.yml --stack-name OpenDevOpsS3Infra병합 요청 파이프라인
병합 요청이 승인되면 GitLab에서 파이프라인을 자동으로 실행합니다. 규칙을 추가하여 이 파이프라인에 대한 작업을 만들 수 있습니다. 이 예에서는 작업이 항상 성공합니다.
1merge-request-pipeline-job:
2 stage: merge-request
3 rules:
4 - if: $CI_PIPELINE_SOURCE == "merge_request_event"
5 script:
6 - echo "This pipeline always succeeds and enables merges during merge requests"
7 - echo true기능 브랜치로 푸시
명령줄에서 다음을 실행하여 s3_infra 리포지토리의 IM-5 브랜치로 변경 사항을 푸시합니다. 커밋 메시지에 Jira 이슈 ID 및 브랜치 이름을 포함하면 Jira GitLab 통합이 프로젝트 진행 상황을 추적하도록 할 수 있습니다.
1git add --all
2git commit -m "IM-5 add .gitlab-ci.yml to s3_infra"
3git push -u origin IM-5CI/CD를 클릭한 다음 파이프라인을 클릭하여 파이프라인이 실행되는 것을 확인합니다.

실행 중인 파이프라인의 파이프라인 ID를 클릭합니다.

자세한 내용을 확인하려면 작업을 클릭하세요.

병합 요청 만들기
병합 요청을 만들려면 병합 요청을 클릭한 다음 병합 요청 만들기를 클릭합니다.

기능 브랜치를 소스 브랜치로 선택하고 브랜치 비교 및 계속을 클릭합니다.

담당자 및 검토자를 선택합니다.

병합 요청 만들기를 클릭합니다.

코드 변경 사항을 검토한 다음 승인을 클릭합니다.

CI/CD를 클릭한 다음 파이프라인을 클릭하여 병합 요청 파이프라인이 실행되는 것을 확인합니다.

파이프라인 ID를 클릭합니다. 실행된 유일한 작업은 merge-request-pipeline-job이라는 점에 주목하세요.

병합 요청을 클릭한 다음 활성 병합 요청을 클릭하고 병합을 클릭하여 병합 요청으로 돌아갑니다. 그러면 또 다른 파이프라인이 시작됩니다.

CI/CD를 클릭한 다음 Pipelines를 클릭합니다. 파이프라인 ID를 클릭합니다.

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

프로젝트 이름을 추가하고 프로젝트 URL에서 적절한 그룹을 선택합니다. 프로젝트 만들기를 클릭하여 진행합니다.

터미널에서 SystemTests 리포지토리로 이동하고 다음을 실행하여 코드를 GitLab으로 푸시합니다.
1git add --all
2git commit -m "IM-8 add SubmitImage to gitlab"
3git remote add origin git@gitlab.com:pmmquickstartguides/submitimage.git
4git branch -m mainline
5git push -u origin mainlineSystemTests 리포지토리에는 .gitlab-ci.yml 파일이 필요하지 않습니다. 기타 파이프라인의 실행을 위한 테스트를 제공하므로 자체 파이프라인이 없습니다. SystemTests의 원격 URL을 기록해 두세요. SubmitImage, GetImageLabel, InvokeLabeller CI/CD 파이프라인을 호출하면 테스트 단계에서 SystemTests 리포지토리가 복제됩니다. 이후 리포지토리의 gitlab-ci.yml을 올바른 URL로 업데이트해야 합니다.
배포 토큰 추가
다른 파이프라인 실행 중에 이 리포지토리를 복제하려면 배포 토큰을 추가해야 합니다. 설정을 클릭한 다음 리포지토리를 클릭합니다. 아래로 스크롤하여 배포 토큰을 펼치세요.

이름을 입력하고 read_repository를 확인하고 배포 토큰 만들기를 클릭합니다.

배포 토큰 사용자 이름은 자동으로 생성됩니다. 배포 토큰 비밀번호는 만들 때 한 번 제공됩니다. 나중에 참조할 수 있도록 암호 관리 도구에 추가하세요. 가이드의 뒷부분에서 배포 토큰 사용자 이름은 gitlab_deploy_token으로 참조되며 배포 토큰 비밀번호는 gitlab_deploy_password로 참조됩니다.

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

GitLab으로 이동하여 새 프로젝트를 클릭한 다음 빈 프로젝트 만들기를 클릭합니다. 프로젝트 이름을 추가하고 프로젝트 URL에서 적절한 그룹을 선택합니다. 프로젝트 만들기를 클릭하여 진행합니다.

터미널에서 SubmitImage 리포지토리로 이동하고 다음을 실행하여 코드를 GitLab으로 푸시합니다.
1git add --all
2git commit -m "IM-8 add SubmitImage to gitlab"
3git remote add origin git@gitlab.com:pmmquickstartguides/submitimage.git
4git branch -m mainline
5git push -u origin mainlineAWS 액세스 키를 추가하고 보호되는 브랜치를 구성하고 배포 환경을 설정해야 합니다.
그런 다음 SystemTests 리포지토리에서 배포 키를 추가하여 SubmitImage GitLab 파이프라인이 SystemTests를 다운로드하고 실행할 수 있도록 합니다.
마지막으로 AWS 계정 ID를 CI/CD 변수로 추가합니다.

AWS에 배포하기 위한 .gitlab-ci.yml
터미널에 있는 SubmitImage 리포지토리로 이동하여 Jira 이슈 ID의 이름을 딴 브랜치를 만듭니다.
1git checkout -b IM-8다음 yaml로 .gitlab-ci.yml 파일을 만듭니다. 이것은 테스트, 스테이징, 프로덕션 환경을 위한 배포 워크플로를 정의합니다. SystemTests가 SystemTests 리포지토리가 되려면 git clone 라인을 업데이트해야 합니다.
1stages:
2 - merge-request
3 - run-unit-tests
4#US-WEST-1
5 - deploy-us-west-1
6 - test-us-west-1
7#US-EAST-2
8 - deploy-us-east-2
9 - test-us-east-2
10#US-WEST-2
11 - deploy-us-west-2
12 - test-us-west-2
13#US-EAST-1
14 - deploy-us-east-1
15 - test-us-east-1
16#CA-CENTRAL-1
17 - deploy-ca-central-1
18 - test-ca-central-1
19
20merge-request-pipeline-job:
21 stage: merge-request
22 rules:
23 - if: $CI_PIPELINE_SOURCE == "merge_request_event"
24 script:
25 - echo "This pipeline always succeeds and enables merge"
26 - echo true
27
28run-unit-tests:
29 stage: run-unit-tests
30 image: golang:buster
31 rules:
32 - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
33 script:
34 - cd submitImage
35 - go test ./opendevopslambda/...
36
37#US-WEST-1
38deploy-us-west-1:
39 stage: deploy-us-west-1
40 environment: test-us-west-1
41 image: python:latest
42 rules:
43 - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
44 before_script:
45 - pip3 install awscli --upgrade
46 - pip3 install aws-sam-cli --upgrade
47 - wget https://golang.org/dl/go1.16.6.linux-amd64.tar.gz
48 - rm -rf /usr/local/go && tar -C /usr/local -xzf go1.16.6.linux-amd64.tar.gz
49 - export PATH=$PATH:/usr/local/go/bin
50 - go version
51 script:
52 - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
53 - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
54 - sam build
55 - sam package --output-template-file submit-image-packaged.yaml --s3-bucket open-devops-code-us-west-1-$AWS_ACCOUNT_ID --region us-west-1
56 - sam deploy --template-file submit-image-packaged.yaml --stack-name OpenDevOpsSubmitImage --s3-bucket open-devops-code-us-west-1-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region us-west-1 --no-fail-on-empty-changeset
57
58 #test-us-west-1:
59 # stage: test-us-west-1
60 # environment: test-us-west-1
61 # image: golang:buster
62 # rules:
63 # - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
64 # script:
65 # - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
66 # - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
67 # - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
68 # - cd systemtests
69 # - go test -v ./... -aws_region=us-west-1
70
71#US-EAST-2
72deploy-us-east-2:
73 stage: deploy-us-east-2
74 environment: test-us-east-2
75 image: python:latest
76 rules:
77 - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
78 before_script:
79 - pip3 install awscli --upgrade
80 - pip3 install aws-sam-cli --upgrade
81 - wget https://golang.org/dl/go1.16.6.linux-amd64.tar.gz
82 - rm -rf /usr/local/go && tar -C /usr/local -xzf go1.16.6.linux-amd64.tar.gz
83 - export PATH=$PATH:/usr/local/go/bin
84 - go version
85 script:
86 - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
87 - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
88 - sam build
89 - sam package --output-template-file submit-image-packaged.yaml --s3-bucket open-devops-code-us-east-2-$AWS_ACCOUNT_ID --region us-east-2
90 - sam deploy --template-file submit-image-packaged.yaml --stack-name OpenDevOpsSubmitImage --s3-bucket open-devops-code-us-east-2-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region us-east-2 --no-fail-on-empty-changeset
91
92 #test-us-east-2:
93 # stage: test-us-east-2
94 # environment: test-us-east-2
95 # image: golang:buster
96 # rules:
97 # - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
98 # script:
99 # - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
100 # - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
101 # - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
102 # - cd systemtests
103 # - go test -v ./... -aws_region=us-east-2
104
105#US-WEST-2
106deploy-us-west-2:
107 stage: deploy-us-west-2
108 environment: production-us-west-2
109 image: python:latest
110 rules:
111 - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
112 before_script:
113 - pip3 install awscli --upgrade
114 - pip3 install aws-sam-cli --upgrade
115 - wget https://golang.org/dl/go1.16.6.linux-amd64.tar.gz
116 - rm -rf /usr/local/go && tar -C /usr/local -xzf go1.16.6.linux-amd64.tar.gz
117 - export PATH=$PATH:/usr/local/go/bin
118 - go version
119 script:
120 - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
121 - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
122 - sam build
123 - sam package --output-template-file submit-image-packaged.yaml --s3-bucket open-devops-code-us-west-2-$AWS_ACCOUNT_ID --region us-west-2
124 - sam deploy --template-file submit-image-packaged.yaml --stack-name OpenDevOpsSubmitImage --s3-bucket open-devops-code-us-west-2-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region us-west-2 --no-fail-on-empty-changeset
125
126 #test-us-west-2:
127 # stage: test-us-west-2
128 # environment: production-us-west-2
129 # image: golang:buster
130 # rules:
131 # - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
132 # script:
133 # - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
134 # - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
135 # - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
136 # - cd systemtests
137 # - go test -v ./... -aws_region=us-west-2
138
139#US-EAST-1
140deploy-us-east-1:
141 stage: deploy-us-east-1
142 environment: production-us-east-1
143 image: python:latest
144 rules:
145 - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
146 before_script:
147 - pip3 install awscli --upgrade
148 - pip3 install aws-sam-cli --upgrade
149 - wget https://golang.org/dl/go1.16.6.linux-amd64.tar.gz
150 - rm -rf /usr/local/go && tar -C /usr/local -xzf go1.16.6.linux-amd64.tar.gz
151 - export PATH=$PATH:/usr/local/go/bin
152 - go version
153 script:
154 - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
155 - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
156 - sam build
157 - sam package --output-template-file submit-image-packaged.yaml --s3-bucket open-devops-code-us-east-1-$AWS_ACCOUNT_ID --region us-east-1
158 - sam deploy --template-file submit-image-packaged.yaml --stack-name OpenDevOpsSubmitImage --s3-bucket open-devops-code-us-east-1-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region us-east-1 --no-fail-on-empty-changeset
159
160 #test-us-east-1:
161 # stage: test-us-east-1
162 # environment: production-us-east-1
163 # image: golang:buster
164 # rules:
165 # - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
166 # script:
167 # - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
168 # - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
169 # - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
170 # - cd systemtests
171 # - go test -v ./... -aws_region=us-east-1
172
173#CA-CENTRAL-1
174deploy-central-1:
175 stage: deploy-ca-central-1
176 environment: production-ca-central-1
177 image: python:latest
178 rules:
179 - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
180 before_script:
181 - pip3 install awscli --upgrade
182 - pip3 install aws-sam-cli --upgrade
183 - wget https://golang.org/dl/go1.16.6.linux-amd64.tar.gz
184 - rm -rf /usr/local/go && tar -C /usr/local -xzf go1.16.6.linux-amd64.tar.gz
185 - export PATH=$PATH:/usr/local/go/bin
186 - go version
187 script:
188 - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
189 - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
190 - sam build
191 - sam package --output-template-file submit-image-packaged.yaml --s3-bucket open-devops-code-ca-central-1-$AWS_ACCOUNT_ID --region ca-central-1
192 - sam deploy --template-file submit-image-packaged.yaml --stack-name OpenDevOpsSubmitImage --s3-bucket open-devops-code-ca-central-1-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region ca-central-1 --no-fail-on-empty-changeset
193
194 #test-central-1:
195 # stage: test-ca-central-1
196 # environment: production-ca-central-1
197 # image: golang:buster
198 # rules:
199 # - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
200 # script:
201 # - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
202 # - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
203 # - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
204 # - cd systemtests
205 # - go test -v ./... -aws_region=ca-central-1통합 테스트 실행은 지금 주석 처리되어 있습니다. 시스템 테스트는 전체 애플리케이션이 배포된 후에만 통과합니다. 리포지토리 통합 테스트 단계의 주석 처리를 제거하고 ImageLabeller의 모든 컴포넌트가 배포된 후에 배포 파이프라인을 실행하려면 다시 한번 푸시하세요. SystemTests가 SystemTests 리포지토리가 되려면 git clone 라인을 업데이트해야 합니다.
.gitlab-ci.yml 파일 이해하기
이 단계는 SubmitImage 리포지토리의 일부인 단위 테스트를 실행합니다.
1unit-test-us-west-1:
2 stage: unit-test-us-west-1
3 environment: test-us-west-1
4 image: golang:buster
5 rules:
6 - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
7 script:
8 - cd submitImage
9 - go test ./opendevopslambda/...이 단계는 AWS SAM을 사용하여 SubmitImage AWS Lambda를 배포합니다. before_script 섹션에 주목하세요. 이 단계는 스크립트 섹션 전에 실행되며 종속성을 설치하고 다양한 도구를 설정하는 데 사용할 수 있습니다.
1deploy-us-west-1:
2 stage: deploy-us-west-1
3 environment: test-us-west-1
4 image: python:latest
5 rules:
6 - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
7 before_script:
8 - pip3 install awscli --upgrade
9 - pip3 install aws-sam-cli --upgrade
10 - wget https://golang.org/dl/go1.16.6.linux-amd64.tar.gz
11 - rm -rf /usr/local/go && tar -C /usr/local -xzf go1.16.6.linux-amd64.tar.gz
12 - export PATH=$PATH:/usr/local/go/bin
13 - go version
14 script:
15 - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
16 - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
17 - sam build
18 - sam package --output-template-file submit-image-packaged.yaml --s3-bucket open-devops-code-us-west-1-$AWS_ACCOUNT_ID --region us-west-1
19 - sam deploy --template-file submit-image-packaged.yaml --stack-name OpenDevOpsSubmitImage --s3-bucket open-devops-code-us-west-1-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region us-west-1 --no-fail-on-empty-changeset이 단계는 SystemTests 리포지토리에서 통합 테스트를 다운로드하고 실행합니다. SystemTests가 SystemTests 리포지토리가 되려면 git clone 라인을 업데이트해야 합니다.
1test-us-west-1:
2 stage: test-us-west-1
3 environment: test-us-west-1
4 image: golang:buster
5 rules:
6 - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
7 script:
8 - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
9 - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
10 - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
11 - cd systemtests
12 - go test -v ./... -aws_region=us-west-1앞서 만든 배포 토큰은 git clone 라인에서 참조됩니다.
1- git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git기능 브랜치로 푸시
명령줄에서 다음을 실행하여 SubmitImage 리포지토리의 IM-8 브랜치로 변경 사항을 푸시합니다. 커밋 메시지에 Jira 이슈 ID 및 브랜치 이름을 포함하면 Jira GitLab 통합이 프로젝트 진행 상황을 추적하도록 할 수 있습니다.
CI/CD를 클릭한 다음 파이프라인을 클릭하여 파이프라인이 실행되는 것을 확인합니다.

병합 요청 만들기
GitLab이 테스트 환경에 배포한 후에 프로덕션 환경에 배포할 병합 요청을 만듭니다. IM-8 브랜치를 선택합니다.

CI/CD를 클릭한 다음 파이프라인을 클릭하여 병합 요청 파이프라인이 실행되는 것을 확인합니다.

병합 요청 파이프라인이 완료된 후에 변경 사항을 메인 라인에 병합합니다. CI/CD를 클릭한 다음 Pipelines를 클릭하여 프로덕션 파이프라인이 실행되는 것을 확인합니다.

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

GitLab으로 이동하여 새 프로젝트를 클릭한 다음 빈 프로젝트 만들기를 클릭합니다. 프로젝트 이름을 추가하고 프로젝트 URL에서 적절한 그룹을 선택합니다. 프로젝트 만들기를 클릭하여 진행합니다.

터미널에서 InvokeLabeller 리포지토리로 이동하고 다음을 실행하여 코드를 GitLab으로 푸시합니다.
1git add --all
2git commit -m "IM-10 add InvokeLabeller to gitlab"
3git remote add origin git@gitlab.com:pmmquickstartguides/invokelabeller.git
4git branch -m mainline
5git push -u origin mainlineAWS 액세스 키를 추가하고 보호되는 브랜치를 구성하고 배포 환경을 설정해야 합니다.
그런 다음 SystemTests 리포지토리에서 배포 키를 추가하여 InvokeLabeller GitLab 파이프라인이 SystemTests를 다운로드하고 실행할 수 있도록 합니다.
마지막으로 AWS 계정 ID를 CI/CD 변수로 추가합니다.

AWS에 배포하기 위한 .gitlab-ci.yml
터미널에 있는 InvokeLabeller 리포지토리로 이동하여 Jira 이슈 ID의 이름을 딴 브랜치를 만듭니다.
1git checkout -b IM-10다음 yaml로 .gitlab-ci.yml 파일을 만듭니다. 이것은 테스트, 스테이징, 프로덕션 환경을 위한 배포 워크플로를 정의합니다. SystemTests가 SystemTests 리포지토리가 되려면 git clone 라인을 업데이트해야 합니다.
1stages:
2 - merge-request
3 - run-unit-tests
4#US-WEST-1
5 - deploy-us-west-1
6 - test-us-west-1
7#US-EAST-2
8 - deploy-us-east-2
9 - test-us-east-2
10#US-WEST-2
11 - deploy-us-west-2
12 - test-us-west-2
13#US-EAST-1
14 - deploy-us-east-1
15 - test-us-east-1
16#CA-CENTRAL-1
17 - deploy-ca-central-1
18 - test-ca-central-1
19
20merge-request-pipeline-job:
21 stage: merge-request
22 rules:
23 - if: $CI_PIPELINE_SOURCE == "merge_request_event"
24 script:
25 - echo "This pipeline always succeeds and enables merge"
26 - echo true
27
28run-unit-tests:
29 stage: run-unit-tests
30 image: python:3.8-buster
31 rules:
32 - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
33 before_script:
34 - pip3 install pytest
35 - pip3 install moto
36 - pip3 install -r tst/requirements.txt --user
37 script:
38 - python3 -m pytest -v tst/unit --junitxml=test-reports/report.xml
39
40#US-WEST-1
41deploy-us-west-1:
42 stage: deploy-us-west-1
43 environment: test-us-west-1
44 image: python:3.8-buster
45 rules:
46 - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
47 before_script:
48 - pip3 install awscli --upgrade
49 - pip3 install aws-sam-cli --upgrade
50 script:
51 - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
52 - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
53 - sam build
54 - sam package --output-template-file invoke-labeller-packaged.yaml --s3-bucket open-devops-code-us-west-1-$AWS_ACCOUNT_ID --region us-west-1
55 - sam deploy --template-file invoke-labeller-packaged.yaml --stack-name OpenDevOpsInvokeLabeller --s3-bucket open-devops-code-us-west-1-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region us-west-1 --no-fail-on-empty-changeset
56
57 #test-us-west-1:
58 # stage: test-us-west-1
59 # environment: test-us-west-1
60 # image: golang:buster
61 # rules:
62 # - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
63 # script:
64 # - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
65 # - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
66 # - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
67 # - cd systemtests
68 # - go test -v ./... -aws_region=us-west-1
69
70#US-EAST-2
71deploy-us-east-2:
72 stage: deploy-us-east-2
73 environment: test-us-east-2
74 image: python:3.8-buster
75 rules:
76 - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
77 before_script:
78 - pip3 install awscli --upgrade
79 - pip3 install aws-sam-cli --upgrade
80 script:
81 - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
82 - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
83 - sam build
84 - sam package --output-template-file invoke-labeller-packaged.yaml --s3-bucket open-devops-code-us-east-2-$AWS_ACCOUNT_ID --region us-east-2
85 - sam deploy --template-file invoke-labeller-packaged.yaml --stack-name OpenDevOpsInvokeLabeller --s3-bucket open-devops-code-us-east-2-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region us-east-2 --no-fail-on-empty-changeset
86
87 #test-us-east-2:
88 # stage: test-us-east-2
89 # environment: test-us-east-2
90 # image: golang:buster
91 # rules:
92 # - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
93 # script:
94 # - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
95 # - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
96 # - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
97 # - cd systemtests
98 # - go test -v ./... -aws_region=us-east-2
99
100#US-WEST-2
101deploy-us-west-2:
102 stage: deploy-us-west-2
103 environment: production-us-west-2
104 image: python:3.8-buster
105 rules:
106 - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
107 before_script:
108 - pip3 install awscli --upgrade
109 - pip3 install aws-sam-cli --upgrade
110 script:
111 - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
112 - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
113 - sam build
114 - sam package --output-template-file invoke-labeller-packaged.yaml --s3-bucket open-devops-code-us-west-2-$AWS_ACCOUNT_ID --region us-west-2
115 - sam deploy --template-file invoke-labeller-packaged.yaml --stack-name OpenDevOpsInvokeLabeller --s3-bucket open-devops-code-us-west-2-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region us-west-2 --no-fail-on-empty-changeset
116
117 #test-us-west-2:
118 # stage: test-us-west-2
119 # environment: production-us-west-2
120 # image: golang:buster
121 # rules:
122 # - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
123 # script:
124 # - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
125 # - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
126 # - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
127 # - cd systemtests
128 # - go test -v ./... -aws_region=us-west-2
129
130#US-EAST-1
131deploy-us-east-1:
132 stage: deploy-us-east-1
133 environment: production-us-east-1
134 image: python:3.8-buster
135 rules:
136 - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
137 before_script:
138 - pip3 install awscli --upgrade
139 - pip3 install aws-sam-cli --upgrade
140 script:
141 - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
142 - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
143 - sam build
144 - sam package --output-template-file invoke-labeller-packaged.yaml --s3-bucket open-devops-code-us-east-1-$AWS_ACCOUNT_ID --region us-east-1
145 - sam deploy --template-file invoke-labeller-packaged.yaml --stack-name OpenDevOpsInvokeLabeller --s3-bucket open-devops-code-us-east-1-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region us-east-1 --no-fail-on-empty-changeset
146
147 #test-us-east-1:
148 # stage: test-us-east-1
149 # environment: production-us-east-1
150 # image: golang:buster
151 # rules:
152 # - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
153 # script:
154 # - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
155 # - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
156 # - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
157 # - cd systemtests
158 # - go test -v ./... -aws_region=us-east-1
159
160#CA-CENTRAL-1
161deploy-central-1:
162 stage: deploy-ca-central-1
163 environment: production-ca-central-1
164 image: python:3.8-buster
165 rules:
166 - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
167 before_script:
168 - pip3 install awscli --upgrade
169 - pip3 install aws-sam-cli --upgrade
170 script:
171 - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
172 - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
173 - sam build
174 - sam package --output-template-file invoke-labeller-packaged.yaml --s3-bucket open-devops-code-ca-central-1-$AWS_ACCOUNT_ID --region ca-central-1
175 - sam deploy --template-file invoke-labeller-packaged.yaml --stack-name OpenDevOpsInvokeLabeller --s3-bucket open-devops-code-ca-central-1-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region ca-central-1 --no-fail-on-empty-changeset
176
177 #test-central-1:
178 # stage: test-ca-central-1
179 # environment: production-ca-central-1
180 # image: golang:buster
181 # rules:
182 # - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
183 # script:
184 # - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
185 # - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
186 # - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
187 # - cd systemtests
188 # - go test -v ./... -aws_region=ca-central-1Jira Software 및 다양한 연결된 도구를 사용하여 애플리케이션을 개발, 배포 및 관리하는 방법을 보여주기 위해 저희 팀에서는 머신러닝을 사용하여 이미지에 레이블을 적용하는 간단한 AWS 기반 데모 애플리케이션인 ImageLabeller를 만들었습니다.
이 페이지는 Bitbucket으로 ImageLabeller를 배포하는 방법을 다룹니다. 시작하기 전에 컨텍스트를 알아보도록 ImageLabeller 아키텍처 및 AWS SageMaker 설정 페이지를 읽어보는 것이 좋습니다.
AWS SageMaker 엔드포인트로 src/app.py 업데이트
InvokeLabeller의 src/app.py 파일을 열고 query_endpoint를 찾습니다. endpoint_name 및 클라이언트 region_name을 AWS SageMaker 노트북과 일치하도록 변경합니다.
1def query_endpoint(img):
2 endpoint_name = 'jumpstart-dft-image-labeller-endpoint'
3 client = boto3.client(service_name='runtime.sagemaker', region_name='us-west-1')
4 response = client.invoke_endpoint(EndpointName=endpoint_name, ContentType='application/x-image', Body=img)
5 model_predictions = json.loads(response['Body'].read())['predictions'][0]
6 return model_predictions기능 브랜치로 푸시
명령줄에서 다음을 실행하여 InvokeLabeller 리포지토리의 IM-10 브랜치로 변경 사항을 푸시합니다. 커밋 메시지에 Jira 이슈 ID 및 브랜치 이름을 포함하면 Jira GitLab 통합이 프로젝트 진행 상황을 추적하도록 할 수 있습니다.
1git add --all
2git commit -m "IM-10 add .gitlab-ci.yml to InvokeLabeller"
3git push -u origin IM-10CI/CD를 클릭한 다음 파이프라인을 클릭하여 파이프라인이 실행되는 것을 확인합니다.

병합 요청 만들기
GitLab이 테스트 환경에 배포한 후에 프로덕션 환경에 배포할 병합 요청을 만듭니다. IM-10 브랜치를 선택합니다.

병합 요청 파이프라인이 완료된 후에 변경 사항을 메인 라인에 병합합니다. CI/CD를 클릭한 다음 Pipelines를 클릭하여 프로덕션 파이프라인이 실행되는 것을 확인합니다.

Jira Software 및 다양한 연결된 도구를 사용하여 애플리케이션을 개발, 배포 및 관리하는 방법을 보여주기 위해 저희 팀에서는 머신러닝을 사용하여 이미지에 레이블을 적용하는 간단한 AWS 기반 데모 애플리케이션인 ImageLabeller를 만들었습니다.
이 페이지는 Bitbucket으로 ImageLabeller를 배포하는 방법을 다룹니다. 시작하기 전에 컨텍스트를 알아보도록 ImageLabeller 아키텍처 및 AWS SageMaker 설정 페이지를 읽어보는 것이 좋습니다.