web-dev-qa-db-ja.com

JenkinsパイプラインでSSHを使用するにはどうすればよいですか?

NPMプロジェクトを構築するJenkins Pipeline Model Definitionを使用して、いくつかのJenkinsジョブを定義しています。私はDockerコンテナーを使用してこれらのプロジェクトを構築します(Node.js + npm + yarnだけで共通のイメージを使用)。

ビルドの結果は、Zipパイプラインコマンドを使用して圧縮したdist/フォルダーに含まれています。

SSH/SCP(秘密鍵認証を使用)を使用して、このZipファイルを別のサーバーにコピーします。私の秘密鍵はJenkins環境(資格情報マネージャー)に追加されますが、Dockerコンテナーを使用すると、SSH接続を確立できません。

agent { label 'master' }を追加してファイル転送にマスターJenkinsノードを使用しようとしましたが、新しいGitフェッチを使用して、ビルドファイルなしでクリーンなワークスペースを作成するようです。

SSHエージェントプラグインを試した後、次の出力があります。

Identity added: /srv/jenkins3/workspace/myjob-TFD@tmp/private_key_370451445598243031.key (rsa w/o comment)
[ssh-agent] Started.
[myjob-TFD] Running Shell script
+ scp -r dist test@myremotehost:/var/www/xxx
$ docker exec bfda17664965b14281eef8670b34f83e0ff60218b04cfa56ba3c0ab23d94d035 env SSH_AGENT_PID=1424 SSH_AUTH_SOCK=/tmp/ssh-k658r0O76Yqb/agent.1419 ssh-agent -k
unset SSH_AUTH_SOCK;
unset SSH_AGENT_PID;
echo Agent pid 1424 killed;
[ssh-agent] Stopped.
Host key verification failed.
lost connection

リモートホストを承認済みとして追加するにはどうすればよいですか?

8
lbar

同様の問題がありました。私はラベル「マスター」を使用しませんでしたが、このようにすると、ファイル転送がスレーブ間で機能することを確認しました:

手順1-リモートホストサーバーでSSHキーを作成し、authorized_keysにキーを含めます

手順2-JenkinsでSSHキーを使用して資格情報を作成し、リモートホストの秘密キーを使用します

以下のステップがパイプラインに追加されます。

stage ('Deploy') {
    steps{
        sshagent(credentials : ['use-the-id-from-credential-generated-by-jenkins']) {
            sh 'ssh -o StrictHostKeyChecking=no [email protected] uptime'
            sh 'ssh -v [email protected]'
            sh 'scp ./source/filename [email protected]:/remotehost/target'
        }
    }
}
14
user9948238

SSHエージェントプラグインを使用します。

このプラグインを使用する場合、グローバル資格情報を使用できます。

3
haschibaschi

既知のホストにリモートホストを追加し、できればエラーに対処するには、JenkinsユーザーとしてJenkinsホストからターゲットホストに手動でsshしてみてください。

Jenkinsがインストールされているホストにアクセスします。タイプ

Sudo su jenkins

今のようにsshまたはscpを使用してください

ssh username@server

次のようにプロンプ​​トが表示されます。

ホスト「サーバー(ip)」の信頼性を確立できません。 ECDSAキーフィンガープリントはSHA256:some-weird-stringです。接続を続行してもよろしいですか(はい/いいえ)?

Yesと入力します。サーバーは既知のホストとして永久に追加されます。パスワードをわざわざ渡すことすらしないでください。 Ctrl + C Jenkinsジョブを実行してみてください。

1
Patryk Wlaź

@haschibaschiが推奨しているように、ssh-agentプラグインも使用しています。リモートマシンにはUID Jenkinsアカウントがないため、リモートマシンで個人のUID資格情報を使用する必要があります。コードは次のようになります(たとえば、個人のUID = "myuid"とリモートサーバーhostname = "non_jenkins_svr"を使用します:

sshagent(['e4fbd939-914a-41ed-92d9-8eededfb9243']) {
    // 'myuid@' required for scp (this is from UID jenkins to UID myuid)
    sh "scp $WORKSPACE/example.txt myuid@non_jenkins_svr:${dest_dir}"
}

ID e4fbd939-914a-41ed-92d9-8eededfb9243は、グローバルドメイン資格情報エントリを作成した後にJenkins資格情報マネージャーによって生成されました。

資格情報エントリを作成すると、資格情報ページの「ID」列の下にIDが見つかります。エントリを作成する際に、タイプ「SSH Username with private key」(「Kind」フィールド)を選択し、この目的で作成したRSAプライベートキーをHost non_jenkins_svrパスフレーズなし。

0