LabHub
배우기 러닝패스 코스

GitLab CI/CD

Read the config and answer what runs

LabHub 에서 이어서 보기

한국어 원문으로 표시합니다.

목표

.gitlab-ci.yml 은 프로그램이 아니라 선언입니다. 그래서 "돌려 보면 안다" 가 아니라 읽어서 답할 수 있어야 합니다. 파이프라인이 예상과 다르게 도는 사고는 거의 전부 이 파일을 잘못 읽어서 납니다.

여기서는 GitLab 없이, 설정만 보고 답을 냅니다.

재료

/opt/lab/glci/pipeline.yml   잡 다섯 개짜리 파이프라인
/opt/lab/glci/broken.yml     문법은 맞는데 뜻이 틀린 곳이 네 군데
mkdir -p /root/glci && cp /opt/lab/glci/* /root/glci/ && cd /root/glci

남길 것

01-jobs.txt     잡과 템플릿
02-vars.txt     같은 변수의 세 값
03-rules.txt    상황마다 도는 잡
04-broken.txt   틀린 네 군데와 고치는 법
fixed.yml       고친 파일
check.py        같은 실수를 다시 막는 검사
07-notes.md     왜 그런지

무엇이 잡이고 무엇이 아닌가

pipeline.yml 에서 실제 잡이 몇 개이고 이름이 무엇인지 01-jobs.txt 에 적고, .base 가 왜 잡이 아닌지 한 줄 덧붙이세요.

이름이 점으로 시작하는 항목은 숨겨진 템플릿이라 실행되지 않습니다. extends 로 가져다 쓰기만 합니다.

stages·variables 같은 예약어도 잡이 아닙니다. 잡은 다섯입니다.

같은 이름의 변수가 셋

RETRIES 가 세 곳에 있습니다. build · unit · lint 각각에서 실제로 쓰이는 값이 얼마인지 02-vars.txt 에 적고, 왜 그 값이 이기는지 한 줄 적으세요.

전역 variables 가 가장 약하고, 템플릿(.base)이 그다음, 잡 자신의 variables 가 가장 셉니다.

buildunit.base 를 상속만 하고, lint 는 자기 값을 따로 둡니다.

언제 무엇이 도는가

main 브랜치 푸시 · 머지 리퀘스트 · 태그 세 상황에서 각각 어느 잡이 도는지 03-rules.txt 에 적으세요. 각 상황을 그 낱말(main·머지·태그)로 시작하는 줄로 구분합니다.

rules위에서부터 보다가 처음 맞는 것에서 멈춥니다. 아무것도 안 맞으면 그 잡은 돌지 않습니다.

when: never 만 있는 마지막 줄이 "그 외에는 안 돈다" 를 뜻합니다.

deploy-prod 는 태그에서 when: manual 이라 파이프라인에는 나타나지만 사람이 눌러야 돕니다. 그것도 "돈다" 에 넣되 수동이라고 적으세요.

문법은 맞는데 뜻이 틀린 곳

broken.yml 에서 네 군데를 찾아 04-broken.txt 에 적고, 각각 어떻게 고치는지도 쓰세요.

YAML 로는 전부 읽힙니다. 틀린 것은 GitLab 의 규칙입니다.

고쳐서 파일로 남긴다

네 군데를 실제로 고친 fixed.yml 을 만드세요. 잡은 하나도 없애지 않습니다.

고칠 때 잡을 지우면 검사는 통과하지만 파이프라인의 뜻이 달라집니다. 하던 일은 그대로 두고 표현만 고치세요.

publishcache 를 지우고, build 가 만든 artifacts 를 받게 합니다. 같은 파이프라인 안에서는 앞 단계의 artifacts 가 자동으로 내려오므로, 좁히고 싶을 때만 dependencies 를 적습니다.

같은 실수를 기계가 막게 한다

check.py 를 만들어 broken.yml 은 막고 fixed.yml 은 통과시키세요. 인자로 받은 파일을 검사하고, 문제가 있으면 0이 아닌 값으로 끝냅니다.

네 가지를 봅니다: stages 에 없는 단계, only/exceptrules 의 동거, 뒤 단계를 기다리는 needs, 그리고 단계 간 전달을 cache 로 하려는 것.

막지 못하는 검사는 검사가 아니고, 고친 것까지 막는 검사는 아무도 안 씁니다. 두 파일로 양쪽을 확인하세요.

다음에 읽을 사람에게

여기서 본 것 중 넷 이상을 골라 07-notes.md 에 정리하세요. 무엇을 했는지가 아니라 왜 그런지를 적습니다.

파이프라인이 예상과 다르게 돌 때의 자신이 읽는다고 생각하세요. "rules 를 봤다" 는 도움이 안 되고, "rules 는 첫 일치에서 멈추므로 아래에 적은 조건은 위가 맞으면 영영 안 본다" 는 도움이 됩니다.