스크립트와 job 로그

스크립트와 job 로그

script 섹션에서는 특별한 구문을 사용해 작업을 더 편하게 만들 수 있어요. 긴 명령을 여러 줄로 나누거나, job 로그에 색상을 넣어 보기 좋게 만들거나, 접고 펼칠 수 있는 커스텀 섹션을 만들 수 있죠. 이 글에서는 script 섹션에서 다루게 될 다양한 기법을 예제와 함께 설명할게요.

출처: 문서

본문

  • Tier: Free, Premium, Ultimate
  • Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated

script 섹션에서 특별한 구문을 사용해 다음을 할 수 있어요.

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_scriptafter_scriptdefault와 함께 사용할 수 있어요.

  • 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_scriptscript 섹션이 실행되는 동안 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 도구로 할 수 있어요.