私たちは毎日のビルドプロセスにJenkinsサーバーを使用しており、SSHを介してリモートホストでいくつかのbashスクリプトを実行します。このスクリプトは、リモートホストでhtmlログファイルを生成しています。
スレーブにコピー プラグインを使用してスレーブマシン上のファイルをコピーし、 Publish over ssh プラグインを使用してビルドプロセスでSSHセッションを管理します。
ここで問題は、リモートsshホストからJenkinsサーバーにいくつかのファイル(スクリプトのログファイル)をコピーすることです。同じことが可能であり、より優れたオプションになります(プラグインの方が優れているでしょう)。
EDIT:
sshpassはオプションですが、プラグインまたは仕事をするためのより良い方法を探しています。
sshpass
コマンドを使用してファイルを送信します
ビルド環境->リモートホストでsshを使用してシェルスクリプトを実行->ビルドスクリプトをポスト
コマンド例:
sshpass -p "password" scp path/of/file <new_server_ip>:/path/of/file
これにより、scp
コマンドのパスワードプロンプトがスキップされ、scp
にパスワードが提供されます。
Sshキーペアを生成して、たとえば Config File Provider Plugin のパラメータとしてスレーブに渡すことができると思います
次に、scpを使用して、認証プロセスにこのキーペアを使用してファイルを取得します。
明らかに手遅れですが、すでにpublish-over-ssh
を使用している場合は、資格情報の重複を避け、共有ライブラリを用意したい場合は、このGroovyの一部を使用してホスト構成を取得できます。
import jenkins.plugins.publish_over_ssh.*
@NonCPS
def getSSHHost(name) {
def found = null
Jenkins.instance.getDescriptorByType(BapSshPublisherPlugin.Descriptor.class).each{
it.hostConfigurations.each{Host ->
if (Host.name == name) {
found = Host
}
}
}
found
}
前述のように、これにはグローバル共有ライブラリ(コードが信頼できるようにするため)または(おそらく)多数の管理者の承認が必要ですが、それは申し訳ありません。
BapSshHostConfiguration を返します。
パスワード接続の場合、次のことができます。
def sshHost = getSSHHost('Configuration Name')
def Host = [Host: sshHost.hostname, user: sshHost.username, password: sshHost.password]
sshHost = null
sh("""
set +x
sshpass -p "${Host.password}" scp -o StrictHostKeyChecking=no ${Host.user}@${Host.host}:filename.extension .
set -x
""")
これにより、ファイルがローカルの作業ディレクトリにコピーされます。おそらくこれまでで最高のコードではありませんが、私はグルーヴィーなスペシャリストではありません。それは機能し、それで十分です。 (set +x
は、ログにコマンドをエコーしてパスワードを表示しないようにするためのものです)。 CPS呼び出しを実行する前に非CPS(sshHost = null
)を取り除くと、頭痛の種を大幅に削減できます:)
理解するのにかなり時間がかかったので、次に来る人のためにこれを共有したいと思いました。