gitlab CI/CD

hyuckhoon.ko·2020년 12월 30일
0

What I learned in first year

목록 보기
27/146

파일명 오타주의보





1. skeleton CI/CD config

1) 프로젝트 최상단에 .gitlab-ci.yml파일 생성


stages:
  - Test and Lint
  - Build and Push
  - Staging Plan
  - Staging Apply
  - Production Plan
  - Production Apply
  - Destroy
  
Test and Lint: 
  stage: Test and Lint
  script: 
    - echo "Test and Lint"
  rules:
    - if: '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME =~ /^(master|production)$/ || $CI_COMMIT_BRANCH =~ /^(master|production)$/'

Validate Terraform:
  stage: Test and Lint
  script:
    - echo "Validate Terraform"
  rules:
    - if: '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME =~ /^(master|production)$/ || $CI_COMMIT_BRANCH =~ /^(master|production)$/'
 
Build and Push:
  stage: Build and Push
  script:
    - echo "Build and Push Docker Image"
  rules:
    - if: '$CI_COMMIT_BRANCH =~ /^(master|production)$/'     
    
Staging Plan:
  stage: Staging Plan
  script:
    - echo "Run Terraform Plan for Staging"
  rules:
    - if: '$CI_COMMIT_BRANCH =~ /^(master|production)$/'     
    
Staging Apply:
  stage: Staging Apply
  script:
    - echo "Run Terraform Apply for Staging"
  rules:
    - if: '$CI_COMMIT_BRANCH =~ /^(master|production)$/'     
    
Production Plan:
  stage: Production Plan
  script:
    - echo "Run Terraform Plan for Production"
  rules:
    - if: '$CI_COMMIT_BRANCH == "production"'     

Production Apply:
  stage: Production Apply
  script:
    - echo "Run Terraform Apply for Production"
  rules:
    - if: '$CI_COMMIT_BRANCH == "production"'     
    
Staging Destroy:
  stage: Destroy
  script:
    - echo "Run Terraform Destroy for Staging"
  rules:
    - if: '$CI_COMMIT_BRANCH =~ /^(master|production)$/' 
      when: manual

Production Destroy:
  stage: Destroy
  script:
    - echo "Run Terraform Destroy for Production"
  rules:
    - if: '$CI_COMMIT_BRANCH == "production"' 
      when: manual



2. 주요사항

(1) gitlab.yml 포맷

stages:
  - Test and Lint
  - Build and Push
  - Staging Plan
  - Staging Apply
  - Production Plan
  - Production Apply
  - Destroy

사용자가 직접 stage들을 정의한다.
크게 7가지의 stage들을 구성했다.


(2) rules

우리는 현재 gitlab기반의 ci/cd를 구상하고 있다.
파이프라인을 구축할 때, 트리거를 염두에 둬야 한다.


"어떤 순간에 또는 어떤 시점에 이러이러한 이벤트를 자동으로 진행했으면 좋겠다."


따라서,
(1)에서 크게 구분한 7가지의 stage마다
그 규칙(=시점)을 지정하는 것은 당연하면서도 자연스럽다.

Test and Lint: 
  stage: Test and Lint     
  script: 
    - echo "Test and Lint"
  rules:
    - if: '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME =~ /^(master|production)$/ || $CI_COMMIT_BRANCH =~ /^(master|production)$/'

stage: Test and Lint
라고 다시 언급하고 있다.
헷갈릴 수도 있는 것이

가장 맨위의 Test and Lint 가 중복 아니냐 라고 할 수도 있지만,
이건 메타언어(메타태그)로 보면 된다.

즉,

Stage for test and lint:
    stage: Test and Lint
    script:
        - echo "Test and Lint~~!"

와 같이 작성해도 된다.



$CI_MERGE_REQUEST_TARGET_BRANCH_NAME
머지 리퀘스트를 요청한 브랜치 이름을 의미한다.

/^(master|production)%/
바로 그 브랜치가 master 또는 production인 순간을 의미한다.



$CI_COMMIT_BRANCH
remote 레포에 머지가 된 직후의 브랜치를 의미한다.

이때 역시, /^(master|production)$/
바로 그 브랜치가 master 또는 production인 순간을 의미한다.


좀 더 자연스럽게 설명하면

  • merge request할 때(merge 이전)
  • master나 production 브랜치에 merge 됐을 때

이 두 경우에
"정의한 이벤트를 진행하고 싶다"고 하는 것이다.



0개의 댓글