如何在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"
大家好,
我在 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"