通过CI runner将文件推送到gitlab-ci

时间:2016-10-19 05:21:39

标签: gitlab gitlab-ci gitlab-ci-runner

我正在使用gitlab CI runner来测试我的代码并生成一些文件。我只是想通过CI runner将生成的文件推送到gitlab存储库。有没有办法做到这一点?

5 个答案:

答案 0 :(得分:12)

我通过这样做解决了这个问题:

  1. 使用api范围生成新的gitlab访问令牌:User Settings > Access Tokens
  2. 使用新令牌将受保护的CI变量添加到项目设置中:Your project > Settings > Secret variable
  3. <强> - &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_USERGIT_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.hclterraform/ 目录中的文件 $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"'