一个项目的Gitlabs工件用于进一步的项目

时间:2016-09-13 04:48:10

标签: continuous-integration gitlab gitlab-ci gitlab-ci-runner

问题

  • 在CI阶段使用docker容器时,在项目中携带工件(jar,class,war)的最佳方法是什么。

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

Gitlabs project1

  • 单元测试
  • 等...

Gitlabs project2

  • 单元测试
  • 等...
  • 构建(失败)
    • 这里我需要在project1
    • 中生成一个工件(jar)

当前情景/评论

  • 我在每个.gitlab-ci.yml使用码头工具我会有独立的容器
  • 一切都在project1中正常工作
  • 如果我使用" shell"而不是我的.gitlab-ci.yml中的dockers我可以将jar文件保存在磁盘中的project1中,并在project2启动构建时使用
  • 今天,当project1完成工作时,我的触发器调用project2
  • 我的工件不是RPM,因此我不会添加到我的仓库

可能的解决方案

5 个答案:

答案 0 :(得分:5)

您好,您必须查看名为get-last-successful-build-artifact.sh并由morph027开发的脚本。

https://gitlab.com/morph027/gitlab-ci-helpers

此脚本允许下载工件并将其解压缩到项目根目录中。它使用Gitlab API检索最新的成功构建并下载相应的工件。您可以通过稍微更新脚本来组合多个工件并在任何位置解压缩。

我目前也开始使用PHP library来处理构建工件,但它处于非常早期的阶段,并且暂时与laravel捆绑在一起。

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

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

希望这有帮助:)

答案 1 :(得分:1)

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

  

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

是的,只需在项目设置中将其添加为secret variable - >管道 - >秘密变量。

答案 2 :(得分:1)

在GitLab银和高级版中,有 $CI_JOB_TOKEN可用,它允许以下.gitlab-ci.yaml代码段:

build_submodule:
  image: debian
  stage: test
  script:
  - apt update && apt install -y unzip
  - curl --location --output artifacts.zip "https://gitlab.example.com/api/v4/projects/1/jobs/artifacts/master/download?job=test&job_token=$CI_JOB_TOKEN"
  - unzip artifacts.zip
  only:
  - tags

但是,如果您没有Silver或更高级别的gitlab订阅,但依赖免费套餐,则还可以使用API​​和管道触发器。

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

首先,您将需要一个API令牌。 转到您的设置以创建一个,然后将其存储为项目B 中的变量。在我的示例中为GITLAB_API_TOKEN

项目B 的CI / CD设置中,添加一个新触发器,例如“ Builded Project A”。这将为您提供一个令牌,您可以复制该令牌。 打开项目A 的.gitlab-ci.yaml,然后从项目B 的CI / CD设置触发器部分复制trigger_build:部分。

项目A

trigger_build:
  stage: deploy
  script:
    - "curl -X POST -F token=TOKEN -F ref=REF_NAME https://gitlab.example.com/api/v4/projects/${PROJECT_B_ID}/trigger/pipeline"

用该令牌替换令牌(最好将其作为变量存储在项目A 中-然后您需要将其设置为token=${TRIGGER_TOKEN_PROJECT_B}之类),然后用分支替换REF_NAME (例如master)。

然后,在项目B 中,我们可以编写一个仅基于触发器并检索工件的部分。

项目B

download:
  stage: deploy
  only:
    - triggers
  script:
    - "curl -O --header 'PRIVATE-TOKEN: ${GITLAB_API_TOKEN}' https://gitlab.example.com/api/v4/projects/${PROJECT_A_ID}/jobs/${REMOTE_JOB_ID}/artifacts/${REMOTE_FILENAME}"

如果您知道工件路径,则可以用它替换${REMOTE_FILENAME},例如build/app.jar。可以在CI / CD设置中找到项目ID。

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

  

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

因此触发器将传递REMOTE_JOB_ID和REMOTE_FILENAME,但是当然您可以根据需要进行修改:

curl -X POST \
     -F token=TOKEN \
     -F ref=REF_NAME \
     -F "variables[REMOTE_FILENAME]=build/app.jar" \
     -F "variables[REMOTE_JOB_ID]=${CI_JOB_ID}" \
     https://gitlab.example.com/api/v4/projects/${PROJECT_B_ID}/trigger/pipeline

答案 3 :(得分:1)

项目之间的杂物(jar,class,war)

那应该是注册表包的用途。

GitLab 13.3(2020年8月)现在免费提供!

Package Registry现在在Core中可用

一年半以前,我们通过直接在GitLab中构建Maven支持来扩展了对Java项目和开发人员的支持。我们的目标是提供一种标准化的方式来共享软件包并在项目之间进行版本控制。

自那时以来,我们在与客户和社区合作以更好地了解您的用例的同时,投资了进一步组建Package团队。我们还添加了对Node,C#/。NET,C / C ++,Python,PHP和Go开发人员的支持。

您不断增加的采用,使用和对这些功能的贡献,使我们能够将视野扩展到更全面的解决方案,并集成到我们的单个应用程序中,该应用程序支持所有常用语言和二进制格式的软件包管理。
没有GitLab社区的明确支持,就不可能实现这个目标。

作为GitLab管理承诺的一部分,我们很高兴地宣布,GitLab Core Edition中现已提供每种软件包管理器格式的基本功能。
这意味着,如果您使用npm,Maven,NuGet,Conan,PyPI,Composer或Go模块,则将能够:

  • 将GitLab用作私有(或公共)软件包注册中心
  • 使用您的GitLab凭据,个人访问权限或工作令牌进行身份验证
  • 将软件包发布到GitLab
  • 从GitLab安装软件包
  • 搜索托管在GitLab上的软件包
  • 访问一个易于使用的UI,该UI显示软件包的详细信息和元数据,并允许您下载任何相关文件
  • 确保您的贡献可用于所有GitLab用户

我们希望听到您的反馈,并继续与我们所有的用户一起改善这些功能。

请参见DocumentationIssue

请参见this video

答案 4 :(得分:0)

在撰写本文时,工件不能仅在管道内跨项目共享。见https://docs.gitlab.com/ee/ci/yaml/README.html#artifacts

然而,有一个开放的功能来启用此功能尚未实现。 https://gitlab.com/gitlab-org/gitlab-ce/issues/14728