如何使用 GitLab CI 中的包含从另一个项目中的文件运行脚本?

ctw*_*els 5 gitlab-ci

我正在尝试通过我的包含从位于另一个项目中的模板文件运行 shell 脚本。

这应该如何配置才能工作?下面的脚本是我的代码的简化版本。

项目A

template.yml

deploy:
  before_script:
    - chmod +x ./.run.sh
    - source ./.run.sh
Run Code Online (Sandbox Code Playgroud)

项目B

gitlab-ci.yml

include:
 - project: 'project-a'
    ref: master
    file: '/template.yml'

stages:
  - deploy
Run Code Online (Sandbox Code Playgroud)

显然,这些命令实际上是从ProjectB而不是模板所在的ProjectA中运行的。这可以通过添加ls -a模板文件进一步确认。

那么我们应该如何调用run.sh呢?两个项目都在不同组下的同一个 GitLab 实例上。

Bal*_*ung 16

如果您有权访问项目 A 和 B,则可以使用多项目管道。您从项目 B触发项目 A 中的管道。

在项目 A 中,您克隆项目 B 并运行脚本。

项目B

job 1:
  variables:
    PROJECT_PATH: "$CI_PROJECT_PATH"
    RELEASE_BRANCH: "$CI_COMMIT_BRANCH"
  trigger:
    project: project-a
    strategy: depend
Run Code Online (Sandbox Code Playgroud)

项目A

job 2:
  rules:
    - if: '$CI_PIPELINE_SOURCE == "pipeline" && $PROJECT_PATH && $RELEASE_BRANCH'
  script:
    - git clone -b "${RELEASE_BRANCH}" --depth 50 https://gitlab-ci-token:${CI_JOB_TOKEN}@${CI_SERVER_HOST}/${PROJECT_PATH}.git $(basename ${PROJECT_PATH})
    - cd $(basename ${PROJECT_PATH})
    - chmod +x ../.run.sh
    - source ../.run.sh
Run Code Online (Sandbox Code Playgroud)

  • 多项目管道不是意味着在外部管道上运行外部脚本吗?我认为用户正在询问如何在当前管道上运行外部脚本。* (2认同)

小智 13

我们也遇到了这个问题,有点希望 Gitlab 允许include“导入”非 yaml 文件。尽管如此,我们发现的最简单的解决方法是在存储库 A 中构建一个小型 docker 映像,其中包含您要运行的脚本,然后存储库 B 的工作使用该 docker 映像作为image,因此该文件run.sh可用:)

最小 Dockerfile:

FROM bash:latest
COPY run.sh /usr/local/bin/
CMD run.sh
Run Code Online (Sandbox Code Playgroud)

chmod +x run.sh(注意:在构建图像之前请确保您,或者添加一个RUN chmod +x /usr/local/bin/run.sh步骤)

然后,您只需将其添加到您的项目 B 中.gitlab-ci.yml

stages:
  - deploy

deploy:
  image: registry.gitlab.com/...  # Wherever you pushed your docker image to
  script: run.sh
Run Code Online (Sandbox Code Playgroud)