changes:
사용 시 작업 또는 파이프라인이 예상치 않게 실행됨- CI/CD 변수의 파일 경로
프로젝트에서 코드를 다운로드할 수 있는 권한이 없습니다.
오류 메시지- CI/CD 작업이 새 구성을 사용하지 않는 문제
작업이 단일 작업에 대해 여러 파이프라인 실행을 허용할 수 있음
경고- 변수 표현식에 대한
이 GitLab CI 구성은 잘못되었습니다
경고
작업에서 문제 해결
작업을 수행하는 동안 다음과 같은 문제가 발생할 수 있습니다.
changes:
사용 시 작업 또는 파이프라인이 예상치 않게 실행됨
rules: changes
또는 only: changes
을 사용할 때 예상치 않게 작업 또는 파이프라인이 실행될 수 있습니다.
이러한 경우 병합 요청 파이프라인이 없습니다.
병합 요청과 명시적으로 연결되지 않은 브랜치나 태그의 파이프라인에 대해서는 이전 SHA를 사용하여 차이를 계산합니다. 이 계산은 git diff HEAD~
과 동등하며 다음과 같은 예상치 못한 동작으로 이어질 수 있습니다.
- 새 브랜치나 새 태그를 GitLab에 푸시할 때 항상
changes
규칙이 true로 평가됨. - 새 커밋을 푸시할 때 변경된 파일은 이전 커밋을 기준으로 계산됨.
또한 changes
를 사용하는 규칙은 예약된 파이프라인에서 항상 true로 평가됩니다. 따라서 예약된 파이프라인에서는 모든 파일이 변경되었다고 간주되므로 changes
를 사용하는 작업이 항상 추가될 수 있습니다.
CI/CD 변수의 파일 경로
CI/CD 변수에서 파일 경로를 사용할 때 주의하시기 바랍니다. 변수 정의에서 trailing 슬래시는 올바르게 보일 수 있지만 script:
, changes:
또는 다른 키워드에서 확장될 때 잘못될 수 있습니다.
예:
docker_build:
variables:
DOCKERFILES_DIR: 'path/to/files/' # 이 변수에는 끝에 '/' 문자가 없어야 합니다.
script: echo "도커 작업"
rules:
- changes:
- $DOCKERFILES_DIR/*
DOCKERFILES_DIR
변수가 changes:
섹션에서 확장될 때 전체 경로는 path/to/files//*
가 됩니다. 두 개의 슬래시는 사용된 키워드나 러너의 셸 및 OS에 따라 예상치 못한 동작을 일으킬 수 있습니다.
프로젝트에서 코드를 다운로드할 수 있는 권한이 없습니다.
오류 메시지
GitLab 관리자가 프라이빗 프로젝트에서 보호된 수동 작업을 실행할 때 파이프라인이 실패할 수 있습니다.
일반적으로 CI/CD 작업은 작업을 시작할 때 프로젝트를 복제하며, 이는 작업을 실행하는 사용자의 권한을 사용합니다. 관리자를 포함한 모든 사용자는 해당 프로젝트의 직접 멤버여야만 해당 프로젝트의 소스를 복제할 수 있습니다. 이 동작을 변경하기 위한 이슈가 존재합니다.
보호된 수동 작업을 실행하려면 다음을 수행하세요:
- 관리자를 프라이빗 프로젝트의 직접 멤버(어떤 역할이든 상관 없음)로 추가하십시오.
- 프로젝트의 직접 멤버인 사용자로 가장하기하십시오.
CI/CD 작업이 새 구성을 사용하지 않는 문제
파이프라인의 구성은 파이프라인이 생성될 때에만 가져옵니다. 작업을 다시 실행할 때마다 동일한 구성을 사용합니다. 따라서 include
로 추가된 별도의 파일을 포함하여 구성 파일을 업데이트하려면 새로운 파이프라인을 시작해야 합니다.
작업이 단일 작업에 대해 여러 파이프라인 실행을 허용할 수 있음
경고
when
절과 if
절 없이 rules
을 사용할 경우 여러 파이프라인이 실행될 수 있습니다. 일반적으로 이는 해당 브랜치에 연관된 열린 병합 요청에 커밋을 푸시할 때 발생합니다.
중복된 파이프라인을 방지하려면 workflow: rules
을 사용하거나 실행할 수 있는 파이프라인을 제어하기 위해 규칙을 다시 작성하십시오.
변수 표현식에 대한 이 GitLab CI 구성은 잘못되었습니다
경고
CI/CD 변수 표현식을 사용할 때 다양한 이 GitLab CI 구성은 잘못되었습니다
오류를 받을 수 있습니다. 이 구문 오류는 따옴표 문자를 잘못 사용했을 수 있습니다.
변수 표현식에서는 문자열을 따옴표로 감싸야 하고, 변수는 따옴표로 묶으면 안 됩니다. 예를 들어:
variables:
ENVIRONMENT: production
job:
script: echo
rules:
- if: $ENVIRONMENT == "production"
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
이 예시에서 if:
절은 모두 유효합니다. “production” 문자열이 따옴표로 묶이고, CI/CD 변수는 따옴표로 묶이지 않았기 때문입니다.
반면에 이러한 if:
절은 모두 잘못됩니다:
variables:
ENVIRONMENT: production
job:
script: echo
rules: # 이러한 규칙은 모두 YAML 구문 오류를 유발합니다:
- if: ${ENVIRONMENT} == "production"
- if: "$ENVIRONMENT" == "production"
- if: $ENVIRONMENT == production
- if: "production" == "production"
이 예시에서:
-
${ENVIRONMENT} == "production"
은 CI/CD 변수의 유효한 형식이 아니기 때문에 잘못됩니다. -
"$ENVIRONMENT" == "production"
은 변수가 따옴표로 묶였기 때문에 잘못됩니다. -
$ENVIRONMENT == production
은 문자열이 따옴표로 묶이지 않았기 때문에 잘못됩니다. -
"production" == "production"
은 비교할 CI/CD 변수가 없기 때문에 잘못됩니다.