私の同僚と一緒に、私たちは毎日ますます重要になるC++ライブラリに取り組んでいます。 gitlab-ci.yml
私たちにできるファイル:
GitLabを選択するようになったすべての種類のもの!
ライブラリ全体のプロファイルを作成し、ベンチマークを別のプロジェクトにプッシュします。 SSHキーメソッドを使用して、既にドキュメントのようなものを作成しましたが、今回はこれを避けたいと思います。
次のようなスクリプトを試しました。
test_ci_Push:
tags:
- linux
- Shell
- light
stage: profiling
allow_failure: false
only:
- new-benchmark-stage
script:
- git clone http://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.mycompany.home/developers/benchmarks.git &> /dev/null
- cd benchmarks
- touch test.dat
- echo "This is a test" > test.dat
- git config --global user.name "${GITLAB_USER_NAME}"
- git config --global user.email "${GITLAB_USER_EMAIL}"
- git add --all
- git commit -m "GitLab Runner Push"
- git Push http://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.mycompany.home/developers/benchmarks.git HEAD:master
- cd ..
また、基本的なgit Push Origin master
更新されたファイルをプッシュしますが、同じ答えが返されるたびに:
remote: You are not allowed to upload code for this project.
fatal: unable to access 'http://gitlab-ci-token:[email protected]/developers/benchmarks.git/': The requested URL returned error: 403
両方のプロジェクトは同じsite
の下にあり、両方にプッシュする権利があります。ここで何が間違っていますか?
Gitlab ciトークンはgithub.comのデプロイキーに似ているため、リポジトリへの読み取りアクセスのみが許可されます。実際にプッシュするには、個人アクセストークンを生成し、代わりに使用する必要があります。
まず、示されているようにトークンを生成する必要があります ここgitlabのドキュメント 。読み取りユーザーとAPIの両方のスコープを確認してください。また、これはGitLab 8.15以降でのみ機能します。古いバージョンを使用していて、アップグレードを希望しない場合、別の方法がありますが、より複雑で安全性が低くなります。
最終的に、gitlab-ci.ymlは次のようになります。
test_ci_Push:
tags:
- linux
- Shell
- light
stage: profiling
allow_failure: false
only:
- new-benchmark-stage
script:
- git clone http://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.mycompany.home/developers/benchmarks.git &> /dev/null
- cd benchmarks
- echo "This is a test" > test.dat
- git config --global user.name "${GITLAB_USER_NAME}"
- git config --global user.email "${GITLAB_USER_EMAIL}"
- git add --all
- git commit -m "GitLab Runner Push"
- git Push http://${YOUR_USERNAME}:${PERSONAL_ACCESS_TOKEN}@gitlab.mycompany.home/developers/benchmarks.git HEAD:master
- cd ..
これまでの回答は多かれ少なかれ素晴らしいものですが、いくつかの重要なゴティアがあります。
before_script:
- git config --global user.name "${GITLAB_USER_NAME}"
- git config --global user.email "${GITLAB_USER_EMAIL}"
script:
- <do things>
- git Push "https://${GITLAB_USER_NAME}:${CI_GIT_TOKEN}@${CI_REPOSITORY_URL#*@}" "HEAD:${CI_COMMIT_TAG}"
1つは、ユーザー名/メールアドレスをgitに設定するだけです。
第二に、beforeスクリプトにそれを含めることは、非常に重要ではありませんが、「拡張」を行う際の再利用を容易にします。
最後に、httpsをプッシュすることは「罰金」ですが、保存されたsshキーを使用していないため、トークンを明らかにする可能性のあるものはすべて避ける必要があります。たとえば、gitlabはこのコマンドでトークンを出力しませんが、gitは新しいアップストリームが https:// username:thetokeninplaintexthere @ url に設定されていることを喜んで通知します。 、-uを使用してアップストリームを設定しないでください。
また、それは必要ではありません、私たちは単一のプッシュをしているだけです。
さらに、URLを決定するとき、既存のCI_REPOSITORY_URLを使用することが最も信頼できるソリューションであることがわかりました(たとえば、リポジトリを移動する場合など)。したがって、URL文字列のユーザー名/トークンを置き換えるだけです。
また、ユーザーとパスワード(書き込みアクセス権を持つユーザー)をシークレット変数として指定して使用することもできます。
例:
before_script:
- git remote set-url Origin https://$GIT_CI_USER:[email protected]/$CI_PROJECT_PATH.git
- git config --global user.email '[email protected]'
- 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