작업 실행 흐름
Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
작업 실행 흐름은 GitLab Runner가 CI/CD 작업을 처음부터 끝까지 처리하는 방법을 설명합니다. GitLab Runner는 작업을 받은 후 vault에서 시크릿을 검색하고(구성된 경우), executor를 준비한 후 CI/CD 작업을 실행합니다.
작업 실행 흐름은 GitLab Runner가 CI/CD 작업을 처음부터 끝까지 처리하는 방법을 설명합니다.
GitLab Runner는 작업을 받은 후 vault에서 시크릿을 검색하고(구성된 경우), executor를 준비한 후 CI/CD 작업을 실행합니다. 모든 CI/CD 작업은 각 단계가 별도의 셸 컨텍스트에서 실행되는 일련의 순차적인 단계로 실행됩니다. 러너는 다음을 수행합니다:
-
작업을 위한 소스 코드를 준비합니다:
- 셸 컨텍스트에 변수를 내보냅니다.
- 구성에 정의된 경우
pre_get_sources_script를 실행합니다. none전략이 구성되지 않은 경우git fetch및 기타 소스 처리 명령을 실행합니다.- 하위 모듈이 있는 경우 업데이트하는 명령을 실행합니다.
- 구성에 정의된 경우
post_get_sources_script를 실행합니다.
-
캐시가 구성되고 이전 단계가 성공한 경우 캐시된 파일을 다운로드합니다:
- 셸 컨텍스트에 변수를 내보냅니다.
- 이전 작업 실행에서 캐시된 파일을 다운로드하는 명령을 실행합니다.
-
아티팩트 다운로드가 구성되고 이전 단계가 성공한 경우 이전 작업의 아티팩트를 다운로드합니다:
- 셸 컨텍스트에 변수를 내보냅니다.
- 이전 작업에서 아티팩트 파일을 다운로드하는 명령을 실행합니다.
-
이전 단계가 성공한 경우 메인 작업 스크립트를 실행합니다:
- 셸 컨텍스트에 변수를 내보냅니다.
- 구성에 정의된 경우
pre_build_script를 실행합니다. - 정의된 경우
before_script명령을 실행합니다. - 메인
script명령을 실행합니다. - 구성에 정의된 경우
post_build_script를 실행합니다.
-
정의된 경우 이전 단계의 실패 여부에 관계없이
after_script명령을 실행합니다:- 새 셸 컨텍스트에 변수를 내보냅니다.
after_script명령을 실행합니다.- 이 명령의 실패는 전체 작업 상태에 영향을 미치지 않습니다.
-
캐시 업로드가 구성된 경우 이전 단계의 실패 여부에 관계없이 캐시에 파일을 업로드합니다:
- 셸 컨텍스트에 변수를 내보냅니다.
- 지정된 파일을 캐시 스토리지에 업로드하는 명령을 실행합니다.
- 이 단계의 실패는 전체 작업 상태에 영향을 미칠 수 있습니다.
-
아티팩트 업로드가 구성된 경우 이전 단계의 실패 여부에 관계없이 아티팩트를 업로드합니다:
- 셸 컨텍스트에 변수를 내보냅니다.
- 지정된 파일을 작업 아티팩트로 업로드하는 명령을 실행합니다.
- 이 단계의 실패는 전체 작업 상태에 영향을 미칠 수 있습니다.
-
심판 업로드가 구성된 경우 이전 단계의 실패 여부에 관계없이 심판 데이터를 업로드합니다:
- 셸 컨텍스트에 변수를 내보냅니다.
- 심판 정보를 업로드하는 명령을 실행합니다.
- 이 명령의 실패는 전체 작업 상태에 영향을 미치지 않습니다.
-
구성된 경우 이전 단계의 실패 여부에 관계없이 정리 작업을 수행합니다:
- 셸 컨텍스트에 변수를 내보냅니다.
- 작업 디렉토리에서 파일 기반 변수를 삭제하는 명령을 실행합니다.
- 이 명령의 실패는 전체 작업에 영향을 미치지 않습니다.
소스 코드 보기
%%{init: { "fontFamily": "GitLab Sans" }}%%
flowchart TD
accTitle: GitLab CI/CD Job Execution Flow
accDescr: Shows the complete 9-step job execution sequence from source preparation through cleanup operations.
Start([Job Starts]) --> Source[1. Source preparation<br/><small>Export variables, runs <code>pre_get_sources_script</code>,</small><br/><small><code>git fetch</code>, submodules, <code>post_get_sources_script</code>.</small>]
Source --> Cache[2. Download cache<br/><small>If configured and previous step succeeds.</small>]
Cache --> Artifacts[3. Download artifacts<br/><small>If configured and previous step succeeds.</small>]
Artifacts --> MainExec[4. Main execution<br/><small>Export variables, <code>pre_build_script</code>,</small><br/><small><code>before_script</code>, <code>script</code>, <code>post_build_script</code>.</small>]
MainExec --> AfterScript[5. <code>after_script</code><br/><small>Always runs if defined.</small><br/><small>Files created here are included.</small>]
AfterScript --> Critical[⚠️ CRITICAL: <code>after_script</code> runs BEFORE upload stages.]
Critical --> UploadCache[6. Upload cache<br/><small>Always runs if configured.</small><br/><small>Failure may affect job status.</small>]
Critical --> UploadArtifacts[7. Upload artifacts<br/><small>Always runs if configured.</small><br/><small>Failure may affect job status.</small>]
UploadCache --> UploadReferees[8. Upload referees<br/><small>Always runs if configured.</small><br/><small>Failure doesn't affect job status.</small>]
UploadArtifacts --> UploadReferees
UploadReferees --> Cleanup[9. Cleanup operations<br/><small>Always runs if configured.</small><br/><small>Delete file-based variables.</small>]
Cleanup --> End([Job Complete])</code></pre></details></div>
셸 컨텍스트 격리#
각 셸 컨텍스트는 설계상 격리됩니다. 컨텍스트 간의 유일한 연결은 공유 작업 디렉토리 파일 시스템입니다.
- 한 컨텍스트에서의 수동 변수 내보내기(예:
export my_variable=$(date))는 다른 컨텍스트에서 사용할 수 없습니다.
- 각 스크립트는 Unix 셸의 경우
set -eo pipefail로 실행되어 첫 번째 오류에서 일찍 실패합니다.
- 각 단계의 결과는 이후 단계가 실행되는지 여부에 영향을 미치고 전체 작업 상태에 영향을 미칩니다.
