57

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

ssh-add明らかに、これらのプライベート パッケージはクローンを作成するために ssh キーを必要とします。これはターミナルで機能しています。シェルにキーが追加されている限り、composer install を実行してこれらのパッケージを取得できます。

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

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

4

11 に答える 11

51

他のソリューションも参照してください。

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

SSH キーを使用した完全なハウツーは次のとおりです。

一般的なデザイン

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

SSH 公開鍵と秘密鍵のペアの生成

パスフレーズなしで公開 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 キー自体を入力します。
  • 「デプロイキーの作成」をクリック
于 2016-07-25T14:19:27.863 に答える
3

git リポジトリの構造を変更せずにこれを解決する 1 つの方法は、次の手順を実行することです。

1. ssh ホスト キーを取得する

実行しているサーバーの ssh ホスト キーを取得します。の場合gitlab.com:

  1. 走るssh-keyscan gitlab.com > known_hosts
  2. ここでssh-keygen -lf known_hosts報告されたフィンガープリントと一致することを 確認してください。
  3. の内容をコピーして、リポジトリでknown_hosts呼び出される変数に貼り付けます。SSH_KNOWN_HOSTS

この手順は 1 回だけ必要です。

2. ssh を使用するようにジョブを構成する

before_script:
    - git config --global url."https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com".insteadOf "git@gitlab.com:"
    - mkdir -p ~/.ssh
    - chmod 700 ~/.ssh
    - echo "$SSH_KNOWN_HOSTS" > ~/.ssh/known_hosts
    - chmod 644 ~/.ssh/known_hosts

またはしようとしている場合、"ssh://git@gitlab.com"ビットは異なる場合があります。必要に応じて調整してください。git clone git@gitlab.com:pip install -e git+ssh://git@gitlab.com/...

この時点で、CI は ssh を使用して別の (プライベート) リポジトリから取得できます。

3.【おまけDRY】

このトリックを使用して、一般的に記述します。

.enable_ssh: &enable_ssh |-
    git config --global url."https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com".insteadOf "ssh://git@gitlab.com"
    mkdir -p ~/.ssh
    chmod 700 ~/.ssh
    echo "$SSH_KNOWN_HOSTS" > ~/.ssh/known_hosts
    chmod 644 ~/.ssh/known_hosts

必要なジョブで有効にします

test:
    stage: test
    before_script:
        - *enable_ssh
    script:
        - ...
于 2019-11-03T10:22:57.443 に答える
1

docker:latest高山ベースの画像 (おそらくまたはdocker:dind)を使用している場合、次のbefore_scriptようになります。

before_script:
    - apk add --no-cache openssh-client git
    - mkdir -p /.ssh && touch /.ssh/known_hosts
    - ssh-keyscan gitlab.com >> /.ssh/known_hosts
    - echo $SSH_KEY | base64 -d >> /.ssh/id_rsa && chmod 600 /.ssh/id_rsa
    - git clone git@git.myhost.com:mygroup/myproject.git
于 2021-05-17T19:35:24.743 に答える
-1

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

要するに、GitLab 8.12 の時点では、必要なのは で相対パスを使用することだけ.submodulesであり、git submodule update --initは単純に機能します。

于 2016-11-23T10:03:24.047 に答える