작업에서 문제 해결

작업을 수행하는 동안 다음과 같은 문제가 발생할 수 있습니다.

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 변수가 없기 때문에 잘못됩니다.