Continuous integration 一个项目的Gitlabs工件在后续项目中使用 问题: 在CI阶段使用docker容器时,在项目之间携带工件(jar、类、war)的最佳方式是什么

Continuous integration 一个项目的Gitlabs工件在后续项目中使用 问题: 在CI阶段使用docker容器时,在项目之间携带工件(jar、类、war)的最佳方式是什么,continuous-integration,gitlab,gitlab-ci,gitlab-ci-runner,Continuous Integration,Gitlab,Gitlab Ci,Gitlab Ci Runner,让我详细解释我的问题,请不要停止阅读…=) Gitlabs项目1 单元测试 等等 包装 Gitlabs项目2 单元测试 等等 构建(失败) 这里我需要在project1中生成一个工件(jar) 当前情景/评论 我使用的是dockers,所以在每个.gitlab-ci.yml中我都有独立的容器 项目1一切正常 如果我在我的.gitlab-ci.yml中使用“shell”而不是dockers,我可以将project1中的jar文件保存在磁盘中,并在project2启动构建时使用 今天,

让我详细解释我的问题,请不要停止阅读…=)

Gitlabs项目1
  • 单元测试
  • 等等
  • 包装
Gitlabs项目2
  • 单元测试
  • 等等
  • 构建(失败)
    • 这里我需要在project1中生成一个工件(jar)
当前情景/评论
  • 我使用的是dockers,所以在每个.gitlab-ci.yml中我都有独立的容器
  • 项目1一切正常
  • 如果我在我的.gitlab-ci.yml中使用“shell”而不是dockers,我可以将project1中的jar文件保存在磁盘中,并在project2启动构建时使用
  • 今天,当project1完成时,我的触发呼叫project2运行良好
  • 我的工件不是RPM,所以我不会添加到我的回购中
可能的解决方案
  • 我可以提交project1的工件,并在需要构建project2时签出
  • 我需要研究gitlabs的缓存特性是否是为此目的设计的()

您好,您必须查看一个名为
获取最后一个成功构建工件.sh的脚本,该脚本由
morph027
开发

此脚本允许下载工件并在项目根目录中解压缩它。它使用Gitlab API检索最新的成功构建并下载相应的工件。只需稍微更新脚本,就可以组合多个工件并在任何地方解压

我目前也开始着手处理构建工件,但它还处于非常早期的阶段,目前与laravel有联系

目前还没有简单的方法来处理项目之间的工件使用,您必须使用这些工具构建自己的工件

我认为使用shell executor不是正确的解决方案,这是非常危险的,因为您无法验证构建期间使用的服务器上的文件


希望得到以下帮助:)

很酷,发现我的代码片段被引用在这里;)


是否可以使用get-last-successful-build-artifact.sh而不使用私有令牌(在世界可读的存储库中)?e、 g.共享工件下载命令,不公开您的令牌


是的,只需在项目设置->管道->秘密变量中添加它即可。

在撰写本文时,工件不能仅在管道内跨项目共享。看

但是,有一个开放的功能来启用此功能,该功能尚未实现。

在GitLab silver and premium中,有 可用,它允许以下.gitlab-ci.yaml代码段:

build_子模块:
图片:debian
阶段:测试
脚本:
-apt更新和apt安装-y解压缩
-curl--location--output artifacts.zip“https://gitlab.example.com/api/v4/projects/1/jobs/artifacts/master/download?job=test&job_token=$CI_作业_令牌”
-解压artifacts.zip
仅:
-标签
但是,如果您没有银色或更高版本的gitlab订阅,而是依赖免费层,那么也可以使用API和管道触发器

假设我们有项目A构建
app.jar
,这是项目B所需要的

首先,您需要一个API令牌。 转到
Profile settings/Access Tokens
页面创建一个令牌,然后将其作为变量存储在项目B中。在我的示例中,它是
GITLAB\u API\u令牌

项目B的CI/CD设置中添加一个新触发器,例如“project a Build”。这将给你一个令牌,你可以复制。 打开项目A的.gitlab-ci.yaml并从项目B的ci/CD设置触发器部分复制
触发器生成:
部分

项目A

trigger\u构建:
阶段:部署
脚本:
-“curl-X POST-F token=token-F ref=ref\u NAMEhttps://gitlab.example.com/api/v4/projects/${PROJECT_B_ID}/trigger/pipeline“
用该令牌替换令牌(更好的做法是,将其作为变量存储在项目a——然后需要将其设置为
令牌=${TRIGGER\u TOKEN\u project\u B}
或其他内容),并用分支替换REF\u NAME(例如
master

然后,在项目B中,我们可以编写一个部分,该部分仅构建在触发器上并检索工件

项目B

下载:
阶段:部署
仅:
-触发
脚本:
-“curl-O--头'PRIVATE-TOKEN:${GITLAB\u API\u TOKEN}”https://gitlab.example.com/api/v4/projects/${PROJECT\u A\u ID}/jobs/${REMOTE\u JOB\u ID}/artifacts/${REMOTE\u FILENAME}”
如果您知道工件路径,那么可以用它替换
${REMOTE\u FILENAME}
,例如
build/app.jar
。可以在CI/CD设置中找到项目ID

我在项目A中扩展了脚本,以传递触发器设置部分中记录的剩余信息:

变量[VARIABLE]=VALUE
添加到API请求中。变量值可用于区分触发管道和正常管道

因此触发器传递远程\u作业\u ID和远程\u文件名,但您当然可以根据需要修改它:

curl-X POST\
-F令牌=令牌\
-F ref=ref_名称\
-F“变量[远程文件名]=build/app.jar”\
-F“变量[REMOTE_JOB_ID]=${CI_JOB_ID}”\
https://gitlab.example.com/api/v4/projects/${PROJECT_B_ID}/trigger/pipeline
在项目之间排列工件(jar、类、war)

这应该是包注册表的用途

有了(2020年8月),它现在是免费的

包注册表现在在Core中可用 一年半前,我们将Maven支持直接构建到GitLab中,从而扩展了对Java项目和开发人员的支持。我们的目标是提供一种标准化的方式来共享软件包和