我只是从使用Jenkins声明性管道开始。当我支持一些类似的项目时,我正在考虑将类似的流程步骤(甚至阶段)放入可重用的构建块中。这些区块应维护在中央位置,然后由各个管道包含(例如:DRY)。
我将共享库视为脚本管道的一个选项,但是我不确定它是否也适用于声明性管道。
您知道在Jenkins声明性管道中使用诸如构建基块之类的方法吗?
示例以澄清:
如果您有用于Maven项目的标准管道(例如Spring Boot),则看起来像这样:
pipeline {
agent {
dockerfile true
}
stages {
stage('Build') {
steps {
sh 'mvn -U -DskipTests clean package'
}
}
stage('Test') {
parallel {
stage('Unit Tests') {
steps {
sh 'mvn test'
}
}
stage('Integration Tests') {
steps {
sh 'mvn integration-test'
}
}
}
}
stage('Deploy') {
steps {
sh 'mvn deploy'
}
}
}
}
但是,如果可以轻松处理以下用例,那么最好将其复制到所有项目中。
对于无需自定义的项目,最好将其用于示例,例如:
defaultMavenpipeline{}
其中defaultMavenpipeline
将被上述管道替换(我认为共享库可以实现)。
对于只需要自定义某些阶段的项目,这样的事情可能发生吗?
pipeline {
defaultDockerAgent{}
stages {
stage('Build') {
steps {
sh 'mvn -U -DskipTests clean package'
// ... customize some stuff ...
}
}
defaultTestStage{}
stage('Deploy') {
steps {
// ... customize some stuff ...
sh 'mvn deploy'
}
}
}
}
很抱歉,很长的帖子,非常感谢!
答案 0 :(得分:3)
您可以在Shared-Library中非常使用声明性管道。
请按照以下步骤操作:
1)创建一个共享库
vars
的目录。在vars
目录中,创建具有以下内容的文件sayHello.groovy:// vars/sayHello.groovy
def call(String name = 'human') {
// Any valid steps can be called from this code.
// Can be used in both scripted and declarative pipeline
echo "Hello, ${name}."
}
2)配置Jenkins以在任何管道作业中访问共享库
master
3)访问您项目中的共享库
Pipeline script
部分中,添加以下代码:@Library('my-shared-lib')_
pipeline {
agent any
stages {
stage('Info') {
steps {
echo 'Publishing some details here'
}
}
stage('Using shared-library') {
steps {
sayHello 'Alex'
}
}
}
}
就是这样。你完成了! :)
注意:对于上述Jenkinsfile中共享库中使用的下划线(_
,从official link开始,用于仅定义全局变量({{ 1}})或仅需要全局变量的Jenkinsfile,注释模式vars/
对于保持代码简洁可能很有用。本质上,不是对不必要的import语句进行注释,而是对符号@Library('my-shared-library') _
进行注释。
输出:
答案 1 :(得分:1)
您可以使用shared libraries。
我使用库中的vars部分定义模板(工作流程),使用src部分定义具有可重用方法的类,并且从jenkinsfile中,我仅调用模板,为模板提供特定于项目的参数映射。
这使我可以让开发人员仅通过克隆它们并更改jenkinsfile来创建自己的项目,而我仍然可以控制执行。
在jenkinsfile中:
@Library('jenkinssharedlibrary') _
templatename([
parameter1: "value",
parameter2: "value"])
在共享库中: vars / templatename.groovy
import com.mydomain.someclassivemade
def call(Map<String, String> passedConfig) {
Myclass niceobject = new Myclass()
pipeline {
agent {
label 'test'
}
environment {
PROJECT_VERSION = "${passedConfig.version}"
}
tools {
jdk '....'
}
stages {
steps {
script {
niceobject.compile(mvn)
}
}}
}
在src文件夹中,使用可重用的方法编写类: /src/com/mydomain/Someclassivemade.groovy
package com.mydomain.someclassivemade
def build (final String xyz){
sh("build comand with parameters")
}
return this // very important line :)
您可以用一种更简单的方法将方法放在vars中,然后从jenkinsfile中调用它们。詹金斯的力量在于灵活性。
另一个有用的link
PS:我可能在这里直接写过语法错误,请告诉我修复它们!