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を実行すると、エージェントが実行されていないと表示されるようです...
他の人が完全に明確かつ/または詳細ではなかったので、私はこれを答えとして投稿しています
GitLab 8.12+以降、サブモジュールリポジトリがそれを要求しているサーバーと同じサーバーにあると仮定すると、次のことができます。
通常どおりgitサブモジュールでリポジトリを設定します(git submodule add git@somewhere:folder/mysubmodule.git
)
.gitmodules
ファイルを次のように変更します
[submodule "mysubmodule"]
path = mysubmodule
url = ../../group/mysubmodule.git
ここで、「../../ group/mysubmodule.git」は、リポジトリからサブモジュールのものへの相対パスです。
次の行をgitlab-ci.yml
に追加します
variables:
GIT_SUBMODULE_STRATEGY: recursive
すべてのサブモジュールをフェッチするようにランナーに指示するbeforeビルド。
警告:ランナーがGIT_SUBMODULE_STRATEGY
ディレクティブを無視しているようであれば、おそらく 更新中 を考慮する必要があります。
他のソリューションもご覧ください。
SSHキーを使用した完全なハウツー:
パスフレーズなしで公開および秘密のSSHキーのペアを生成します。
ssh-keygen -b 4096 -C "<name of your project>" -N "" -f /tmp/name_of_your_project.key
次のように、プロジェクトにキーを安全な環境変数として追加する必要があります。
https://<gitlab_Host>/<group>/<project_name>/variables
Key
にSSH_PRIVATE_KEY
を入力しますValue
にプライベート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
次のように、公開SSHキーをすべてのプライベート依存関係へのデプロイキーとして登録する必要があります。
https://<gitlab_Host>/<group>/<dependency_name>/deploy_keys
Title
にプロジェクトの名前を入力しますKey
に公開SSHキー自体を入力します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
テストランナー用のSSHキーを設定するのは少し時間がかかりそうなので、この問題を解決するために トークンを展開 を使用しました。
git clone http://<username>:<deploy_token>@gitlab.example.com/tanuki/awesome_project.git
展開トークンはプロジェクトごとにあり、読み取り専用です。
現在受け入れられている回答 は、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固有の要件が埋め込まれているため、他のすべてで無視されるため、気に入っています。
ssh-keyscan -H 'localgitlab.co.uk' >> ~gitlab_ci_runner/.ssh/known_hosts
で既知のホストにキーを追加することでこれを修正しました
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
それは魅力のように機能します!
最終的に 合理的な解決策 があるようです。
要するに、GitLab 8.12で必要なことは、.submodules
、 そしてその git submodule update --init
は単に動作します