我正在使用gitlab CI runner来测试我的代码并生成一些文件。我只是想通过CI runner将生成的文件推送到gitlab存储库。有没有办法做到这一点?
答案 0 :(得分:12)
我通过这样做解决了这个问题:
User Settings > Access Tokens
Your project > Settings > Secret variable
<强> - &GT;编辑:如果你想git push到一个非受保护的分支,不要将runner变量设置为protected
然后您可以在gitlab-ci脚本中使用此标记而不是默认标记。例如:
before_script:
- git remote set-url origin https://USERNAME:${CI_PUSH_TOKEN}@gitlab.com/your-project.git
- git config --global user.email 'your@email.com'
- git config --global user.name 'yourname'
...
- git checkout -B branch
- change files
- git commit -m '[skip ci] commit from CI runner'
- git push --follow-tags origin branch
答案 1 :(得分:6)
在gitlab中生成SSH密钥
- &GT;个人资料设置 - &gt; SSH密钥 - &gt;生成它
生成名为 SSH
的gitlab 变量中的SSH密钥存储区- &GT;项目设置 - &gt;变量 - &gt;添加变量
在.gitlab-ci.yml中添加以下行。
before_script:
- mkdir -p ~/.ssh
- echo "$SSH" | tr -d '\r' > ~/.ssh/id_rsa
- chmod 600 ~/.ssh/id_rsa
- ssh-keyscan -H 'Git_Domain' >> ~/.ssh/known_hosts
之后使用以下js代码将文件推送到存储库。
var child_process = require("child_process");
child_process.execSync("git checkout -B 'Your_Branch'");
child_process.execSync("git remote set-url origin Your_Repository_Git_Url");
child_process.execSync("git config --global user.email 'Your_Email_ID'");
child_process.execSync("git config --global user.name 'Your_User_Name'");
for (var i=0;i<filesToBeAdded.length;i++) {
child_process.execSync("git add "+filesToBeAdded[i]);
}
var ciLog = child_process.execSync("git commit -m '[skip ci]Automated commit for CI'");
var pushLog = child_process.execSync("git push origin Your_Branch");
[skip ci] 在提交邮件中最重要。否则它将启动CI过程的无限循环。
答案 2 :(得分:1)
您正在寻找的功能称为工件。工件是在构建成功时附加到构建的文件。
要启用神器,请将其放在.gitlab-ci.yml:
中artifacts:
paths:
- dir/
- singlefile
这会将dir
目录和文件singlefile
上传回GitLab。
答案 3 :(得分:1)
您当然可以使用SSH密钥,但您也可以提供用户和密码(具有写访问权限的用户)作为秘密变量并使用它们。
示例:
before_script:
- git remote set-url origin https://$GIT_CI_USER:$GIT_CI_PASS@gitlab.com/$CI_PROJECT_PATH.git
- git config --global user.email 'myuser@mydomain.com'
- git config --global user.name 'MyUser'
您必须将GIT_CI_USER
和GIT_CI_PASS
定义为秘密变量(您始终可以为此创建专用用户)。
使用此配置,您通常可以使用git。我正在使用这种方法在发布后推送标签(使用Axion Release Gradle Pluing - http://axion-release-plugin.readthedocs.io/en/latest/index.html)
示例发布作业:
release:
stage: release
script:
- git branch
- gradle release -Prelease.disableChecks -Prelease.pushTagsOnly
- git push --tags
only:
- master
答案 4 :(得分:1)
另一种使用 Gitlab API 提交回 .terraform.lock.hcl
上 terraform/
目录中的文件 $CI_COMMIT_BRANCH
和 [skip ci]
的解决方案:
script:
- 'STATUS=$(curl -Ss --head --header "JOB-TOKEN: $CI_JOB_TOKEN" "$CI_API_V4_URL/projects/$CI_PROJECT_ID/repository/files/terraform%2F%2Eterraform%2Elock%2Ehcl?ref=$CI_COMMIT_BRANCH" | grep "HTTP/1.1" | cut -d " " -f2)'
- if [[ $STATUS == "404" ]]; then ACTION="create"; else ACTION="update"; fi
- 'curl --request POST --form "branch=$CI_COMMIT_BRANCH" --form "commit_message=[skip ci] terraform.lock.hcl from pipeline" --form "actions[][action]=$ACTION" --form "actions[][file_path]=terraform/.terraform.lock.hcl" --form "actions[][content]=<.terraform.lock.hcl" --header "JOB-TOKEN: $CI_JOB_TOKEN" "$CI_API_V4_URL/projects/$CI_PROJECT_ID/repository/commits"'