web-dev-qa-db-ja.com

gitlab-ci.ymlからプッシュできません

私の同僚と一緒に、私たちは毎日ますます重要になるC++ライブラリに取り組んでいます。 gitlab-ci.yml私たちにできるファイル:

  • デバッグモードでのビルドとテスト
  • リリースモードでのビルドとテスト
  • Valgrindを使用してメモリリークなどの安全性チェックを実行し、ライブラリ内に不要な明確なシンボルがあるかどうかをチェックします
  • ドキュメントを生成する

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の下にあり、両方にプッシュする権利があります。ここで何が間違っていますか?

15
baptiste

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 ..
26
Clive Makamara

これまでの回答は多かれ少なかれ素晴らしいものですが、いくつかの重要なゴティアがあります。

  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文字列のユーザー名/トークンを置き換えるだけです。

2
oliver

また、ユーザーとパスワード(書き込みアクセス権を持つユーザー)をシークレット変数として指定して使用することもできます。

例:

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_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
1
Przemek Nowak