InfoGrab DocsInfoGrab Docs

CI/CD 변수 문제 해결

요약

Bash에서는 export 명령으로, PowerShell에서는 dir env: 명령으로 스크립트에서 사용 가능한 모든 변수를 나열할 수 있습니다. 예를 들어 Bash를 사용하는 경우입니다: 디버그 로깅은 심각한 보안 위험이 될 수 있습니다.

List all variables#

Bash에서는 export 명령으로, PowerShell에서는 dir env: 명령으로 스크립트에서 사용 가능한 모든 변수를 나열할 수 있습니다. 이렇게 하면 사용 가능한 모든 변수의 값이 노출되며, 이는 보안 위험이 될 수 있습니다. 마스킹된 변수는 [MASKED]로 표시됩니다.

예를 들어 Bash를 사용하는 경우입니다:

job_name:
  script:
    - export

잡 로그 출력 예시(일부 생략):

export CI_JOB_ID="50"
export CI_COMMIT_SHA="1ecfd275763eff1d6b4844ea3168962458c9f27a"
export CI_COMMIT_SHORT_SHA="1ecfd275"
export CI_COMMIT_REF_NAME="main"
export CI_REPOSITORY_URL="https://gitlab-ci-token:[MASKED]@example.com/gitlab-org/gitlab.git"
export CI_COMMIT_TAG="1.0.0"
export CI_JOB_NAME="spec:other"
export CI_JOB_STAGE="test"
export CI_JOB_MANUAL="true"
export CI_JOB_TRIGGERED="true"
export CI_JOB_TOKEN="[MASKED]"
export CI_PIPELINE_ID="1000"
export CI_PIPELINE_IID="10"
export CI_PAGES_DOMAIN="gitlab.io"
export CI_PAGES_URL="https://gitlab-org.gitlab.io/gitlab"
export CI_PROJECT_ID="34"
export CI_PROJECT_DIR="/builds/gitlab-org/gitlab"
export CI_PROJECT_NAME="gitlab"
export CI_PROJECT_TITLE="GitLab"
...

Enable debug logging#

Warning

디버그 로깅은 심각한 보안 위험이 될 수 있습니다. 출력에는 잡에서 사용 가능한 모든 변수의 내용이 포함됩니다. 출력은 GitLab 서버에 업로드되어 잡 로그에서 볼 수 있습니다.

디버그 로깅을 사용하면 파이프라인 구성이나 잡 스크립트 문제를 해결하는 데 도움이 됩니다. 디버그 로깅은 평소 러너가 숨기는 잡 실행 세부 정보를 노출하며 잡 로그를 더 자세하게 만듭니다. 또한 잡에서 사용 가능한 모든 변수와 시크릿을 노출합니다.

디버그 로깅을 활성화하기 전에 팀원만 잡 로그를 볼 수 있도록 해야 합니다. 로그를 다시 공개하기 전에 디버그 출력이 포함된 잡 로그를 삭제해야 합니다.

디버그 로깅을 활성화하려면 CI_DEBUG_TRACE 변수를 true로 설정합니다:

job_name:
  variables:
    CI_DEBUG_TRACE: "true"

출력 예시(일부 생략):

...
export CI_SERVER_TLS_CA_FILE="/builds/gitlab-examples/ci-debug-trace.tmp/CI_SERVER_TLS_CA_FILE"
if [[ -d "/builds/gitlab-examples/ci-debug-trace/.git" ]]; then
  echo $'\''\x1b[32;1mFetching changes...\x1b[0;m'\''
  $'\''cd'\'' "/builds/gitlab-examples/ci-debug-trace"
  $'\''git'\'' "config" "fetch.recurseSubmodules" "false"
  $'\''rm'\'' "-f" ".git/index.lock"
  $'\''git'\'' "clean" "-ffdx"
  $'\''git'\'' "reset" "--hard"
  $'\''git'\'' "remote" "set-url" "origin" "https://gitlab-ci-token:xxxxxxxxxxxxxxxxxxxx@example.com/gitlab-examples/ci-debug-trace.git"
  $'\''git'\'' "fetch" "origin" "--prune" "+refs/heads/*:refs/remotes/origin/*" "+refs/tags/*:refs/tags/lds"
++ CI_BUILDS_DIR=/builds
++ export CI_PROJECT_DIR=/builds/gitlab-examples/ci-debug-trace
++ CI_PROJECT_DIR=/builds/gitlab-examples/ci-debug-trace
++ export CI_CONCURRENT_ID=87
++ CI_CONCURRENT_ID=87
++ export CI_CONCURRENT_PROJECT_ID=0
++ CI_CONCURRENT_PROJECT_ID=0
++ export CI_SERVER=yes
++ CI_SERVER=yes
++ mkdir -p /builds/gitlab-examples/ci-debug-trace.tmp
++ echo -n '-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----'
++ export CI_SERVER_TLS_CA_FILE=/builds/gitlab-examples/ci-debug-trace.tmp/CI_SERVER_TLS_CA_FILE
++ CI_SERVER_TLS_CA_FILE=/builds/gitlab-examples/ci-debug-trace.tmp/CI_SERVER_TLS_CA_FILE
++ export CI_PIPELINE_ID=52666
++ CI_PIPELINE_ID=52666
++ export CI_PIPELINE_URL=https://gitlab.com/gitlab-examples/ci-debug-trace/pipelines/52666
++ CI_PIPELINE_URL=https://gitlab.com/gitlab-examples/ci-debug-trace/pipelines/52666
++ export CI_JOB_ID=7046507
++ CI_JOB_ID=7046507
++ export CI_JOB_URL=https://gitlab.com/gitlab-examples/ci-debug-trace/-/jobs/379424655
++ CI_JOB_URL=https://gitlab.com/gitlab-examples/ci-debug-trace/-/jobs/379424655
++ export CI_JOB_TOKEN=[MASKED]
++ CI_JOB_TOKEN=[MASKED]
++ export CI_REGISTRY_USER=gitlab-ci-token
++ CI_REGISTRY_USER=gitlab-ci-token
++ export CI_REGISTRY_PASSWORD=[MASKED]
++ CI_REGISTRY_PASSWORD=[MASKED]
++ export CI_REPOSITORY_URL=https://gitlab-ci-token:[MASKED]@gitlab.com/gitlab-examples/ci-debug-trace.git
++ CI_REPOSITORY_URL=https://gitlab-ci-token:[MASKED]@gitlab.com/gitlab-examples/ci-debug-trace.git
++ export CI_JOB_NAME=debug_trace
++ CI_JOB_NAME=debug_trace
++ export CI_JOB_STAGE=test
++ CI_JOB_STAGE=test
++ export CI_NODE_TOTAL=1
++ CI_NODE_TOTAL=1
++ export CI=true
++ CI=true
++ export GITLAB_CI=true
++ GITLAB_CI=true
++ export CI_SERVER_URL=https://gitlab.com:3000
++ CI_SERVER_URL=https://gitlab.com:3000
++ export CI_SERVER_HOST=gitlab.com
++ CI_SERVER_HOST=gitlab.com
++ export CI_SERVER_PORT=3000
++ CI_SERVER_PORT=3000
++ export CI_SERVER_SHELL_SSH_HOST=gitlab.com
++ CI_SERVER_SHELL_SSH_HOST=gitlab.com
++ export CI_SERVER_SHELL_SSH_PORT=22
++ CI_SERVER_SHELL_SSH_PORT=22
++ export CI_SERVER_PROTOCOL=https
++ CI_SERVER_PROTOCOL=https
++ export CI_SERVER_NAME=GitLab
++ CI_SERVER_NAME=GitLab
++ export GITLAB_FEATURES=audit_events,burndown_charts,code_owners,contribution_analytics,description_diffs,elastic_search,group_bulk_edit,group_burndown_charts,group_webhooks,issuable_default_templates,issue_weights,jenkins_integration,ldap_group_sync,member_lock,merge_request_approvers,multiple_issue_assignees,multiple_ldap_servers,multiple_merge_request_assignees,protected_refs_for_users,push_rules,related_issues,repository_mirrors,repository_size_limit,scoped_issue_board,usage_quotas,wip_limits,admin_audit_log,auditor_user,batch_comments,blocking_merge_requests,board_assignee_lists,board_milestone_lists,ci_cd_projects,cluster_deployments,code_analytics,code_owner_approval_required,commit_committer_check,cross_project_pipelines,custom_file_templates,custom_file_templates_for_namespace,custom_project_templates,custom_prometheus_metrics,cycle_analytics_for_groups,db_load_balancing,default_project_deletion_protection,dependency_proxy,deploy_board,design_management,email_additional_text,extended_audit_events,external_authorization_service_api_management,feature_flags,file_locks,geo,github_integration,group_allowed_email_domains,group_project_templates,group_saml,issues_analytics,jira_dev_panel_integration,ldap_group_sync_filter,merge_pipelines,merge_request_performance_metrics,merge_trains,metrics_reports,multiple_approval_rules,multiple_group_issue_boards,object_storage,operations_dashboard,packages,productivity_analytics,project_aliases,protected_environments,reject_unsigned_commits,required_ci_templates,scoped_labels,service_desk,smartcard_auth,group_timelogs,type_of_work_analytics,unprotection_restrictions,ci_project_subscriptions,container_scanning,dast,dependency_scanning,epics,group_ip_restriction,incident_management,insights,license_management,personal_access_token_expiration_policy,pod_logs,prometheus_alerts,report_approver_rules,sast,security_dashboard,tracing,web_ide_terminal
++ GITLAB_FEATURES=audit_events,burndown_charts,code_owners,contribution_analytics,description_diffs,elastic_search,group_bulk_edit,group_burndown_charts,group_webhooks,issuable_default_templates,issue_weights,jenkins_integration,ldap_group_sync,member_lock,merge_request_approvers,multiple_issue_assignees,multiple_ldap_servers,multiple_merge_request_assignees,protected_refs_for_users,push_rules,related_issues,repository_mirrors,repository_size_limit,scoped_issue_board,usage_quotas,wip_limits,admin_audit_log,auditor_user,batch_comments,blocking_merge_requests,board_assignee_lists,board_milestone_lists,ci_cd_projects,cluster_deployments,code_analytics,code_owner_approval_required,commit_committer_check,cross_project_pipelines,custom_file_templates,custom_file_templates_for_namespace,custom_project_templates,custom_prometheus_metrics,cycle_analytics_for_groups,db_load_balancing,default_project_deletion_protection,dependency_proxy,deploy_board,design_management,email_additional_text,extended_audit_events,external_authorization_service_api_management,feature_flags,file_locks,geo,github_integration,group_allowed_email_domains,group_project_templates,group_saml,issues_analytics,jira_dev_panel_integration,ldap_group_sync_filter,merge_pipelines,merge_request_performance_metrics,merge_trains,metrics_reports,multiple_approval_rules,multiple_group_issue_boards,object_storage,operations_dashboard,packages,productivity_analytics,project_aliases,protected_environments,reject_unsigned_commits,required_ci_templates,scoped_labels,service_desk,smartcard_auth,group_timelogs,type_of_work_analytics,unprotection_restrictions,ci_project_subscriptions,cluster_health,container_scanning,dast,dependency_scanning,epics,group_ip_restriction,incident_management,insights,license_management,personal_access_token_expiration_policy,pod_logs,prometheus_alerts,report_approver_rules,sast,security_dashboard,tracing,web_ide_terminal
++ export CI_PROJECT_ID=17893
++ CI_PROJECT_ID=17893
++ export CI_PROJECT_NAME=ci-debug-trace
++ CI_PROJECT_NAME=ci-debug-trace
...

Access to debug logging#

디버그 로깅에 대한 접근 권한은 Developer, Maintainer, Owner 권한을 가진 사용자로 제한됩니다. 더 낮은 권한을 가진 사용자는 다음 위치에서 변수로 디버그 로깅이 활성화된 경우 로그를 볼 수 없습니다:

Warning

CI_DEBUG_TRACE를 러너에 로컬 변수로 추가하면 디버그 로그가 생성되며 잡 로그에 접근할 수 있는 모든 사용자에게 표시됩니다. 러너는 권한 수준을 확인하지 않으므로 이 변수는 GitLab 자체에서만 사용해야 합니다.

argument list too long 오류#

이 문제는 잡에 정의된 모든 CI/CD 변수의 총 길이가 잡이 실행되는 셸에서 부과하는 한도를 초과할 때 발생합니다. 여기에는 사전 정의된 변수와 사용자 정의 변수의 이름과 값이 모두 포함됩니다. 이 한도는 일반적으로 ARG_MAX로 불리며 셸과 운영체제에 따라 다릅니다. 이 문제는 단일 File 타입 변수의 내용이 ARG_MAX를 초과할 때도 발생합니다.

자세한 내용은 이슈 392406에서 확인할 수 있습니다.

우회 방법으로 다음 중 하나를 사용할 수 있습니다:

  • 가능하면 큰 환경 변수에 File 타입 CI/CD 변수를 사용합니다.
  • 단일 큰 변수가 ARG_MAX보다 큰 경우 Secure Files 사용을 시도하거나, 다른 방법으로 파일을 잡에 전달합니다.

다운스트림 파이프라인에서 Insufficient permissions to set pipeline variables 오류#

다운스트림 파이프라인을 트리거할 때 예기치 않게 다음 오류가 발생할 수 있습니다:

Failed - (downstream pipeline can not be created, Insufficient permissions to set pipeline variables)

이 오류는 다운스트림 프로젝트에 제한된 파이프라인 변수가 설정되어 있고 트리거 잡이 다음 중 하나에 해당할 때 발생합니다:

  • 변수가 정의되어 있는 경우입니다. 예를 들면 다음과 같습니다:

    trigger-job:
      variables:
        VAR_FOR_DOWNSTREAM: "test"
      trigger: my-group/my-project
    
  • 최상위 variables 섹션에 정의된 기본 변수로부터 변수를 전달받는 경우입니다. 예를 들면 다음과 같습니다:

    variables:
      DEFAULT_VAR: "test"
    
    trigger-job:
      trigger: my-group/my-project
    

트리거 잡에서 다운스트림 파이프라인으로 전달되는 변수는 파이프라인 변수이므로, 다음 중 하나로 우회할 수 있습니다:

동일한 이름의 잡 변수에서 기본 변수가 확장되지 않음#

동일한 이름의 잡 변수에서 기본 변수의 값을 사용할 수 없습니다. 기본 변수는 잡에 동일한 이름의 변수가 정의되어 있지 않은 경우에만 잡에서 사용할 수 있습니다. 잡에 동일한 이름의 변수가 있으면 잡의 변수가 우선하며 기본 변수는 잡에서 사용할 수 없습니다.

예를 들어 다음 두 예시는 동일합니다:

  • 이 예시에서는 $MY_VAR가 어디에도 정의되어 있지 않으므로 값이 없습니다:

    Job-with-variable:
      variables:
        MY_VAR: $MY_VAR
      script: echo "Value is '$MY_VAR'"
    
  • 이 예시에서는 동일한 이름의 기본 변수가 잡에서 사용할 수 없으므로 $MY_VAR에 값이 없습니다:

    variables:
      MY_VAR: "Default value"
    
    Job-with-same-name-variable:
      variables:
        MY_VAR: $MY_VAR
      script: echo "Value is '$MY_VAR'"
    

두 경우 모두 echo 명령은 Value is '$MY_VAR'를 출력합니다.

일반적으로 기본 변수의 값을 새 변수에 재할당하기보다는 잡에서 기본 변수를 직접 사용해야 합니다. 재할당이 필요한 경우에는 서로 다른 이름의 변수를 대신 사용합니다. 예를 들면 다음과 같습니다:

variables:
  MY_VAR1: "Default value1"
  MY_VAR2: "Default value2"

overwrite-same-name:
  variables:
    MY_VAR2_FROM_DEFAULTS: $MY_VAR2
  script: echo "Values are '$MY_VAR1' and '$MY_VAR2_FROM_DEFAULTS'"

CI/CD 변수 문제 해결

GitLab v19.5
원문 보기

요약

Bash에서는 export 명령으로, PowerShell에서는 dir env: 명령으로 스크립트에서 사용 가능한 모든 변수를 나열할 수 있습니다. 예를 들어 Bash를 사용하는 경우입니다: 디버그 로깅은 심각한 보안 위험이 될 수 있습니다.

List all variables#

Bash에서는 export 명령으로, PowerShell에서는 dir env: 명령으로 스크립트에서 사용 가능한 모든 변수를 나열할 수 있습니다. 이렇게 하면 사용 가능한 모든 변수의 값이 노출되며, 이는 보안 위험이 될 수 있습니다. 마스킹된 변수는 [MASKED]로 표시됩니다.

예를 들어 Bash를 사용하는 경우입니다:

job_name:
  script:
    - export

잡 로그 출력 예시(일부 생략):

export CI_JOB_ID="50"
export CI_COMMIT_SHA="1ecfd275763eff1d6b4844ea3168962458c9f27a"
export CI_COMMIT_SHORT_SHA="1ecfd275"
export CI_COMMIT_REF_NAME="main"
export CI_REPOSITORY_URL="https://gitlab-ci-token:[MASKED]@example.com/gitlab-org/gitlab.git"
export CI_COMMIT_TAG="1.0.0"
export CI_JOB_NAME="spec:other"
export CI_JOB_STAGE="test"
export CI_JOB_MANUAL="true"
export CI_JOB_TRIGGERED="true"
export CI_JOB_TOKEN="[MASKED]"
export CI_PIPELINE_ID="1000"
export CI_PIPELINE_IID="10"
export CI_PAGES_DOMAIN="gitlab.io"
export CI_PAGES_URL="https://gitlab-org.gitlab.io/gitlab"
export CI_PROJECT_ID="34"
export CI_PROJECT_DIR="/builds/gitlab-org/gitlab"
export CI_PROJECT_NAME="gitlab"
export CI_PROJECT_TITLE="GitLab"
...

Enable debug logging#

Warning

디버그 로깅은 심각한 보안 위험이 될 수 있습니다. 출력에는 잡에서 사용 가능한 모든 변수의 내용이 포함됩니다. 출력은 GitLab 서버에 업로드되어 잡 로그에서 볼 수 있습니다.

디버그 로깅을 사용하면 파이프라인 구성이나 잡 스크립트 문제를 해결하는 데 도움이 됩니다. 디버그 로깅은 평소 러너가 숨기는 잡 실행 세부 정보를 노출하며 잡 로그를 더 자세하게 만듭니다. 또한 잡에서 사용 가능한 모든 변수와 시크릿을 노출합니다.

디버그 로깅을 활성화하기 전에 팀원만 잡 로그를 볼 수 있도록 해야 합니다. 로그를 다시 공개하기 전에 디버그 출력이 포함된 잡 로그를 삭제해야 합니다.

디버그 로깅을 활성화하려면 CI_DEBUG_TRACE 변수를 true로 설정합니다:

job_name:
  variables:
    CI_DEBUG_TRACE: "true"

출력 예시(일부 생략):

...
export CI_SERVER_TLS_CA_FILE="/builds/gitlab-examples/ci-debug-trace.tmp/CI_SERVER_TLS_CA_FILE"
if [[ -d "/builds/gitlab-examples/ci-debug-trace/.git" ]]; then
  echo $'\''\x1b[32;1mFetching changes...\x1b[0;m'\''
  $'\''cd'\'' "/builds/gitlab-examples/ci-debug-trace"
  $'\''git'\'' "config" "fetch.recurseSubmodules" "false"
  $'\''rm'\'' "-f" ".git/index.lock"
  $'\''git'\'' "clean" "-ffdx"
  $'\''git'\'' "reset" "--hard"
  $'\''git'\'' "remote" "set-url" "origin" "https://gitlab-ci-token:xxxxxxxxxxxxxxxxxxxx@example.com/gitlab-examples/ci-debug-trace.git"
  $'\''git'\'' "fetch" "origin" "--prune" "+refs/heads/*:refs/remotes/origin/*" "+refs/tags/*:refs/tags/lds"
++ CI_BUILDS_DIR=/builds
++ export CI_PROJECT_DIR=/builds/gitlab-examples/ci-debug-trace
++ CI_PROJECT_DIR=/builds/gitlab-examples/ci-debug-trace
++ export CI_CONCURRENT_ID=87
++ CI_CONCURRENT_ID=87
++ export CI_CONCURRENT_PROJECT_ID=0
++ CI_CONCURRENT_PROJECT_ID=0
++ export CI_SERVER=yes
++ CI_SERVER=yes
++ mkdir -p /builds/gitlab-examples/ci-debug-trace.tmp
++ echo -n '-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----'
++ export CI_SERVER_TLS_CA_FILE=/builds/gitlab-examples/ci-debug-trace.tmp/CI_SERVER_TLS_CA_FILE
++ CI_SERVER_TLS_CA_FILE=/builds/gitlab-examples/ci-debug-trace.tmp/CI_SERVER_TLS_CA_FILE
++ export CI_PIPELINE_ID=52666
++ CI_PIPELINE_ID=52666
++ export CI_PIPELINE_URL=https://gitlab.com/gitlab-examples/ci-debug-trace/pipelines/52666
++ CI_PIPELINE_URL=https://gitlab.com/gitlab-examples/ci-debug-trace/pipelines/52666
++ export CI_JOB_ID=7046507
++ CI_JOB_ID=7046507
++ export CI_JOB_URL=https://gitlab.com/gitlab-examples/ci-debug-trace/-/jobs/379424655
++ CI_JOB_URL=https://gitlab.com/gitlab-examples/ci-debug-trace/-/jobs/379424655
++ export CI_JOB_TOKEN=[MASKED]
++ CI_JOB_TOKEN=[MASKED]
++ export CI_REGISTRY_USER=gitlab-ci-token
++ CI_REGISTRY_USER=gitlab-ci-token
++ export CI_REGISTRY_PASSWORD=[MASKED]
++ CI_REGISTRY_PASSWORD=[MASKED]
++ export CI_REPOSITORY_URL=https://gitlab-ci-token:[MASKED]@gitlab.com/gitlab-examples/ci-debug-trace.git
++ CI_REPOSITORY_URL=https://gitlab-ci-token:[MASKED]@gitlab.com/gitlab-examples/ci-debug-trace.git
++ export CI_JOB_NAME=debug_trace
++ CI_JOB_NAME=debug_trace
++ export CI_JOB_STAGE=test
++ CI_JOB_STAGE=test
++ export CI_NODE_TOTAL=1
++ CI_NODE_TOTAL=1
++ export CI=true
++ CI=true
++ export GITLAB_CI=true
++ GITLAB_CI=true
++ export CI_SERVER_URL=https://gitlab.com:3000
++ CI_SERVER_URL=https://gitlab.com:3000
++ export CI_SERVER_HOST=gitlab.com
++ CI_SERVER_HOST=gitlab.com
++ export CI_SERVER_PORT=3000
++ CI_SERVER_PORT=3000
++ export CI_SERVER_SHELL_SSH_HOST=gitlab.com
++ CI_SERVER_SHELL_SSH_HOST=gitlab.com
++ export CI_SERVER_SHELL_SSH_PORT=22
++ CI_SERVER_SHELL_SSH_PORT=22
++ export CI_SERVER_PROTOCOL=https
++ CI_SERVER_PROTOCOL=https
++ export CI_SERVER_NAME=GitLab
++ CI_SERVER_NAME=GitLab
++ export GITLAB_FEATURES=audit_events,burndown_charts,code_owners,contribution_analytics,description_diffs,elastic_search,group_bulk_edit,group_burndown_charts,group_webhooks,issuable_default_templates,issue_weights,jenkins_integration,ldap_group_sync,member_lock,merge_request_approvers,multiple_issue_assignees,multiple_ldap_servers,multiple_merge_request_assignees,protected_refs_for_users,push_rules,related_issues,repository_mirrors,repository_size_limit,scoped_issue_board,usage_quotas,wip_limits,admin_audit_log,auditor_user,batch_comments,blocking_merge_requests,board_assignee_lists,board_milestone_lists,ci_cd_projects,cluster_deployments,code_analytics,code_owner_approval_required,commit_committer_check,cross_project_pipelines,custom_file_templates,custom_file_templates_for_namespace,custom_project_templates,custom_prometheus_metrics,cycle_analytics_for_groups,db_load_balancing,default_project_deletion_protection,dependency_proxy,deploy_board,design_management,email_additional_text,extended_audit_events,external_authorization_service_api_management,feature_flags,file_locks,geo,github_integration,group_allowed_email_domains,group_project_templates,group_saml,issues_analytics,jira_dev_panel_integration,ldap_group_sync_filter,merge_pipelines,merge_request_performance_metrics,merge_trains,metrics_reports,multiple_approval_rules,multiple_group_issue_boards,object_storage,operations_dashboard,packages,productivity_analytics,project_aliases,protected_environments,reject_unsigned_commits,required_ci_templates,scoped_labels,service_desk,smartcard_auth,group_timelogs,type_of_work_analytics,unprotection_restrictions,ci_project_subscriptions,container_scanning,dast,dependency_scanning,epics,group_ip_restriction,incident_management,insights,license_management,personal_access_token_expiration_policy,pod_logs,prometheus_alerts,report_approver_rules,sast,security_dashboard,tracing,web_ide_terminal
++ GITLAB_FEATURES=audit_events,burndown_charts,code_owners,contribution_analytics,description_diffs,elastic_search,group_bulk_edit,group_burndown_charts,group_webhooks,issuable_default_templates,issue_weights,jenkins_integration,ldap_group_sync,member_lock,merge_request_approvers,multiple_issue_assignees,multiple_ldap_servers,multiple_merge_request_assignees,protected_refs_for_users,push_rules,related_issues,repository_mirrors,repository_size_limit,scoped_issue_board,usage_quotas,wip_limits,admin_audit_log,auditor_user,batch_comments,blocking_merge_requests,board_assignee_lists,board_milestone_lists,ci_cd_projects,cluster_deployments,code_analytics,code_owner_approval_required,commit_committer_check,cross_project_pipelines,custom_file_templates,custom_file_templates_for_namespace,custom_project_templates,custom_prometheus_metrics,cycle_analytics_for_groups,db_load_balancing,default_project_deletion_protection,dependency_proxy,deploy_board,design_management,email_additional_text,extended_audit_events,external_authorization_service_api_management,feature_flags,file_locks,geo,github_integration,group_allowed_email_domains,group_project_templates,group_saml,issues_analytics,jira_dev_panel_integration,ldap_group_sync_filter,merge_pipelines,merge_request_performance_metrics,merge_trains,metrics_reports,multiple_approval_rules,multiple_group_issue_boards,object_storage,operations_dashboard,packages,productivity_analytics,project_aliases,protected_environments,reject_unsigned_commits,required_ci_templates,scoped_labels,service_desk,smartcard_auth,group_timelogs,type_of_work_analytics,unprotection_restrictions,ci_project_subscriptions,cluster_health,container_scanning,dast,dependency_scanning,epics,group_ip_restriction,incident_management,insights,license_management,personal_access_token_expiration_policy,pod_logs,prometheus_alerts,report_approver_rules,sast,security_dashboard,tracing,web_ide_terminal
++ export CI_PROJECT_ID=17893
++ CI_PROJECT_ID=17893
++ export CI_PROJECT_NAME=ci-debug-trace
++ CI_PROJECT_NAME=ci-debug-trace
...

Access to debug logging#

디버그 로깅에 대한 접근 권한은 Developer, Maintainer, Owner 권한을 가진 사용자로 제한됩니다. 더 낮은 권한을 가진 사용자는 다음 위치에서 변수로 디버그 로깅이 활성화된 경우 로그를 볼 수 없습니다:

Warning

CI_DEBUG_TRACE를 러너에 로컬 변수로 추가하면 디버그 로그가 생성되며 잡 로그에 접근할 수 있는 모든 사용자에게 표시됩니다. 러너는 권한 수준을 확인하지 않으므로 이 변수는 GitLab 자체에서만 사용해야 합니다.

argument list too long 오류#

이 문제는 잡에 정의된 모든 CI/CD 변수의 총 길이가 잡이 실행되는 셸에서 부과하는 한도를 초과할 때 발생합니다. 여기에는 사전 정의된 변수와 사용자 정의 변수의 이름과 값이 모두 포함됩니다. 이 한도는 일반적으로 ARG_MAX로 불리며 셸과 운영체제에 따라 다릅니다. 이 문제는 단일 File 타입 변수의 내용이 ARG_MAX를 초과할 때도 발생합니다.

자세한 내용은 이슈 392406에서 확인할 수 있습니다.

우회 방법으로 다음 중 하나를 사용할 수 있습니다:

  • 가능하면 큰 환경 변수에 File 타입 CI/CD 변수를 사용합니다.
  • 단일 큰 변수가 ARG_MAX보다 큰 경우 Secure Files 사용을 시도하거나, 다른 방법으로 파일을 잡에 전달합니다.

다운스트림 파이프라인에서 Insufficient permissions to set pipeline variables 오류#

다운스트림 파이프라인을 트리거할 때 예기치 않게 다음 오류가 발생할 수 있습니다:

Failed - (downstream pipeline can not be created, Insufficient permissions to set pipeline variables)

이 오류는 다운스트림 프로젝트에 제한된 파이프라인 변수가 설정되어 있고 트리거 잡이 다음 중 하나에 해당할 때 발생합니다:

  • 변수가 정의되어 있는 경우입니다. 예를 들면 다음과 같습니다:

    trigger-job:
      variables:
        VAR_FOR_DOWNSTREAM: "test"
      trigger: my-group/my-project
    
  • 최상위 variables 섹션에 정의된 기본 변수로부터 변수를 전달받는 경우입니다. 예를 들면 다음과 같습니다:

    variables:
      DEFAULT_VAR: "test"
    
    trigger-job:
      trigger: my-group/my-project
    

트리거 잡에서 다운스트림 파이프라인으로 전달되는 변수는 파이프라인 변수이므로, 다음 중 하나로 우회할 수 있습니다:

동일한 이름의 잡 변수에서 기본 변수가 확장되지 않음#

동일한 이름의 잡 변수에서 기본 변수의 값을 사용할 수 없습니다. 기본 변수는 잡에 동일한 이름의 변수가 정의되어 있지 않은 경우에만 잡에서 사용할 수 있습니다. 잡에 동일한 이름의 변수가 있으면 잡의 변수가 우선하며 기본 변수는 잡에서 사용할 수 없습니다.

예를 들어 다음 두 예시는 동일합니다:

  • 이 예시에서는 $MY_VAR가 어디에도 정의되어 있지 않으므로 값이 없습니다:

    Job-with-variable:
      variables:
        MY_VAR: $MY_VAR
      script: echo "Value is '$MY_VAR'"
    
  • 이 예시에서는 동일한 이름의 기본 변수가 잡에서 사용할 수 없으므로 $MY_VAR에 값이 없습니다:

    variables:
      MY_VAR: "Default value"
    
    Job-with-same-name-variable:
      variables:
        MY_VAR: $MY_VAR
      script: echo "Value is '$MY_VAR'"
    

두 경우 모두 echo 명령은 Value is '$MY_VAR'를 출력합니다.

일반적으로 기본 변수의 값을 새 변수에 재할당하기보다는 잡에서 기본 변수를 직접 사용해야 합니다. 재할당이 필요한 경우에는 서로 다른 이름의 변수를 대신 사용합니다. 예를 들면 다음과 같습니다:

variables:
  MY_VAR1: "Default value1"
  MY_VAR2: "Default value2"

overwrite-same-name:
  variables:
    MY_VAR2_FROM_DEFAULTS: $MY_VAR2
  script: echo "Values are '$MY_VAR1' and '$MY_VAR2_FROM_DEFAULTS'"