스크립트와 job 로그
스크립트와 job 로그
script 섹션에서는 특별한 구문을 사용해 작업을 더 편하게 만들 수 있어요. 긴 명령을 여러 줄로 나누거나, job 로그에 색상을 넣어 보기 좋게 만들거나, 접고 펼칠 수 있는 커스텀 섹션을 만들 수 있죠. 이 글에서는 script 섹션에서 다루게 될 다양한 기법을 예제와 함께 설명할게요.
출처: 문서
본문
- Tier: Free, Premium, Ultimate
- Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
script 섹션에서 특별한 구문을 사용해 다음을 할 수 있어요.
- 긴 명령을 여러 줄로 나누기
- 색상 코드를 사용해 job 로그를 보기 쉽게 만들기
- 커스텀 접이식 섹션을 만들어 job 로그 출력을 간결하게 하기
script와 함께 특수 문자 사용
때로는 script 명령을 작은따옴표나 큰따옴표로 감싸야 해요. 예를 들어 콜론(:)이 포함된 명령은 작은따옴표(')로 감싸야 합니다. YAML 파서가 텍스트를 "키: 값" 쌍이 아니라 문자열로 해석해야 하기 때문이죠.
예를 들어 이 스크립트는 콜론을 사용해요.
job:
script:
- curl --request POST --header 'Content-Type: application/json' "https://gitlab.example.com/api/v4/projects"
유효한 YAML이 되려면 전체 명령을 작은따옴표로 감싸야 해요. 명령이 이미 작은따옴표를 사용한다면 가능하면 큰따옴표(")로 바꾸세요.
job:
script:
- 'curl --request POST --header "Content-Type: application/json" "https://gitlab.example.com/api/v4/projects"'
CI Lint 도구로 구문이 유효한지 확인할 수 있어요.
다음 문자들도 주의해서 사용하세요.
- {, }, [, ], ,, &, *, #, ?, |, -, <, >, =, !, %, @, `.
0이 아닌 종료 코드 무시
script 명령이 0이 아닌 종료 코드를 반환하면 job이 실패하고 이후 명령은 실행되지 않아요.
이 동작을 피하려면 종료 코드를 변수에 저장하세요.
job:
script:
- exit_code=0
- false || exit_code=$?
- if [ $exit_code -ne 0 ]; then echo "Previous command failed"; fi;
모든 job에 기본 before_script 또는 after_script 설정
before_script와 after_script를 default와 함께 사용할 수 있어요.
default와 함께before_script를 쓰면 모든 job에서 script 명령 앞에 실행되어야 하는 기본 명령 배열을 정의합니다.default와 함께after_script를 쓰면 모든 job이 완료되거나 취소된 뒤 실행되어야 하는 기본 명령 배열을 정의합니다.
job에서 다른 것을 정의해 기본값을 덮어쓸 수 있어요. 기본값을 무시하려면 before_script: [] 또는 after_script: []를 사용하세요.
default:
before_script:
- echo "Execute this `before_script` in all jobs by default."
after_script:
- echo "Execute this `after_script` in all jobs by default."
job1:
script:
- echo "These script commands execute after the default `before_script`,"
- echo "and before the default `after_script`."
job2:
before_script:
- echo "Execute this script instead of the default `before_script`."
script:
- echo "This script executes after the job's `before_script`,"
- echo "but the job does not use the default `after_script`."
after_script: []
job이 취소되면 after_script 명령 건너뛰기
History
- GitLab 17.0에서
ci_canceling_status라는 기능 플래그와 함께 도입됐어요. 기본적으로 활성화되어 있고, GitLab Runner 버전 16.11.1이 필요합니다. - GitLab 17.3에서 일반 공개(Generally available)됨.
ci_canceling_status기능 플래그가 제거됐어요.
after_script 명령은 해당 job의 before_script나 script 섹션이 실행되는 동안 job이 취소되면 실행됩니다.
after_script가 실행되는 동안 UI의 job 상태는 canceling이며, after_script 명령이 완료된 후 canceled로 바뀝니다. after_script 명령이 실행되는 동안 $CI_JOB_STATUS 사전 정의 변수는 canceled 값을 가져요.
job 취소 후 after_script 명령이 실행되는 것을 막으려면 after_script 섹션을 다음과 같이 구성하세요.
after_script섹션 시작에서$CI_JOB_STATUS사전 정의 변수 확인- 값이
canceled이면 실행을 일찍 종료
예를 들어:
job1:
script:
- my-script.sh
after_script:
- if [ "$CI_JOB_STATUS" == "canceled" ]; then exit 0; fi
- my-after-script.sh
긴 명령 나누기
긴 명령을 여러 줄로 나눠 가독성을 높일 수 있어요. |(literal)와 >(folded) YAML 멀티라인 블록 스칼라 표시자를 사용하세요.
여러 명령을 하나의 명령 문자열로 결합하면 마지막 명령의 성공·실패만 보고됩니다. 앞선 명령의 실패는 버그 때문에 무시되요. 이 문제를 해결하려면 각 명령을 별도의 script 항목으로 실행하거나, 각 명령 문자열에 exit 1 명령을 추가하세요.
job 설명의 script 섹션에서 |(literal) YAML 멀티라인 블록 스칼라 표시자를 사용해 명령을 여러 줄에 걸쳐 작성할 수 있어요. 각 줄은 별도의 명령으로 처리됩니다. job 로그에는 첫 명령만 반복되지만, 추가 명령도 여전히 실행돼요.
job:
script:
- |
echo "First command line."
echo "Second command line."
echo "Third command line."
위 예제는 job 로그에 다음과 같이 표시됩니다.
$ echo First command line # collapsed multiline command
First command line
Second command line.
Third command line.
>(folded) YAML 멀티라인 블록 스칼라 표시자는 섹션 사이의 빈 줄을 새 명령의 시작으로 취급합니다.
job:
script:
- >
echo "First command line
is split over two lines."
echo "Second command line."
이것은 > 또는 | 블록 스칼라 표시자가 없는 멀티라인 명령과 비슷하게 동작해요.
job:
script:
- echo "First command line
is split over two lines."
echo "Second command line."
위 두 예제는 job 로그에 다음과 같이 표시됩니다.
$ echo First command line is split over two lines. # collapsed multiline command
First command line is split over two lines.
Second command line.
> 또는 | 블록 스칼라 표시자를 생략하면 GitLab은 비어 있지 않은 줄들을 결합해 명령을 만들어요. 결합했을 때 실행될 수 있는 줄인지 확인하세요.
Shell here documents는 |와 > 연산자에서도 동작합니다. 다음 예제는 소문자를 대문자로 변환해요.
job:
script:
- |
tr a-z A-Z << END_TEXT
one two three
four five six
END_TEXT
결과는 다음과 같습니다.
$ tr a-z A-Z << END_TEXT # collapsed multiline command
ONE TWO THREE
FOUR FIVE SIX
script 출력에 색상 코드 추가
8비트 ANSI 이스케이프 코드를 사용하거나, ANSI 이스케이프 코드를 출력하는 명령·프로그램을 실행해 script 출력에 색을 넣을 수 있어요.
예를 들어 Bash 색상 코드를 사용하면:
job:
script:
- echo -e "\e[31mThis text is red,\e[0m but this text isn't\e[31m however this text is red again."
Shell 환경 변수나 CI/CD 변수에 색상 코드를 정의하면 명령을 더 읽기 쉽고 재사용 가능하게 만들 수 있어요.
예를 들어 앞선 예제를 before_script에 정의한 환경 변수로 사용하면:
job:
before_script:
- TXT_RED="\e[31m" && TXT_CLEAR="\e[0m"
script:
- echo -e "${TXT_RED}This text is red,${TXT_CLEAR} but this part isn't${TXT_RED} however this part is again."
- echo "This text is not colored"
또는 PowerShell 색상 코드로:
job:
before_script:
- $esc="$([char]27)"; $TXT_RED="$esc[31m"; $TXT_CLEAR="$esc[0m"
script:
- Write-Host $TXT_RED"This text is red,"$TXT_CLEAR" but this text isn't"$TXT_RED" however this text is red again."
- Write-Host "This text is not colored"
24비트 색상 코드는 지원되지 않아요.
더 알아보기 (Learn more)
script 섹션의 전체 키워드 참조는 CI/CD YAML script 문서를, job 로그의 접이식 섹션은 job 로그 문서를 참고하세요. YAML 구문 검증은 CI Lint 도구로 할 수 있어요.