web-dev-qa-db-ja.com

SSHリモートホストからJenkinsサーバーにファイルをコピーする方法

私たちは毎日のビルドプロセスにJenkinsサーバーを使用しており、SSHを介してリモートホストでいくつかのbashスクリプトを実行します。このスクリプトは、リモートホストでhtmlログファイルを生成しています。

スレーブにコピー プラグインを使用してスレーブマシン上のファイルをコピーし、 Publish over ssh プラグインを使用してビルドプロセスでSSHセッションを管理します。

ここで問題は、リモートsshホストからJenkinsサーバーにいくつかのファイル(スクリプトのログファイル)をコピーすることです。同じことが可能であり、より優れたオプションになります(プラグインの方が優れているでしょう)。

EDIT:

sshpassはオプションですが、プラグインまたは仕事をするためのより良い方法を探しています。

17
Not a bug

sshpass コマンドを使用してファイルを送信します

ビルド環境->リモートホストでsshを使用してシェルスクリプトを実行->ビルドスクリプトをポスト

コマンド例:

sshpass -p "password" scp path/of/file <new_server_ip>:/path/of/file

これにより、scpコマンドのパスワードプロンプトがスキップされ、scpにパスワードが提供されます。

9
Not a bug

Sshキーペアを生成して、たとえば Config File Provider Plugin のパラメータとしてスレーブに渡すことができると思います

次に、scpを使用して、認証プロセスにこのキーペアを使用してファイルを取得します。

2
ScayTrase

明らかに手遅れですが、すでに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)を取り除くと、頭痛の種を大幅に削減できます:)

理解するのにかなり時間がかかったので、次に来る人のためにこれを共有したいと思いました。

0
Blizz