IaaS/퍼블릭클라우드

(AWS) CodePipeline, CodeCommit, CodeBuild, CodeDeploy로 GitFlow 구현

armyost 2022. 1. 13. 10:08
728x90

AWS CI CD리소스를 통하여 어떻게 브랜치 운영의 끝판왕인 GitFlow를 구현할 지 설명하는 포스팅이다. 

 

원문링크 : https://aws.amazon.com/blogs/devops/implementing-gitflow-using-aws-codepipeline-aws-codecommit-aws-codebuild-and-aws-codedeploy/

 

Implementing GitFlow Using AWS CodePipeline, AWS CodeCommit, AWS CodeBuild, and AWS CodeDeploy | Amazon Web Services

This post provides a high-level framework for how to implement GitFlow using AWS CodePipeline, AWS CodeCommit, AWS CodeBuild, and AWS CodeDeploy. We also provide AWS CloudFormation templates and AWS CLI commands to help you get going. Before we begin, we w

aws.amazon.com

 

 

시작전에 Trunk-based development를 통하여 CI를 구축하려는 Amazon 팀을 칭찬한다. 

Trunk-based development란 개발자들이 규칙적으로 그들의 Code변화를 중앙 Repository에 Merge함으로써 복잡성을 정기적으로 줄일 수 있는 방안이라고 생각한다. 이런 Trunk-Based Continuouse Integration은 Production에 변화를 줄때 Lead-time을 줄여준다.

 

Gitflow는 여러 레벨의 Branch로 이루어 져있다. "Branch-Based Development" 이는 자칫 잘못하면 '낮은 빈도의 Merge→ Merge의 부담상승→길어지는 Lead-Time'을 유발할수 있음으로 주의하자.

 

기본적으로 Master브랜치는 Production-Ready로 사용하고 Develop Branch를 CI의 MainLine으로 사용한다. Master와 Develop 브랜치는 영구적이다. 그러나 Gitflow는 짧은 생명주기의 Feature를 추천한다. 

 

 

 

GitFlow guidlines은 다음과 같다. 

  • 지속적인 CI를 위해 Develop 을 사용해라
  • 복수의 feature 작업을 위해 feature branches를 사용해라
  • Hotfix를 Master에 push코자 할때는 Master에서 branch를 별도로 따라
  • 매 Release가 있을때마다 master에 Merge해라
  • Master는 Production-Ready Code를 포함토록 해라 

 

Master나 Develop과 같은 영구적 Branch는 다음 프로세스를 따른다

  • AWS CodeCommit master/develop branch
  • AWS CodeBuild 프로젝트는 모든 Branch에 사용되게 생성
  • AWS CodeDeploy 어플리케이션은 모든 Branch에 사용되게 생성
  • AWS Cloudformation stack (EC2 instance)을 Master(Prod)와 Develop(stage) 브랜치에 필요한 리소스 생성

 

임시적인 Branch는 다음을 따른다.

  • AWS CodeCommit feature/hotfix/release branch
  • 각 브랜치 마다 AWS CodePipeline을 생성한다. 
  • 각 브랜치 마다 AWS CodeDeploy로 development group을 만든다
  • AWS Cloudformation stck (EC2 instance)을 각 브랜치 마다 생성하여 리소스를 생성한다. 

 

 

 

기본 가이드라인(EC2혹은 On-Premise의 경우)

  • 각각의 브랜치는 AWS CodePipeline을 갖고 있다. 
  • AWS CodePipeline은 CodeCommit을 Source Provider로, CodeBuild를 Build Provider로, CodeDeploy를 Deployment Provider로 구성되어 있다. 
  • AWS CodeBuild는 AWS CodePipeline를 Source로 구성된다. 
  • 각 AWS CodePipeline은 AWS CodeDeploy  Deployment그룹을 가지고 배포를 위해 Name Tag를 사용한다. 
  • 단일 Amazon S3버킷은 artifact저장소로 사용된다. 그러나 분리해서 저장할 수 도 있다. 

 

 

1. 아래의 AWS CloudFormation 템플릿을 통하여 Master와 Develop의 환경,역할,Repository, VPC, EC2, CodeBuild, CodeDeploy, CodePipeline를 생성한다. 

$ aws cloudformation create-stack --stack-name GitFlowEnv \ --template-body https://s3.amazonaws.com/ee-assets-prod-us-east-1/modules/e3211b1daa9f4bea93f703e17ef0026f/v1/aws-devops-workshop-environment-setup.template \ --capabilities CAPABILITY_IAM

$ aws cloudformation create-stack --stack-name GitFlowCiCd \ --template-body https://s3.amazonaws.com/ee-assets-prod-us-east-1/modules/e3211b1daa9f4bea93f703e17ef0026f/v1/aws-pipeline-commit-build-deploy.template \ --capabilities CAPABILITY_IAM \ --parameters ParameterKey=MainBranchName,ParameterValue=master ParameterKey=DevBranchName,ParameterValue=develop
 
 
생성이 성공적으로 완료되면 다음과 같이 보여야 한다. 
 
 
2. 앱 컨텐츠를 AWS CodeCommit 레포지토리 WebAppRepo에 Push한다.
 
 
3. Branch를 초기화 한다.

 

$ git flow init​
 
이제 새로운 프로젝트를 시작한다고 가정하고 feature를 생성하자
$ git flow feature start <branch>

 

 

 

4. feature-x라는 Branch를 생성하기 위해 Stack을 업데이트 한다. .
$ aws cloudformation update-stack --stack-name GitFlowCiCd \ --template-body https://s3.amazonaws.com/ee-assets-prod-us-east-1/modules/e3211b1daa9f4bea93f703e17ef0026f/v1/aws-pipeline-commit-build-deploy-update.template \ --capabilities CAPABILITY_IAM \ --parameters ParameterKey=MainBranchName,ParameterValue=master ParameterKey=DevBranchName,ParameterValue=develop ParameterKey=FeatureBranchName,ParameterValue=feature-x
 
5. 완료하면 feature-x Branch가 CodePipeline 콘솔에 보인다. 이제 빌드와 배포할 준비가 된 것이다. 테스트를 하고 싶으면 이 브랜치에 수정사항을 발생시켜 Pipeline의 액션을 관찰해보자
 
테스트를 하고 싶으면 이 브랜치에 수정사항을 발생시켜 Pipeline의 액션을 관찰해보자
테스트 결과가 만족스러우면 Finish 커맨드로 Develope에 Merge를 진행하자
$ git flow feature finish <feature>
 
 
변경사항에 대한 Merge가 완료되면 AWS CloudFormation에서 feature-x Branch에 대한 Stack을 삭제한다. 이 과정은 불필요한 자원을 날리는데 도움이 된다.
$ aws cloudformation update-stack --stack-name GitFlowCiCd \ --template-body https://s3.amazonaws.com/ee-assets-prod-us-east-1/modules/e3211b1daa9f4bea93f703e17ef0026f/v1/aws-pipeline-commit-build-deploy.template \ --capabilities CAPABILITY_IAM \ --parameters ParameterKey=MainBranchName,ParameterValue=master ParameterKey=DevBranchName,ParameterValue=develop

 

 
Hotfix도 위와 마찬가지 이다.