CICD

두개의 Git Repository를 하나의 CI/CD Pipeline으로 관리하기

백셀건전지 2021. 8. 31. 13:45

특징

1. 개발과 운영의 project가 분리된 환경

2. feature branch의 생성은 master branch에서 checkout 받아서 생성

3. DEV 환경에서 PROD 환경으로 Push하는 branch가 추가됨


1. CI/CD 파이프라인 구성

1.1 Gitlab User 생성

시작 전 Gitlab CI에 Gitlab Runner가 최소 하나는 등록이 된, CI/CD가 실행 가능한 환경이라고 가정하고 설명한다.

Prod와 Dev Gitlab 모두에 새로운 User를 생성한다. 이 User는 git clone이나 push시 해당  git project에 인증하는 용도로 사용하는 계정이다.

Admin Area에서 'New User'버튼을 통해 git 인증용 user를 생성한다.

sample user로 git-merger이라는 사용자를 생성했다.

Dev Gitlab에도 똑같은 이름과 비밀번호로 사용자를 생성한다.

1.2 Sample Project 생성, gitlab-ci.yml 파일 생성

Prod와 Dev 환경에 sample project를 생성한다. 두 프로젝트는 같은 이름으로 생성한다.

각각의 Project에 새로 만든 User의 접근 권한을 추가한다.

Members - Project Members 화면에서 Developer 권한으로 추가해준다.

Prod Project에서 New file을 클릭하여 .gitlab-ci-dev.yml파일을 생성한다.

해당 파일은 Dev 환경에서 사용될 Gitlab CI 파일이지만, Prod에서 생성하여 Dev Project로 넘기기 위해 Prod Project에서만 만들도록 한다.

image: docker:stable
 
variables:
  DOCKER_DRIVER: overlay2
 
stages:
  - git-push-to-prod
 
git-push-to-prod:
  stage: git-push-to-prod
  image: docker:stable-git
  script:
#   개발 서버의 프로젝트 디렉토리로 이동 ex)test 그룹의 abcd 프로젝트 : /builds/test/abcd
    - cd /builds/msa/cicd-test
#   config에 Dev 환경 Git user 등록
    - git config --global user.email "${GIT_EMAIL}"
    - git config --global user.name "${GIT_ID}"
    - git config --global user.password "${GIT_PW}"
#   remote를 Dev Project에서 Prod Project로 변경
    - git remote set-url origin http://${GIT_ID}:${GIT_PW}@${PROD_GIT_URL}/root/cicd-test.git
    - git remote -v
    - git branch -a
#   remote branch 로컬에 update
    - git remote update
#   로컬에 stage branch 생성하고 적용
    - git checkout -b stage
    - git branch -a
#   origin이라고 선언한 remote에 로컬의 stage를 push
    - git push -u origin stage
  only:
#   Dev 환경의 release branch에서만 수행되도록 설정
    - release

로컬은 gitlab runner container의 로컬이므로 혼동하지 않도록 한다.

같은 방식으로 Prod Project와 Dev Project에 readme.txt 파일도 생성한다.

1.3 Branch 생성 

Prod Project의 Repositories - Branches 화면에서 stage branch를 생성한다.

같은 방법으로 Dev Project에서 develop, release branch를 생성한다.

1.4 CI/CD Variable, .gitlab-ci-dev.yml 파일 설정

위의 .gitlab-ci-dev.yml 파일에서 사용될 변수를 Dev 프로젝트에 정의한다.

Settings - CI / CD 를 클릭한 후 Variable에서 Key와 Value를 차례대로 입력한 후 Save Variable 버튼을 클릭한다.

오른쪽의 Masked를 활성화하면 Log에서 해당 문자열이 숨김처리된다.

같은 화면의 위쪽에 General Pipeline 탭의 Custom CI configuration path 값을 .gitlab-ci-dev.yml 파일로 변경한 후 아래의 'Save Changes' 버튼을 클릭한다.

1.5 Gitlab Issue 생성

Dev 프로젝트에서 Issue를 생성한다.

하지 않아도 무관하지만 CI/CD 환경에서 Feature branch가 Issue와 어떻게 Link되는지 확인하기 위해 Issue를 생성한다.

Issues - New Issue를 클릭하여 새로운 Issue를 생성한다.

Issue가 생성되면 화살표를 클릭하여 branch name을 확인한다.

Prod 프로젝트에서 Dev 프로젝트로 Checkout할 때 해당 Branch name을 이용한다.

 

1.6 로컬에서 Prod 프로젝트 Clone 후 Dev 프로젝트로 push

로컬에서 아래 git 명령어를 순차적으로 입력한다.

예시에서 SSH 툴은 MobaXterm을 사용했으나, git 명령어가 가능한다른 툴을 사용해도 무방하다.

git pull 이후 vi 에디터가 뜬다면 commit message에 대한 수정 화면이므로 수정하지 않고 :wq!를 입력하여 편집기를 종료한다.

cd MyDocuments;
git clone http://${GIT_ID}:${GIT_PW}@${PROD_GIT_URL}/root/cicd-test.git;
cd cicd-test;
git checkout -b 1-feature-cicd-test;
git remote set-url origin http://${GIT_ID}:${GIT_PW}@${DEV_GIT_URL}/msa/cicd-test.git;
git pull origin develop --allow-unrelated-histories;
git add .;
git commit -m "1-feature-cicd-test/Initial Commit";
git push origin 1-feature-cicd-test;

전부 입력하면 Dev Project에 branch가 생성된다.

 

1.7 Feature Branch에서 파일 수정 후 commit, merge

feature branch에서 readme.txt 파일을 수정하고, commit message를 '1-feature-cicd-test/git merge test' 로 입력한다.

 

Feature branch를 develop, release branch로 순차적으로 merge한다.

develop branch로 merge될 때에는 Gitlab runner pipeline이 생성되지 않지만, release branch로 merge 될 때에는 생성된다.

Merge Request - New Merge Request를 클릭하여 Merge Request를 생성한 후, Merge Request 화면에서 'Merge'버튼을 클릭한다.

develop branch에서 release branch로 같은 방법으로 merge를 진행한다.

 

1.9 CI/CD 파이프라인 확인

release에 merge가 되면 자동으로 Runner Pipeline이 트리거되고, runner pipeline은 .gitlab-ci.dev.yml 파일을 기반으로 실행된다.

 

1.10 Prod Project 확인

Prod Project의 Repository - Files 화면에서 readme.txt 파일을 확인하여 Dev Project에서 정상적으로 Push가 되었는지 확인한다.

2. 마치며

Dev Project의 release branch에 적용된 pipeline은 Prod Project의 배포용으로만 사용하고, develop branch와 Prod project의 stage, master branch는 실 배포용으로 .gitlab-ci.yml 파일을 작업한다.

또한, 두 프로젝트별로 다른 .gitlab-ci.yml 파일을 사용하거나(CI/CD - General Pipeline에서 설정), 한 파일을 사용하되 only 옵션으로 branch별 job을 다르게 관리한다.

Feature branch를 생성하는 명령어는 아이디와 비밀번호와 같은 입력값을 변수화하여 shell script로 만들어 배포하면 보다 편리하게 사용할 수 있다.

'CICD' 카테고리의 다른 글

Gitlab Runner 컨테이너 이미지를 AWS ECR에서 가져오기  (0) 2021.08.31