web-dev-qa-db-ja.com

Github Travis CIビルドでのgitサブモジュール更新のアクセス拒否(公開鍵)エラーを修正するにはどうすればよいですか?

エラーでgitサブモジュールを更新できません:

$ git submodule init
Submodule 'build/html' ([email protected]:quadroid/clonejs.git) registered for path 'build/html'
...
$ git submodule update
Cloning into 'build/html'...
Warning: Permanently added 'github.com,207.97.227.239' (RSA) to the list of known hosts.
Permission denied (publickey).
fatal: Could not read from remote repository.

しかし、ローカルで同じタスクを実行すると、すべてが大丈夫です。

Travis CIビルドがパスし、リポジトリ内のサブモジュールをクリックしてそこに直接アクセスできるように、これを修正するにはどうすればよいですか?

44
Quadroid

これは(ありがたいことに)Travisでオンザフライで.gitmodulesファイルを変更することで簡単に解決でき、サブモジュールを初期化する前にSSH URLがパブリックURLに置き換えられます。これを行うには、以下を.travis.ymlに追加します。

# Handle git submodules yourself
git:
    submodules: false
# Use sed to replace the SSH URL with the public URL, then initialize submodules
before_install:
    - sed -i 's/[email protected]:/https:\/\/github.com\//' .gitmodules
    - git submodule update --init --recursive

Gist を提供してくれたMichael Iedemaに感謝します。

サブモジュールがプライベートリポジトリである場合、https URLに認証情報を含めるように機能するはずです。この目的のために、制限された権限で GitHubアクセストークン を作成することをお勧めします。

# Replace <user> and <token> with your GitHub username and access token respectively
- sed -i 's/[email protected]:/https:\/\/<user>:<token>@github.com\//' .gitmodules
72
aknuds1

TravisとPullをローカルでプルできるようにするため、サブモジュールにはhttpsスキームを使用することをお勧めします:https://github.com/quadroid/clonejs.git

24
sarahhodne

Travisは、sshを使用したサブモジュールへのアクセスをサポートするようになりました。これは、最も簡単なソリューションです。 プライベート依存関係のドキュメント で説明されているように、sshキー(または専用CIユーザーのsshキー)を作成中のGithubプロジェクトに関連付けるだけです。

$ travis sshkey --upload ~/.ssh/id_rsa -r myorg/main

Travisでは、独自のsshキーを使用する必要がないように、専用のユーザーを作成することをお勧めしています。

13
emidander

このエラーは、ssh-urlsを介してサブモジュールを指定したために発生します。 travis-ci環境からsshアクセスするには、 キーの構成 を行う必要があります。

または、プロジェクトとサブモジュールはすべてGithubで利用できるため、gitサブモジュールに相対URLを使用することもできます。

GitはOriginに対して相対URLを解決します。

例:

.gitmodulesの最初の2つのエントリを使用:

[submodule "lib/es5-shim"]
        path = lib/es5-shim
        url = [email protected]:kriskowal/es5-shim.git
[submodule "build/html"]
        path = build/html
        url = [email protected]:quadroid/clonejs.git

相対URLに置き換え:

[submodule "lib/es5-shim"]
        path = lib/es5-shim
        url = ../../kriskowal/es5-shim.git
[submodule "build/html"]
        path = build/html
        url = ../clonejs.git

次に、複製するとき-たとえば-httpsを介してOriginは次のように設定されます。

$ git clone https://github.com/quadroid/clonejs.git
$ cd clonejs
$ git remote -v
Origin  https://github.com/quadroid/clonejs.git (fetch)
Origin  https://github.com/quadroid/clonejs.git (Push)

Ssh経由で複製する場合:

$ git clone [email protected]:quadroid/clonejs.git
$ cd clonejs
$ git remote -v                                
Origin  [email protected]:quadroid/clonejs.git (fetch)
Origin  [email protected]:quadroid/clonejs.git (Push)

相対URLでは、通常のサブモジュールシーケンスはOriginとは無関係に機能します。

$ git submodule init
$ git submodule update
6
maxschlepzig

gitを使用して.gitmodulesファイルを直接操作することもできます。 ( この答え に触発されました)。

git config --file=.gitmodules submodule.SUBMODULE_PATH.url https://github.com/ORG/REPO.git
0
loudmouth