job 아티팩트 문제 해결

job 아티팩트 문제 해결

job 아티팩트를 다루다 보면 아티팩트를 못 가져온다거나, 업로드할 파일이 없다는 메시지를 마주칠 수 있어요. 이 글은 GitLab CI에서 job 아티팩트와 관련해 만나는 흔한 오류들을 모아, 각각 어떤 상황에서 발생하고 어떻게 해결하는지 설명할게요.

출처: 문서

본문

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

job이 일부 아티팩트를 가져오지 못함

기본적으로 job은 이전 스테이지의 모든 아티팩트를 가져오지만, dependencies 또는 needs를 사용하는 job은 기본적으로 모든 job의 아티팩트를 가져오지 않아요.

이 키워드들을 사용하면 아티팩트는 job의 일부에서만 가져옵니다. 이 키워드들로 아티팩트를 가져오는 방법은 키워드 참조를 확인하세요.

job 아티팩트가 디스크 공간을 너무 많이 사용함

job 아티팩트가 디스크 공간을 너무 많이 사용한다면 job 아티팩트 관리 문서를 참고하세요.

오류 메시지: No files to upload

이 메시지는 러너가 업로드할 파일을 찾지 못할 때 job 로그에 나타나요. 파일 경로가 잘못되었거나 파일이 생성되지 않은 경우죠. job 로그에서 파일 이름과 왜 생성되지 않았는지를 알려주는 다른 오류나 경고를 확인할 수 있어요.

더 상세한 job 로그가 필요하면 CI/CD 디버그 로깅을 활성화하고 job을 다시 시도해 보세요. 이 로깅은 파일이 왜 생성되지 않았는지에 대한 더 많은 정보를 줄 수 있습니다.

Windows 러너에서 dotenv 아티팩트 업로드 시 오류 메시지: FATAL: invalid argument

PowerShell의 echo 명령은 파일을 UCS-2 LE BOM(Byte Order Mark) 인코딩으로 작성하는데, 지원되는 것은 UTF-8뿐이에요. echodotenv 아티팩트를 만들려고 하면 FATAL: invalid argument 오류가 발생합니다.

UTF-8을 사용하는 PowerShell Add-Content를 대신 사용하세요.

test-job:
  stage: test
  tags:
    - windows
  script:
    - echo "test job"
    - Add-Content -Path build.env -Value "MY_ENV_VAR=true"
  artifacts:
    reports:
      dotenv: build.env

job 아티팩트가 만료되지 않음

일부 job 아티팩트가 예상대로 만료되지 않는다면 최근 성공한 job의 아티팩트 유지 설정이 활성화되어 있는지 확인하세요.

이 설정이 활성화되면 각 ref의 최신 성공 파이프라인에서 나온 job 아티팩트는 만료되지 않고 삭제되지 않습니다.

오류 메시지: This job could not start because it could not retrieve the needed artifacts.

job이 예상하는 아티팩트를 가져오지 못하면 job이 시작에 실패하고 이 오류 메시지를 반환해요. 이 오류는 다음 경우에 반환됩니다.

  • job의 의존성이 없을 때 — 기본적으로 나중 스테이지의 job은 앞선 모든 스테이지의 job에서 아티팩트를 가져오므로, 앞선 job들은 모두 의존 대상으로 간주돼요. job이 dependencies 키워드를 사용한다면 나열된 job만이 의존 대상입니다.
  • 아티팩트가 이미 만료됐을 때 — artifacts:expire_in으로 더 긴 만료 기간을 설정할 수 있어요.
  • 권한 부족으로 job이 관련 리소스에 접근할 수 없을 때

job이 needs:artifacts: 키워드를 사용한다면 추가 문제 해결 단계를 보세요.

needs:project로 구성된 job의 경우

could not retrieve the needed artifacts 오류는 needs:project를 다음과 유사한 구성으로 사용하는 job에서 발생할 수 있어요.

rspec:
  needs:
    - project: my-group/my-project
      job: dependency-job
      ref: master
      artifacts: true

이 오류를 해결하려면 다음을 확인하세요.

  • my-group/my-project 프로젝트가 Premium 구독 요금제 그룹에 있는지
  • 파이프라인을 트리거하는 사용자가 my-group/my-project에서 최소한 Reporter 역할을 가지고 있는지 — 자세한 내용은 프로젝트 CI/CD 권한을 참고하세요.
  • 프로젝트, job, ref 조합이 존재하고 원하는 의존성을 만들어내는지
  • 사용 중인 변수들이 올바른 값으로 평가되는지

CI_JOB_TOKEN을 사용한다면 다른 프로젝트에서 아티팩트를 가져오도록 토큰을 프로젝트의 허용 목록에 추가하세요. 프로젝트를 허용 목록에 추가한다고 트리거하는 사용자에게 my-group/my-project에 대한 접근 권한이 주어지는 것은 아닙니다. 그 사용자는 이미 필요한 역할을 갖고 있어야 해요.

needs:pipeline:job으로 구성된 job의 경우

could not retrieve the needed artifacts 오류는 needs:pipeline:job을 다음과 유사한 구성으로 사용하는 job에서 발생할 수 있어요.

rspec:
  needs:
    - pipeline: $UPSTREAM_PIPELINE_ID
      job: dependency-job
      artifacts: true

이 오류를 해결하려면 다음을 확인하세요.

  • 현재 파이프라인의 상위-자식 파이프라인 계층에서 $UPSTREAM_PIPELINE_ID CI/CD 변수를 사용할 수 있는지
  • 파이프라인과 job 조합이 존재하고 기존 파이프라인으로 해석되는지
  • dependency-job이 실행되고 성공적으로 끝났는지

업그레이드 후 job이 UnlockPipelinesInQueueWorker를 표시함

job이 멈추고 UnlockPipelinesInQueueWorker를 나타내는 오류를 보여줄 수 있어요.

이 문제는 업그레이드 후에 발생합니다.

해결 방법은 ci_unlock_pipelines_extra_low 기능 플래그를 활성화하는 것이에요. 기능 플래그를 전환하려면 관리자여야 합니다.

GitLab.com에서는:

다음 ChatOps 명령을 실행하세요.

/chatops gitlab run feature set ci_unlock_pipelines_extra_low true

GitLab Self-Managed에서는:

자세한 내용은 머지 리퀘스트 140318의 댓글을 참고하세요.

더 알아보기 (Learn more)

job 아티팩트의 기본 개념과 만료 설정을 다시 확인하려면 job 아티팩트 문서를, CI job 토큰으로 다른 프로젝트의 아티팩트를 가져오는 설정은 CI job 토큰 문서를 참고하세요.