「Jenkins Pipeline」- SSH @20210128


內容簡介

本文介紹在Jenkins Pipeline中,如何使用SSH命令,及相關的工具。

問題描述

在Jenkins Pipeline中,需要在遠程主機上執行命令。當然可以直接執行ssh(1)命令,但是這不夠Jenkins Pipeline啊,而且可移植性較差,並不是最佳實踐。

解決辦法

安裝插件:「SSH Pipeline Steps

然后,在Jenkins Pipeline中使用如下代碼:

def remote = [:]
remote.name = 'test'
remote.host = 'test.domain.com'
remote.user = 'root'
remote.password = 'password'
remote.allowAnyHosts = true

sshCommand remote: remote, command: "ls -lrt"

但安全性較低:因為密碼不應該直接進行編碼,而是應該是創建Credentials后,再使用代碼獲取。如下示例:

// 注意,我們這里跳過了創建Credentials的方法

// 在Jenkinsfile中
withCredentials([usernamePassword(credentialsId: "Your-Credentials-Id", usernameVariable: "username", passwordVariable: "password")]) {

	def remote = [:]
	remote.name = 'test'
	remote.host = 'test.domain.com'
	remote.user = username
	remote.password = password
	remote.allowAnyHosts = true

	sshCommand remote: remote, command: "ls -lrt"
}

// 在共享庫中有點不同
//「共享庫」與「Jenkinsfile」二者是有差別的。主要在於對變量的理解上。 由withCredentials生成
// 的變量是位於環境中的,所以要到env中獲取。
class Foo {

	Script pipeline // 在Jenkinsfile中,以new Foo(this)的形式實例化
	
	Foo(Script pipeline) {
		this.pipeline = pipeline
	}

	public void bar() {
		this.pipeline.withCredentials([usernamePassword(credentialsId: "Your-Credentials-Id", usernameVariable: "username", passwordVariable: "password")]) {

			def remote = [:]
			remote.name = 'test'
			remote.host = 'test.domain.com'
			remote.user = this.pipeline.env.username // 變量是注入到環境變量中的
			remote.password = this.pipeline.env.password // 變量是注入到環境變量中的
			remote.allowAnyHosts = true

			sshCommand remote: remote, command: "ls -lrt"
		}
	}
}

當然支持SSH私鑰訪問:

def remote = [:]
remote.name = "node-1"
remote.host = "10.000.000.153"
remote.allowAnyHosts = true

node {
    withCredentials([sshUserPrivateKey(credentialsId: 'sshUser', keyFileVariable: 'identity', passphraseVariable: '', usernameVariable: 'userName')]) {
        remote.user = userName
        remote.identityFile = identity
        
        stage("SSH Steps Rocks!") {
            writeFile file: 'abc.sh', text: 'ls'
            sshCommand remote: remote, command: 'for i in {1..5}; do echo -n \"Loop \$i \"; date ; sleep 1; done'
        }
    }
}

(注意,上一個示例中「Jenkinsfile」與「共享庫」的差別,這里不再展開)

相關鏈接

手冊:Pipeline Steps Reference/SSH Pipeline Steps
示例:GitHub/jenkinsci/ssh-steps-plugin

另外,還需要了解以下「Credentials Binding」插件,及對應的「Pipeline Steps Reference/Credentials Binding Plugin」手冊,該插件負責獲取Jenkins中配置的各種Credentials信息,以提高Pipeline的安全性及可移植性。

參考文獻

WikiNotes/SSH
Pipeline Steps Reference/SSH Pipeline Steps
SSH Steps for Jenkins Pipeline



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM