작업 문제 해결

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

changes: 사용 시 작업 또는 파이프라인이 예상치 않게 실행됨

Merge Request 파이프라인 없이 rules: changes 또는 only: changes를 사용할 때 작업 또는 파이프라인이 예상치 않게 실행될 수 있습니다.

Merge Request과 명시적으로 연결되지 않은 브랜치 또는 태그의 파이프라인은 이전 SHA를 사용하여 차이를 계산합니다. 이 계산은 git diff HEAD~와 동등하며 다음과 같은 예기치 않은 동작을 일으킬 수 있습니다.

  • 새 브랜치 또는 새 태그를 GitLab에 푸시할 때 changes 규칙이 항상 true로 평가됩니다.
  • 새로운 커밋을 푸시할 때 변경된 파일은 이전 커밋을 기본 SHA로 사용하여 계산됩니다.

또한, changes를 사용하는 규칙은 예약된 파이프라인에서 항상 true로 평가됩니다. 예약된 파이프라인이 실행될 때 모든 파일이 변경된 것으로 간주되어 changes를 사용하는 작업이 항상 예약된 파이프라인에 추가될 수 있습니다.

CI/CD 변수에서 파일 경로

CI/CD 변수에 파일 경로를 사용할 때 주의하십시오. 변수 정의에서 기호가 나타나지 않을 수 있지만 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를 사용하면 하나의 커밋을 푸시할 때 여러 파이프라인이 실행될 수 있습니다. 이는 일반적으로 해당 브랜치에 연결된 오픈된 Merge Request과 함께 커밋을 푸시할 때 발생합니다.

중복 파이프라인을 방지하려면 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

이 예제에서 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}if:에서 CI/CD 변수의 유효한 형식이 아니기 때문에 유효하지 않습니다.
  • "$ENVIRONMENT" == "production"은 변수가 인용 부호로 묶여 있기 때문에 유효하지 않습니다.
  • $ENVIRONMENT == production은 문자열이 인용 부호로 묶여 있지 않기 때문에 유효하지 않습니다.
  • "production" == "production"은 비교할 CI/CD 변수가 없기 때문에 유효하지 않습니다.