#TIL #gitlab CI/CD 파이프라인 시작 조건을 rules로 제어

gitlab CI/CD 파이프라인 rules 설정 파라미터를 사용하면 특정 조건에만 파이프라인을 시작할 수 있다.

rules:
  - if: '$CI_COMMIT_REF_NAME == "master" || $CI_COMMIT_REF_NAME =~ /^deploy_.*$/'
    changes:
      - src/*
      - src/**/*
      - data_table/*
      - data_table/**/*
    when: always
  - if: '$CI_PIPELINE_SOURCE == "web"'
    when: manual

master 브랜치와 deploy_ 문자열로 시작하는 브랜치에 머지하고 특정 디렉터리 파일이 변경됐을 때, 실행한다. 웹에서 버튼을 눌러 시작했을 때, 동작을 다르게 할 수 있다. 웹에서 버튼을 누르면 조건 검사를 하지 않고 무조건 파이프라인을 시작한다.

12.3.5 버전 기준으로 only/except 설정 파라미터도 있지만 언제 변경될 지 모른다는 경고가 있다. 복잡하지만 사라질 위험이 적은 rules를 사용했다.

trigger:
  script:
    - 'TOKEN="PRIVATE-TOKEN: XXXXXXXXXXXXXXXXXXXXXXXX"'
    - export LAST_COMMIT=$(curl --header "$TOKEN" "$API_URL" | python -c "import sys, json; print json.load(sys.stdin)[1]['sha']")
    - echo "" >trigger_variables
    - if git diff $LAST_COMMIT HEAD --name-only|grep "src/|data_table/"; then
    -     echo 'export TRIGGER="true"' >>trigger_variables
    - fi
    stage: trigger
    artifacts:
      paths:
        - trigger_variables

rules 설정 파라미터가 나오기 전에는 첫 파이프라인 스테이지에서 변경 사항을 직접 조사했다. 파이프라인 스테이지 간 정보를 주고받는 방법이 없어서 파일로 만들어서 artifacts로 다음 스테이지에 전달한다.

예전 방식도 그럭저럭 동작은 했다. 파이프라인 시작 후 검사해서 시작은 했지만, 조건에 안 맞아 실행은 안 한 파이프라이이 많다. 파이프라인이 연속으로 여러 개 생기면 gitlab이 파이프라인을 취소시키는 최적화를 한다. 특정 디렉터리 변경 사항을 관찰하고 실행하는 설정을 알 리 없는 gitlab이 중요한 파이프라인을 취소시키곤 했다.

Feedback plz <3 @ohyecloudy, ohyecloudy@gmail.com

A Random Post