Gitlab-CI 如何在不同的管道中使用工件

问题描述 投票:0回答:4

目前我有两个主要项目。

1-) Vue 项目,其中包含(iOS 和 Android 的 webviews、网站和 Electron 的渲染器),它们共享组件和 API。

2-) Electron 项目,为(windows、darwin、linux)构建桌面应用程序

我想自动化我们的构建、发布过程。我当前的设置..

            before_script: 
                - apt-get update
                - apt-get install zip unzip 
                - rm -rf vue-project
                - git clone vue-project
                - cd vue-project
                - git checkout dev
                - git pull
                - sed -i "/\b\(areaCode\|inline-svg-loader\)\b/d" ./packages/devtool/package.json
                - yarn install
                - ln -s vue-project/packages/desktop/ web
                - npm install

            build_darwin:
                stage: build
                script:
                    - npm run package -- darwin --deploy
                cache:
                    paths:
                        - vue-project/node_modules
                        - node_modules

基本上在捆绑电子项目之前,它会克隆 vue-project 安装依赖项并捆绑电子渲染器,然后在完成时捆绑。我正在运行包。

我想将这两项不同的工作分开。无论如何,我可以使用来自不同项目 gitlab-CI 管道的工件吗?

任何帮助将不胜感激。

continuous-integration gitlab electron gitlab-ci gitlab-ci-runner
4个回答
12
投票

Gitlab 有一个 API 可以做很多技巧。

curl --header "PRIVATE-TOKEN:YOURPRIVATETOKEN" "https://gitlab.example.com/api/v4/projects/1/jobs/artifacts/master/download?job=test"

将其下载为文件。

curl --header "PRIVATE-TOKEN:YOURPRIVATETOKEN" -o artifacts.zip "http://gitlab.example.net/api/v4/projects/<projectnumber>/jobs/artifacts/master/download?job=build_desktop

10
投票

Gitlab 当然可以支持这一点。要实现此目的,请按照下列步骤操作:

神器生成

在您的 Vue 项目中,修改您感兴趣的作业以存储与 Electron 项目相关的工件。每个作业的工件均使用 Gitlab Job Artifacts 表示法定义,并在作业完成时上传到 Gitlab,并与您的 ProjectBranchJob 关联存储。

注意:分支经常被忽视,当您想要检索工件时,分支很重要,稍后会详细介绍。

图示:

Vue Project .gitlab_ci.yml

stages:
- stage1
- ...

vue-job1:
  stage: stage1
  script:
    - echo "vue-job1 artifact1" > ./artifact1
    - echo "vue-job1 artifact2" > ./artifact2
  artifacts:
    when: always
    paths:
    - ./artifact1
    - ./artifact2
    expire_in: 90 days

vue-job2:
  stage: stage1
  script:
    # error, would overwrite job1's artifacts since working
    # directory is a global space shared by all pipeline jobs
    # - echo "vue-job2 artifact1" > ./artifact1
    - echo "vue-job2 artifact1" > ./artifact3
  artifacts:
    when: always
    paths:
    - ./artifact3
    expire_in: 90 days

上面生成的工件将写入工作目录,该目录是项目存储库的克隆。因此要小心文件名冲突。为了安全起见,请将您的工件放在子目录中(例如:cat“foo”> ./subdir/artifact)并以相同的方式在路径中引用它们(路径:-./subdir/artifact)。您可以在脚本中使用“ls”来查看工作目录。

当您的作业完成后,您可以使用 Gitlab UI 确认存储在 Gitlb 中的工件。查看作业输出,然后使用右侧面板上作业工件下的浏览按钮。

文物检索

在您的 Electron 项目中,修改您感兴趣的作业,以使用 Gitlab Job Artifacts APIcurl 检索存储在 Vue 项目中的工件。为了访问 Vue 工件,您将需要在其下创建工件的 Vue ProjectBranchJob

项目:对于项目,请使用 Gitlab UI 项目详细信息屏幕中显示的 项目 ID

分支:通常是master,但取决于管道执行的分支。尽管这与您的问题无关,但如果您在同一管道的执行中生成和使用工件,请使用 Gitlab 变量 $CI_COMMIT_BRANCH 作为分支。

作业:通常是为您的项目生成工件的作业名称。但如果您需要特定作业生成的工件,请使用 Job Number 和相应的检索 API。

图示:

Electron Project .gitlab_ci.yml

stages:
- stage1
- ...

electron-job1:
  stage: stage1
  script:
  - curl -o ./artifact1 -H "PRIVATE-TOKEN:$TOKEN" https://gitlab.example.com/api/v4/projects/$VUE_PROJECT_ID/jobs/artifacts/$BRANCH/raw/artifact1?job=vue-job1
  - curl -o ./artifact2 -H "PRIVATE-TOKEN:$TOKEN" https://gitlab.example.com/api/v4/projects/$VUE_PROJECT_ID/jobs/artifacts/$BRANCH/raw/artifact2?job=vue-job1
  - curl -o ./artifact3 -H "PRIVATE-TOKEN:$TOKEN" https://gitlab.example.com/api/v4/projects/$VUE_PROJECT_ID/jobs/artifacts/$BRANCH/raw/artifact3?job=vue-job2

此脚本将工件单独检索到 Electron 项目的工作目录中。还可以选择以 zip 存档的形式一次性检索您工作的所有工件。

杂项

尽管这不是所提出的问题,但值得注意的是,您可以在单个管道执行的生命周期内使用工件在作业之间传递信息。您还可以使用它在同一项目内跨管道执行传递信息。


2
投票

使用最新版本的 gitlab,只需使用多项目管道功能即可实现这一点(然后在一个项目中启动管道会触发另一个项目的构建):请参阅文档

或者您也可以使用“needs:project”机制,该机制允许一项作业从其他管道下载工件(请参阅文档

Use needs:project to download artifacts from up to five jobs in other pipelines.


0
投票

GitLab 16.7(2023 年 12 月)增加了一种新的可能性。

artifacts:public
CI/CD 关键字现已全面可用

以前,

artifacts:public
关键字仅可用作自我管理实例的默认禁用功能。

现在在 GitLab 16.7 中,我们已经让

artifacts:public
关键字对所有用户普遍可用。您现在可以在 CI/CD 配置文件中使用
artifacts:public
关键字来控制作业工件是否应公开访问。

请参阅文档问题

这意味着 Étienneanswer 中提到的 URL 也可以使用,即使没有凭据。

© www.soinside.com 2019 - 2024. All rights reserved.