web-dev-qa-db-ja.com

GitLab CIでプライベートリポジトリを複製する

GitLabとGitLab CIをホストにセットアップし、プライベートリポジトリの一部をテストしています。このシステムでのcomposerモジュールの場合、プライベートパッケージを解決するためにSatisをセットアップしました。

明らかに、これらのプライベートパッケージはそれらを複製するためにsshキーを必要とし、これを端末で動作させます-ssh-addでキーが追加されている限り、composer install and getパッケージを実行できますシェルで。

ただし、GitLab CIでテストを実行するときに、プロジェクトにこれらの依存関係がある場合、GitLabインスタンスが(明らかに)depsを取得するために認証を必要とするため、テストは完了せず、テストはHost key verification failedと言って失敗します。

私の質問は、ランナーがテストを実行するときにパスワードなしでgitlabに認証できるようにこれをどのように設定するのですか?パスワードなしのssh-keyをランナーの~/.sshフォルダーに入れようとしましたが、ビルドはキーを追加することすらできません。「eval ssh-agent -s」に続いてssh-addを実行すると、エージェントが実行されていないと表示されるようです...

38
danbroooks

他の人が完全に明確かつ/または詳細ではなかったので、私はこれを答えとして投稿しています

GitLab 8.12+以降、サブモジュールリポジトリがそれを要求しているサーバーと同じサーバーにあると仮定すると、次のことができます。

  1. 通常どおりgitサブモジュールでリポジトリを設定します(git submodule add git@somewhere:folder/mysubmodule.git

  2. .gitmodulesファイルを次のように変更します

    [submodule "mysubmodule"]
      path = mysubmodule
      url = ../../group/mysubmodule.git
    

    ここで、「../../ group/mysubmodule.git」は、リポジトリからサブモジュールのものへの相対パスです。

  3. 次の行をgitlab-ci.ymlに追加します

    variables:
      GIT_SUBMODULE_STRATEGY: recursive
    

    すべてのサブモジュールをフェッチするようにランナーに指示するbeforeビルド。

警告:ランナーがGIT_SUBMODULE_STRATEGYディレクティブを無視しているようであれば、おそらく 更新中 を考慮する必要があります。

(ソース: https://docs.gitlab.com/ce/ci/git_submodules.html

20
Marco A.

他のソリューションもご覧ください。

  • gitサブモジュールの許可( Marco A.'s answer を参照)
  • git configのジョブトークンとオーバーライドリポジトリ( a544jh's answer を参照)

SSHキーを使用した完全なハウツー:

一般的なデザイン

  • sSHキーのペアを生成する
  • プロジェクトの安全な環境変数としてプライベートなものを追加する
  • gitLab-CIのテストスクリプトでプライベートなものを利用できるようにする
  • 各プライベート依存関係の公開キーを展開キーとして追加する

パブリックおよびプライベートSSHキーのペアの生成

パスフレーズなしで公開および秘密のSSHキーのペアを生成します。

ssh-keygen -b 4096 -C "<name of your project>" -N "" -f /tmp/name_of_your_project.key

プロジェクトにプライベートSSHキーを追加する

次のように、プロジェクトにキーを安全な環境変数として追加する必要があります。

  • 参照https://<gitlab_Host>/<group>/<project_name>/variables
  • 「変数の追加」をクリックします
  • テキストフィールドKeySSH_PRIVATE_KEYを入力します
  • テキストフィールドValueにプライベートSSHキー自体を入力します
  • [変更を保存]をクリックします

プライベートSSHキーをテストスクリプトに公開する

テストスクリプトで秘密キーを使用できるようにするには、.gitlab-ci.ymlファイルに次を追加する必要があります。

before_script:
  # install ssh-agent
  - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
  # run ssh-agent
  - eval $(ssh-agent -s)
  # add ssh key stored in SSH_PRIVATE_KEY variable to the agent store
  - ssh-add <(echo "$SSH_PRIVATE_KEY")
  # disable Host key checking (NOTE: makes you susceptible to man-in-the-middle attacks)
  # WARNING: use only in docker container, if you use it with Shell you will overwrite your user's ssh config
  - mkdir -p ~/.ssh
  - echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config

コードスニペットはGitLabドキュメントから取得

すべてのプライベートな依存関係への公開キーとして公開SSHキーを追加する

次のように、公開SSHキーをすべてのプライベート依存関係へのデプロイキーとして登録する必要があります。

  • 参照https://<gitlab_Host>/<group>/<dependency_name>/deploy_keys
  • 「新しい展開キー」をクリックします
  • テキストフィールドTitleにプロジェクトの名前を入力します
  • テキストフィールドKeyに公開SSHキー自体を入力します
  • 「デプロイキーの作成」をクリックします
40
toch

Sshキーまたはサブモジュールをいじりたくない場合は、gitの構成のリポジトリをオーバーライドして、代わりにジョブトークンで認証することができます(gitlab-ci.yml):

before_script:
  - git config --global url."https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.example.com/group/repo.git".insteadOf [email protected]:group/repo.git
12
a544jh

テストランナー用のSSHキーを設定するのは少し時間がかかりそうなので、この問題を解決するために トークンを展開 を使用しました。

git clone http://<username>:<deploy_token>@gitlab.example.com/tanuki/awesome_project.git

展開トークンはプロジェクトごとにあり、読み取り専用です。

5
Juddling

現在受け入れられている回答 は、Gitlab固有の要件を.gitmodulesファイルに埋め込みます。これにより、ローカル開発用の特定のディレクトリレイアウトが強制され、別のバージョン管理プラットフォームへの移行が複雑になります。

代わりに、 ジャドリングの答え のアドバイスに従いました。より完全な答えは次のとおりです。

.gitmodulesファイルの内容は次のとおりです。

[submodule "myproject"]
    url = [email protected]:mygroup/myproject.git

gitlab-ci.ymlには次のものがあります。

build:
  stage: build
  before_script:
    - git config --global url."https://gitlab-ci-token:${CI_JOB_TOKEN}@git.myhost.com/".insteadOf "[email protected]:"
    - git submodule sync && git submodule update --init

末尾の/:は、SSH認証からHTTPSにマッピングするため、git config行で重要です。 「不正なポート番号」エラーでしばらくつまずいた。

このソリューションは、Gitlab固有のファイルにGitlab固有の要件が埋め込まれているため、他のすべてで無視されるため、気に入っています。

5
Duncan Jones

ssh-keyscan -H 'localgitlab.co.uk' >> ~gitlab_ci_runner/.ssh/known_hostsで既知のホストにキーを追加することでこれを修正しました

4
danbroooks

3つの異なるスクリプトでsshキーを使用する必要があるシナリオがあったので、sshキーを1つのシェルスクリプトに入れて、他の3つのスクリプトの前に最初に呼び出しました。シェルスクリプト間でssh-agentが持続しないか、そのようなことが原因で、これは機能しなくなりました。最終的には、秘密キーを~/.ssh/id_rsaファイルに出力するだけになりました。これは、他のスクリプトにも確実に保持されます。

.gitlab-ci.yml

script:
    - ci/init_ssh.sh
    - git Push # or whatever you need ssh for

ci/init_ssh.sh

# only run in docker:
[[ ! -e /.dockerenv ]] && exit 0

mkdir -p ~/.ssh
echo "$GITLAB_RUNNER_SSH_KEY" > ~/.ssh/id_rsa
chmod 400 ~/.ssh/id_rsa
echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > /.ssh/config

それは魅力のように機能します!

0
user3246077

最終的に 合理的な解決策 があるようです。

要するに、GitLab 8.12で必要なことは、.submodules、 そしてその git submodule update --initは単に動作します

0
Eri Rubin