如何在Gitlab中提交并推送作业工件到指定目录?

How to commit and push job artifact to a specified directory in Gitlab?

大家好,

我在 gitlab-ci.yml 文件上有一个两阶段管道。第一个作业生成一个工件作为 asd.asd 文件。第二阶段使用这个神器。如果流水线从第一阶段开始,那么第二阶段可以使用第一阶段的工件。但在某些情况下,我 运行 只有第二阶段而没有 运行 第一阶段。因此,我需要将第一阶段最后一次成功 运行ning 的工件提交并推送给 master。我怎样才能在 gitlab-ci.yml 文件中做到这一点?

stages:
  - first
  - second

job1:
  stage: first
  tags: 
    - asdasd
  script:
    - echo "Hello, $GITLAB_USER_LOGIN!"
    - XYZ.sh
  artifacts:
    name: "$CI_JOB_NAME-$CI_COMMIT_REF_NAME-$CI_COMMIT_SHORT_SHA"
    paths: 
     - folder1/asd.asd

#here the asd.asd artifact should be commited into folder1, how?

job2:
  stage: second
  tags: 
    - asdasd
  script:
    - echo "Hello, $GITLAB_USER_LOGIN!"
    - run.sh
  artifacts:
    name: "$CI_JOB_NAME-$CI_COMMIT_REF_NAME-$CI_COMMIT_SHORT_SHA"
    paths: 
     - folder1/asd.elf

谢谢, M.Altay

So, I need to commit and push to the master the artifact of last successful running of the first stage

为了解决这个问题,让我们把它分解成组件。 为了在您的案例 first 中最后一次成功执行阶段,我们将结合使用 Gitlab API 和 jq,以获取此处 https://docs.gitlab.com/ee/api/pipelines.html#list-project-pipelines

中所述的最后一个成功管道
GET /projects/:id/pipelines

我们将使用此API获取特定项目的最后一个成功管道的id,使用以下命令

PIPELINE_ID=$(curl -s --header "PRIVATE-TOKEN: <access_token>"  "https://gitlab.com/api/v4/projects/<project_id>/pipelines?status=success" | jq '.[0].id')

接下来,我们将使用管道 ID 从您案例中的特定阶段 first 获取最后一个成功的作业。为此,我们将使用 Gitlab API https://docs.gitlab.com/ee/api/jobs.html#list-pipeline-jobs

GET /projects/:id/pipelines

命令:

JOB_ID=$(curl -s --header "PRIVATE-TOKEN: <access_token>"  "https://gitlab.com/api/v4/projects/<project_id>/pipelines/$PIPELINE_ID/jobs?scope=success" | jq '.[] | select(.stage=="first") | .id')

找到神器https://docs.gitlab.com/ee/api/job_artifacts.html#get-job-artifacts

GET /projects/:id/jobs/:job_id/artifacts

wget -U "Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.17 (KHTML,like Gecko) Ubuntu/11.04 Chromium/11.0.654.0 Chrome/11.0.654.0 Safari/534.17" --header "PRIVATE-TOKEN: <access_token>" "https://gitlab.com/api/v4/projects/<project_id>/jobs/$JOB_ID/artifacts" -O artifacts.zip
unzip artifacts.zip

最后通过提交 API 将其提交给 content 属性 解压缩文件的路径 https://docs.gitlab.com/ee/api/commits.html#create-a-commit-with-multiple-files-and-actions

POST /projects/:id/repository/commits

curl -XPOST  --header "PRIVATE-TOKEN: access_token"  https://gitlab.com/api/v4/projects/<project_id>/repository/commits --form "branch=<target_branch>"  --form "commit_message=some commit message" --form "start_branch=master" --form "actions[][action]=update" --form "actions[][file_path]=folder1/asd.asd"  --form "actions[][content]=<path/to/the/unziped/file"