Gitlab CI:在 Kaniko 作业中执行自己的脚本

Alb*_*ore 6 busybox gitlab gitlab-ci kaniko

我有以下工作在我的 gitlab-ci.yml 中构建图像

dockerize:
  stage: containerize
  before_script:
   - eval $($CONTEXT_SCRIPT_PATH)
  environment:
    name: $CONTEXT
    url: XXX
  image:
      name: gcr.io/kaniko-project/executor:debug-v0.23.0
      entrypoint: [""]  
  script:
      - echo "{\"auths\":{\"$CI_DOCKER_REGISTRY_URL\":{\"username\":\"$CI_DOCKER_REGISTRY_USER\",\"password\":\"$CI_DOCKER_REGISTRY_PASSWORD\"}}}" > /kaniko/.docker/config.json
      - /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile --destination $CI_DOCKER_REGISTRY_URL/portal/frontend:$CONTEXT-$CI_PIPELINE_IID --build-arg VERSION_TAG=$CONTEXT-$CI_PIPELINE_IID --build-arg COMMIT_TIME=$COMMIT_TIME
      - echo "Pushed to Registry - $CI_DOCKER_REGISTRY_URL/portal/frontend:$CONTEXT-$CI_PIPELINE_IID"
  retry: 2
Run Code Online (Sandbox Code Playgroud)

在 before_script 部分中,设置了 env $CONTEXT。$CONTEXT_SCRIPT_PATH 在全局变量部分设置:

variables:
  CONTEXT_SCRIPT_PATH: "${CI_PROJECT_DIR}/Scripts/get_context.sh"
Run Code Online (Sandbox Code Playgroud)

但如果作业正在运行,它找不到脚本。

/busybox/sh: eval: line 90: /builds/portal/portal-frontend/Scripts/get_context.sh: not found
Run Code Online (Sandbox Code Playgroud)

它适用于其他作业,那么 Kaniko 是否在某个单独的环境中运行?如何指定正确的路径?

小智 0

抱歉回复晚了,但对于任何偶然发现此问题的人:

该脚本文件必须已存在于当前 Job中。

任何一个:

  • git clone它存在于项目git存储库中,并在每个作业之前自动添加
  • 它是在工作期间手动创建的 -echo 'my script stuff' > $CONTEXT_SCRIPT_PATH
  • 默认情况下,将所有未跟踪的文件作为工件进行跟踪 -default: { artifacts: untracked } }
  • 或者作为工件包含在内:
---
default: { variables: { CONTEXT_SCRIPT_PATH: "${CI_PROJECT_DIR}/Scripts/get_context.sh" } }

build-first: 
  stage: build
  artifacts: { paths: "$CONTEXT_SCRIPT_PATH" }  # tell gitlab to artifact the script

build-second:
  stage: build
  dependencies: [ build-first ]  # run this stage after build-first succeeded
  before_script: [ "eval $($CONTEXT_SCRIPT_PATH)" ]
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 全局部分已弃用 - 使用default并放入variables其中,如上所示
  • 如果需要同一阶段中先前作业的工件,请使用dependencies并引用所需的阶段
  • 如果不使用dependencies,则先前阶段的所有工件都会传递到每个作业

参考资料 (GitLab):CI 关键字参考 工件依赖项默认值