jenkins - 组织 Jenkins 库
问题描述
我们在管道开发中使用Jenkins 共享库。我们已经在其中编写了很多库,现在我们想更好地组织它。jenkins 共享库的 vars 文件夹中是否可以有文件夹结构?
解决方案
1)共享库项目文件夹结构:
如上图,你可以在文件夹中组织文件夹结构src
,就像组织java包一样。
然后将它们导入vars
我们声明全局变量的文件夹中。
2) 内容vars/acidReleaseProcess.groovy
:
#!groovy
import com.fmr.pipeline.AcidReleaseProcess
def relProcess
/**
* Create a instance of class: AcidReleaseProcess
*
* @param appName uDeploy Application Name
* @param compName uDeploy Component Name
* @param compVersion component version to deploy
* @return A self reference
*/
def call(appName, compName, compVersion) {
relProcess = new AcidReleaseProcess(this, appName, compName, compVersion)
return this
}
/**
* Execute Install, Go Live and Stop process on specify env
*
* @param envName name of environment to delpoy, exmaple: 'DIT', 'PAC', 'XQ1'
*/
def blueGreenDeploy(envName) {
relProcess.deployToPassive(envName)
relProcess.swapPassiveToActive(envName)
relProcess.stopPassive(envName)
}
3)com.fmr.pipeline.AcidReleaseProcess.groovy
class AcidReleaseProcess implements Serializable {
def script, appName, uDeployVers, passiveGroup = [:]
AcidReleaseProcess(script, appName, compName, compVersion) {
this.script = script
this.appName = appName
this.uDeployVers = compName + ":" + compVersion
}
def deployToPassive(envName) {
script.echo "Checking uDeploy environment ${envName} group state"
script.sh 'docker pull ...'
script.withCredentials([script.string(credentialsId: '<...>', variable: 'UDEPLOY_AUTH_TOKEN')]) {
def group1_state = script.sh(
returnStdout: true,
script: "docker run --rm -i ... \
-a ${appName} \
-e ${envName}-${group1} " + '-t ${UDEPLOY_AUTH_TOKEN}'
).trim()
def group2_state = script.sh(
returnStdout: true,
script: "docker run --rm -i ...y \
-a ${appName} \
-e ${envName}-${group2} " + '-t ${UDEPLOY_AUTH_TOKEN}'
).trim()
script.echo "${envName}-${group1} is ${group1_state}, ${envName}-${group2} is ${group2_state}"
if("${group1_state}" == "Live" && "${group2_state}" == "Live") {
script.echo "Environment: ${envName}, ${group1} and ${group2} both are Live," +
"only allow install on Non-Live environment"
script.sh 'exit 1'
}
def groupName = "${group1_state}" != "Live" ? group1 : group2
passiveGroup[envName] = groupName
}
def uDeployEnv = envName + '-' + passiveGroup[envName]
script.echo "Install on ${uDeployEnv}"
script.step([
$class : 'UCDeployPublisher',
siteName: 'pi_udeploy_srvpiudupload',
deploy : [
$class: 'com.urbancode.jenkins.plugins.ucdeploy.DeployHelper$DeployBlock',
deployApp: appName,
deployEnv: uDeployEnv,
deployProc: UDEPLOY_INSTALL_PROC_NAME,
deployVersions: uDeployVers,
deployOnlyChanged: false
]
])
}
}
4) 文件vars
夹中的文件内容尽量简单,将可复用或复杂的代码组织到文件src
夹下的类文件中。
5)一些提示:
将管道对象传递给 src 文件夹中的类
relProcess = new AcidReleaseProcess(this, appName, compName, compVersion) // this is the pipeline object
将管道对象存储在类构造函数中
AcidReleaseProcess(script, appName, compName, compVersion) { this.script = script // script here is the pipeline object
所有全局名称都需要以管道对象为前缀:
script
sh -> script.sh echo -> script.echo with... -> script.with... string -> script.string etc...
推荐阅读
- vb.net - 如何根据 DataTable 中的数据创建多个饼图 - VB.Net
- android - After updating implementation 'com.android.support:design:28.0.0' this item.setShiftingMode(false); has been removed
- matlab - How to use the trained network for prediction using new input
- string-formatting - Null Coalescing Operator in C# to operate on the non-null value
- laravel - Laravel nova - Attach multiple models from edit/create form with HasMany relationship
- c# - how to specifiy web api route
- cox-regression - MLR - cox 模型的重采样
- android - Android - 在后台停留后阻止活动重新启动
- ios - How to set a full screen size image as a launch screen in iOS?
- typescript - Typescript:如何对将函数映射转换为具有不同类型参数的类似函数的函数进行强类型化?