Jenkins Publish Over SSh 管道参数化
Jenkins Publish Over SSh pipeline parameterized
我在 Jenkins 中使用 Publish over SSH 插件来部署从构建过程中创建的 jar 文件。我创建了一个这样的管道
node {
{
stage('Checkout') {
git([url: '.............', branch: 'myBranch', credentialsId: 'mycredentials'])
}
stage('Build') {
script{
sh 'chmod a+x mvnw'
sh './mvnw clean package'
}
}
stage('Deploy to Server'){
def pom = readMavenPom file: 'pom.xml'
script {
sshPublisher(publishers: [sshPublisherDesc(configName: 'server-instance1',
transfers: [sshTransfer(cleanRemote:true,
sourceFiles: "target/${env.PROJECT_NAME}-${pom.version}.jar",
removePrefix: "target",
remoteDirectory: "${env.PROJECT_NAME}",
execCommand: "mv ${env.PROJECT_NAME}/${env.PROJECT_NAME}-${pom.version}.jar ${env.PROJECT_NAME}/${env.PROJECT_NAME}.jar"),
sshTransfer(
execCommand: "/etc/init.d/${env.PROJECT_NAME} restart -Dspring.profiles.active=${PROFILE}"
)
])
])
}
}
}
}
这行得通。我在管理 Jenkins >> 配置系统 >> 通过 SSH 发布下配置了 SSH 服务器。
现在我想在多台服务器上部署。假设我通过名称 server-instance1、server-instance2 创建了多个 ssh 配置。如何使这个 Jenkins 作业参数化?我尝试选中复选框并选择一个选择参数。但我无法弄清楚如何使此下拉列表的值来自 SSH 服务器列表(而不是硬编码)
我尝试了这里提到的一些事情 (How to Control Parametrized publishing in Jenkins using Publish over SSH plugin's Label field)。不幸的是,none 篇文章讨论了从管道执行此操作。
非常感谢任何帮助。
如果您想动态地 select SSH 服务器名称,您可以使用 Extended Choice Parameter 插件,它允许您执行 groovy 代码来为参数创建选项。
在插件中,您可以使用以下代码获取值:
import jenkins.model.*
def publish_ssh = Jenkins.instance.getDescriptor("jenkins.plugins.publish_over_ssh.BapSshPublisherPlugin")
configurations = publish_ssh.getHostConfigurations() // get all server configurations
return configurations.collect { it.name } // return the list of all servers
要在您的管道中配置此参数,您可以对脚本化管道使用以下代码:
properties([
parameters([
extendedChoice(name: 'SERVER', type: 'PT_SINGLE_SELECT', description: 'Server for publishing', visibleItemCount: 10,
groovyScript: '''
import jenkins.model.*
def publish_ssh = Jenkins.instance.getDescriptor("jenkins.plugins.publish_over_ssh.BapSshPublisherPlugin")
return publish_ssh.getHostConfigurations() .collect { it.name }
''')
])
])
或声明式管道的以下代码:
pipeline {
agent any
parameters {
extendedChoice(name: 'SERVER', type: 'PT_SINGLE_SELECT', description: 'Server for publishing', visibleItemCount: 10,
groovyScript: '''
import jenkins.model.*
def publish_ssh = Jenkins.instance.getDescriptor("jenkins.plugins.publish_over_ssh.BapSshPublisherPlugin")
return publish_ssh.getHostConfigurations() .collect { it.name }
''')
}
...
}
定义参数后,只需在 sshPublisher
步骤中使用它即可:
sshPublisher(publishers: [sshPublisherDesc(configName: SERVER, transfers: ...
使用扩展选择参数时您可以拥有的另一个选项是将其配置为多Select而不是单Select,这样用户就可以select多个服务器,您可以使用 parallel 选项并行发布所有 selected 服务器。
我在 Jenkins 中使用 Publish over SSH 插件来部署从构建过程中创建的 jar 文件。我创建了一个这样的管道
node {
{
stage('Checkout') {
git([url: '.............', branch: 'myBranch', credentialsId: 'mycredentials'])
}
stage('Build') {
script{
sh 'chmod a+x mvnw'
sh './mvnw clean package'
}
}
stage('Deploy to Server'){
def pom = readMavenPom file: 'pom.xml'
script {
sshPublisher(publishers: [sshPublisherDesc(configName: 'server-instance1',
transfers: [sshTransfer(cleanRemote:true,
sourceFiles: "target/${env.PROJECT_NAME}-${pom.version}.jar",
removePrefix: "target",
remoteDirectory: "${env.PROJECT_NAME}",
execCommand: "mv ${env.PROJECT_NAME}/${env.PROJECT_NAME}-${pom.version}.jar ${env.PROJECT_NAME}/${env.PROJECT_NAME}.jar"),
sshTransfer(
execCommand: "/etc/init.d/${env.PROJECT_NAME} restart -Dspring.profiles.active=${PROFILE}"
)
])
])
}
}
}
}
这行得通。我在管理 Jenkins >> 配置系统 >> 通过 SSH 发布下配置了 SSH 服务器。
现在我想在多台服务器上部署。假设我通过名称 server-instance1、server-instance2 创建了多个 ssh 配置。如何使这个 Jenkins 作业参数化?我尝试选中复选框并选择一个选择参数。但我无法弄清楚如何使此下拉列表的值来自 SSH 服务器列表(而不是硬编码)
我尝试了这里提到的一些事情 (How to Control Parametrized publishing in Jenkins using Publish over SSH plugin's Label field)。不幸的是,none 篇文章讨论了从管道执行此操作。
非常感谢任何帮助。
如果您想动态地 select SSH 服务器名称,您可以使用 Extended Choice Parameter 插件,它允许您执行 groovy 代码来为参数创建选项。
在插件中,您可以使用以下代码获取值:
import jenkins.model.*
def publish_ssh = Jenkins.instance.getDescriptor("jenkins.plugins.publish_over_ssh.BapSshPublisherPlugin")
configurations = publish_ssh.getHostConfigurations() // get all server configurations
return configurations.collect { it.name } // return the list of all servers
要在您的管道中配置此参数,您可以对脚本化管道使用以下代码:
properties([
parameters([
extendedChoice(name: 'SERVER', type: 'PT_SINGLE_SELECT', description: 'Server for publishing', visibleItemCount: 10,
groovyScript: '''
import jenkins.model.*
def publish_ssh = Jenkins.instance.getDescriptor("jenkins.plugins.publish_over_ssh.BapSshPublisherPlugin")
return publish_ssh.getHostConfigurations() .collect { it.name }
''')
])
])
或声明式管道的以下代码:
pipeline {
agent any
parameters {
extendedChoice(name: 'SERVER', type: 'PT_SINGLE_SELECT', description: 'Server for publishing', visibleItemCount: 10,
groovyScript: '''
import jenkins.model.*
def publish_ssh = Jenkins.instance.getDescriptor("jenkins.plugins.publish_over_ssh.BapSshPublisherPlugin")
return publish_ssh.getHostConfigurations() .collect { it.name }
''')
}
...
}
定义参数后,只需在 sshPublisher
步骤中使用它即可:
sshPublisher(publishers: [sshPublisherDesc(configName: SERVER, transfers: ...
使用扩展选择参数时您可以拥有的另一个选项是将其配置为多Select而不是单Select,这样用户就可以select多个服务器,您可以使用 parallel 选项并行发布所有 selected 服务器。