잡 트러블슈팅
Offering: GitLab Self-Managed, GitLab Dedicated
잡을 사용할 때 다음과 같은 문제가 발생할 수 있습니다. 머지 리퀘스트 파이프라인 없이 rules: changes 또는 only: changes를 사용할 때 잡이나 파이프라인이 예기치 않게 실행될 수 있습니다. 머지 리퀘스트와 명시적 연결이 없는 브랜치나 태그의 파이프라인은 이전 SHA를 사용하여 diff를 계산합니다.
잡을 사용할 때 다음과 같은 문제가 발생할 수 있습니다.
changes:를 사용할 때 잡이나 파이프라인이 예기치 않게 실행되는 경우#
머지 리퀘스트 파이프라인 없이 rules: changes
또는 only: changes를 사용할 때
잡이나 파이프라인이 예기치 않게 실행될 수 있습니다.
머지 리퀘스트와 명시적 연결이 없는 브랜치나 태그의 파이프라인은
이전 SHA를 사용하여 diff를 계산합니다. 이 계산은 git diff HEAD~와 동일하며
다음과 같은 예기치 않은 동작을 유발할 수 있습니다:
- GitLab에 새 브랜치나 새 태그를 푸시할 때
changes규칙은 항상 true로 평가됩니다. - 새 커밋을 푸시할 때 변경된 파일은 이전 커밋을 기본 SHA로 사용하여 계산됩니다.
또한 changes가 있는 규칙은 예약된 파이프라인에서 항상 true로 평가됩니다.
예약된 파이프라인이 실행될 때 모든 파일이 변경된 것으로 간주되므로
changes를 사용하는 예약된 파이프라인에 잡이 항상 추가될 수 있습니다.
CI/CD 변수에서의 파일 경로#
CI/CD 변수에서 파일 경로를 사용할 때 주의하세요. 후행 슬래시는 변수 정의에서
올바르게 보일 수 있지만, script:, changes: 또는 다른 키워드에서 확장될 때
유효하지 않을 수 있습니다. 예를 들어:
docker_build:
variables:
DOCKERFILES_DIR: 'path/to/files/' # This variable should not have a trailing '/' character
script: echo "A docker job"
rules:
- changes:
- $DOCKERFILES_DIR/*
DOCKERFILES_DIR 변수가 changes: 섹션에서 확장될 때 전체 경로는
path/to/files//*가 됩니다. 이중 슬래시는 사용된 키워드, 러너의 셸과 OS 등
다양한 요인에 따라 예기치 않은 동작을 유발할 수 있습니다.
You are not allowed to download code from this project. 오류 메시지#
GitLab 관리자가 비공개 프로젝트에서 보호된 수동 잡을 실행할 때 파이프라인이 실패하는 것을 볼 수 있습니다.
CI/CD 잡은 보통 잡이 시작될 때 프로젝트를 클론하며, 이는 잡을 실행하는 사용자의 권한을 사용합니다. 관리자를 포함한 모든 사용자는 비공개 프로젝트의 소스를 클론하려면 해당 프로젝트의 직접 멤버여야 합니다. 이 동작을 변경하기 위한 이슈가 있습니다.
보호된 수동 잡을 실행하려면:
- 관리자를 비공개 프로젝트의 직접 멤버로 추가하세요(어떤 역할이든 가능).
- 프로젝트의 직접 멤버인 사용자를 가장하세요.
다시 실행할 때 CI/CD 잡이 최신 설정을 사용하지 않는 경우#
파이프라인 설정은 파이프라인이 생성될 때만 가져옵니다.
잡을 재실행할 때는 매번 동일한 설정을 사용합니다. include로 추가된
별도 파일을 포함하여 설정 파일을 업데이트한 경우 새 설정을 사용하려면
새 파이프라인을 시작해야 합니다.
Job may allow multiple pipelines to run for a single action 경고#
if 절 없이 when 절과 함께 rules를 사용하면
여러 파이프라인이 실행될 수 있습니다. 일반적으로 열린 머지 리퀘스트가 연결된
브랜치에 커밋을 푸시할 때 발생합니다.
중복 파이프라인을 방지하려면
workflow: rules를 사용하거나 어떤 파이프라인이 실행될 수 있는지
제어하도록 규칙을 재작성하세요.
변수 표현식에 대한 This GitLab CI configuration is invalid#
CI/CD 변수 표현식으로 작업할 때
여러 This GitLab CI configuration is invalid 오류 중 하나를 받을 수 있습니다.
이러한 문법 오류는 따옴표 문자를 잘못 사용하여 발생할 수 있습니다.
변수 표현식에서 문자열은 따옴표로 묶어야 하며, 변수는 따옴표로 묶지 않아야 합니다. 예를 들어:
variables:
ENVIRONMENT: production
job:
script: echo
rules:
- if: $ENVIRONMENT == "production"
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
이 예시에서 production 문자열은 따옴표로 묶이고 CI/CD 변수는 따옴표 없이 사용되므로
두 if: 절 모두 유효합니다.
반면 다음 if: 절은 모두 유효하지 않습니다:
variables:
ENVIRONMENT: production
job:
script: echo
rules: # These rules all cause YAML syntax errors:
- if: ${ENVIRONMENT} == "production"
- if: "$ENVIRONMENT" == "production"
- if: $ENVIRONMENT == production
- if: "production" == "production"
이 예시에서:
if: ${ENVIRONMENT} == "production"은${ENVIRONMENT}가if:의 CI/CD 변수에 유효한 형식이 아니므로 유효하지 않습니다.if: "$ENVIRONMENT" == "production"은 변수가 따옴표로 묶여 있으므로 유효하지 않습니다.if: $ENVIRONMENT == production은 문자열이 따옴표로 묶여 있지 않으므로 유효하지 않습니다.if: "production" == "production"은 비교할 CI/CD 변수가 없으므로 유효하지 않습니다.
HTTP/2 문제로 인해 get_sources 잡 섹션이 실패하는 경우#
때때로 잡이 다음 cURL 오류와 함께 실패합니다:
++ git -c 'http.userAgent=gitlab-runner <version>' fetch origin +refs/pipelines/<id>:refs/pipelines/<id> ...
error: RPC failed; curl 16 HTTP/2 send again with decreased length
fatal: ...
Git과 libcurl을 HTTP/1.1 사용으로
구성하여 이 문제를 해결할 수 있습니다. 다음 위치에 설정을 추가할 수 있습니다:
-
job_name: hooks: pre_get_sources_script: - git config --global http.version "HTTP/1.1" -
Git 설정 환경 변수와 함께 러너의
config.toml:[[runners]] ... environment = [ "GIT_CONFIG_COUNT=1", "GIT_CONFIG_KEY_0=http.version", "GIT_CONFIG_VALUE_0=HTTP/1.1" ]
resource_group을 사용하는 잡이 멈추는 경우#
resource_group을 사용하는 잡이 멈추면
GitLab 관리자는 레일스 콘솔에서
다음 명령을 실행해 볼 수 있습니다:
# find resource group by name
resource_group = Project.find_by_full_path('...').resource_groups.find_by(key: 'the-group-name')
busy_resources = resource_group.resources.where('build_id IS NOT NULL')
# identify which builds are occupying the resource
# (I think it should be 1 as of today)
busy_resources.pluck(:build_id)
# it's good to check why this build is holding the resource.
# Is it stuck? Has it been forcefully dropped by the system?
# free up busy resources
busy_resources.update_all(build_id: nil)
You are not authorized to run this manual job 메시지#
수동 잡을 실행하려고 할 때 이 메시지를 받고 실행 버튼이 비활성화될 수 있는 경우:
- 대상 환경이 보호된 환경이고 귀하의 계정이 배포 허용 목록에 포함되지 않은 경우.
- 오래된 배포 잡 방지 설정이 활성화되어 있고 잡을 실행하면 최신 배포를 덮어쓸 경우.
