Git Flow 정책이란?

Master / release / hotfix / develop / feature 브랜치로 나누어서 코드를 관리하는 방식.

Master branch → 현재 코드 상황을 저장하는 branch

Release branch → 현재 서비스에 배포된 코드 상황을 저장하는 branch (CI / CD 필요)

Develop branch → 개발중인 feature를 테스트 하는 branch (CI / CD 필요)

Feature branch → 현재 개발 중인 코드를 저장하는 branch

Hotfix branch → 급한 이슈로 바로 service에 반영해야 하는 코드를 저장하는 branch (CI / CD 필요)

  1. "feature/기능이름"과 같이 branch명을 정의하고, 각자 해당되는 기능을 구현한다.
  2. 구현이 완료되면 develop branch에 머지 시킨다.
  3. develop branch에 붙어있는 CI / CD 시스템을 통해 deploy된 test 환경에서 원하는 기능이 정상 작동하는지 체크 한다.
  4. 문제가 없다면 release branch에 머지 시켜서 서비스에 노출 시킨다.
  5. master branch에 release branch를 머지 시켜서 코드 동기화를 완료한다.

Git action을 통한 CI / CD 구축

Github에서는 특정 브랜치에 코드가 push 되었을때 특정 행위를 하도록 설정 할 수 있다.

이를 통해 위에 언급했던 Git flow 정책을 구현할 수 있다.

name: test Git action 
on: 
	push: 
		branches: # develop, release, hotfix branch에 push가 되었을때 이 git action이 작동하도록 설정한다.
			- develop
			- release
			- hotfix 
env: 
	TEST_ENV: test_env # 환경 변수 설정 가능.

jobs: 
	build:
		runs-on: ubuntu-latest # action이 도는 환경.
		steps:
		- uses: actions/checkout@v2 # $GITHUB_WORKSPACE로 checkout하여 github action이 해당 repo의 코드를 사용할 수 있도록 설정.
		- name: Get current version
			id: version
			run: ~ ~
		
		# gcp 클러스터에 deploy 할 수 있도록 설정.
		- name: Setup gcloud environment
			users: GoogleCloudPlatform/github-actions/setup-gcloud@master
			with:
				service_account_key: ~~
				project_id: ~~ 
		- run: gcloud ~~ 
		
		# 만약 build할 container image에서 ssh키가 필요하면 다음과 같은 설정으로 ssh-key 설정.
		- name: Setup ssh key
			with: 
				ssh-private-key: ~~

		# 만약 현재 branch가 release, hotfix 이라면, 해당 action 실행.
		- name: Set deploy environment
			if: startsWith(github.ref, 'refs/heads/release') || startsWith(github.ref, 'refs/heads/hotfix')
			run: |
				setting deploy env ...

		# 만약 현재 branch가 develop 이라면, 해당 action 실행.
		- name: Set test deploy environment
			if: startsWith(github.ref, 'refs/heads/develop')
			run: |
				setting test deploy env ...

		# 위에서 ssh키 설정을 했기 때문에 private package install도 가능.
		- name: build docker img and push
			run: |
				~~
				~~ ...

		# 위에서 gcp 클러스터 설정했기 때문에 가능.
		- name: deploy 
			run: |
				kubectl ~~~