작업 문제 해결

작업을 할 때 다음과 같은 문제에 직면할 수 있습니다.

changes:를 사용할 때 작업 또는 파이프라인이 예기치 않게 실행되는 경우

Merge Request 파이프라인과 관련이 없는 경우, rules: changes 또는 only: changes를 사용할 때 예상치 못하게 작업 또는 파이프라인이 실행될 수 있습니다.

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

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

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

CI/CD 변수의 파일 경로

CI/CD 변수에서 파일 경로를 사용할 때 주의하시기 바랍니다. 변수 정의에서 trailing slash(마지막 슬래시)는 올바르게 보일 수 있지만, script:, changes: 또는 기타 키워드에서 확장될 때 유효하지 않을 수 있습니다. 예를 들면:

docker_build:
  variables:
    DOCKERFILES_DIR: 'path/to/files/'  # 이 변수에는 trailing '/' 문자가 없어야 합니다.
  script: echo "도커 작업"
  rules:
    - changes:
        - $DOCKERFILES_DIR/*

changes: 섹션에서 DOCKERFILES_DIR 변수가 확장될 때 전체 경로가 path/to/files//*로 변환됩니다. 두 개의 슬래시는 사용된 키워드, 러너의 쉘 및 OS와 같은 요소에 따라 예상치 못한 동작을 일으킬 수 있습니다.

This GitLab CI configuration is invalid 오류 메시지

GitLab 관리자가 비공개 프로젝트에서 보호된 매뉴얼 작업을 실행할 때 파이프라인이 실패할 수 있습니다.

CI/CD 작업은 일반적으로 작업이 시작될 때 프로젝트를 복제하고, 이는 작업 권한을 사용합니다. 관리자를 포함한 모든 사용자는 비공개 프로젝트의 직접 멤버여야만 해당 프로젝트의 소스를 복제할 수 있습니다. 이 동작을 변경하기 위한 이슈가 존재합니다.

보호된 매뉴얼 작업을 실행하려면 다음과 같이 하십시오:

  • 관리자를 비공개 프로젝트의 직접 멤버(어떤 역할이든 상관없음)로 추가하십시오.
  • 해당 프로젝트의 직접 멤버인 사용자로 가장하기하십시오.

CI/CD 작업이 다시 실행될 때 최신 구성을 사용하지 않는 경우

파이프라인의 구성은 파이프라인이 생성될 때만 가져옵니다. 작업을 다시 실행할 때마다 동일한 구성을 사용합니다. include로 추가된 별도 파일을 포함하여 구성 파일을 업데이트하는 경우 새로운 구성을 사용하려면 새로운 파이프라인을 시작해야 합니다.

Job may allow multiple pipelines to run for a single action 경고

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} == "production"은 잘못되었습니다. 왜냐하면 ${ENVIRONMENT}if:에서 사용되는 CI/CD 변수의 올바른 형식이 아닙니다.
  • "$ENVIRONMENT" == "production"은 잘못되었습니다. 왜냐하면 변수에 따옴표가 붙어 있습니다.
  • $ENVIRONMENT == production은 잘못되었습니다. 왜냐하면 문자열이 따옴표로 묶이지 않았습니다.
  • "production" == "production"은 잘못되었습니다. 왜냐하면 비교할 CI/CD 변수가 없기 때문입니다.