Pipeline 简而言之,就是一套运行于Jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排与可视化
Pipeline 支持两种语法
1、声明式(jenkins2.5新加入的语法)
特点:
1.最外层必须由pipline{ //do something }来进行包裹
2.不需要分好作为分隔符,每个语句必须在一行内
3.不能直接使用groovy语句(例如循环判断等),需要被script {}包裹
2、脚本式
特点:
1.最外层有node{}包裹
2.可直接使用groovy语句
第一步、创建流水线任务
第二步、编写Pipeline
1、我们需要从svn拉取代码
选择拉取代码的版本库然后点击自动生成脚本
将生成的脚本,写入执行脚本的第一个步骤
pipeline
{
agent any
environment
{
MAVEN_HOME = "/opt/apache-maven-3.6.3"
}
stages
{
stage('pull')
{
steps
{
echo 'pull.......'
checkout([$class: 'SubversionSCM', additionalCredentials: [], excludedCommitMessages: '', excludedRegions: '', excludedRevprop: '', excludedUsers: '', filterChangelog: false, ignoreDirPropChanges: false, includedRegions: '', locations: [[cancelProcessOnExternalsFail: true, credentialsId: '5e2fd655-fbb0-477a-8d84-82f2fc98f39d', depthOption: 'infinity', ignoreExternalsOption: true, local: '.', remote: 'svn://8.133.171.148/repo/demo']], quietOperation: true, workspaceUpdater: [$class: 'UpdateUpdater']])
}
}
}
}
2、编译打包代码
pipeline
{
agent any
environment
{
MAVEN_HOME = "/opt/apache-maven-3.6.3"
}
stages
{
stage('pull')
{
steps
{
echo 'pull.......'
checkout([$class: 'SubversionSCM', additionalCredentials: [], excludedCommitMessages: '', excludedRegions: '', excludedRevprop: '', excludedUsers: '', filterChangelog: false, ignoreDirPropChanges: false, includedRegions: '', locations: [[cancelProcessOnExternalsFail: true, credentialsId: '5e2fd655-fbb0-477a-8d84-82f2fc98f39d', depthOption: 'infinity', ignoreExternalsOption: true, local: '.', remote: 'svn://8.133.171.148/repo/demo']], quietOperation: true, workspaceUpdater: [$class: 'UpdateUpdater']])
}
}
stage('build')
{
steps
{
echo "build....."
sh "${MAVEN_HOME}/bin/mvn clean package -Dmaven.test.skip=true"
}
}
}
}
3、部署到服务器,和之前一样,我们选择上传服务器的操作,之后生成对应的脚本
第四步、我们在项目中创建一个名为Jenkinsfile的文件,写入脚本(所有步骤),并且在jenkins中选择引入方式为外部引入
pipeline
{
agent any
environment
{
MAVEN_HOME = "/opt/apache-maven-3.6.3"
}
stages
{
stage('pull')
{
steps
{
echo 'pull.......'
checkout([$class: 'SubversionSCM', additionalCredentials: [], excludedCommitMessages: '', excludedRegions: '', excludedRevprop: '', excludedUsers: '', filterChangelog: false, ignoreDirPropChanges: false, includedRegions: '', locations: [[cancelProcessOnExternalsFail: true, credentialsId: '5e2fd655-fbb0-477a-8d84-82f2fc98f39d', depthOption: 'infinity', ignoreExternalsOption: true, local: '.', remote: 'svn://8.133.171.148/repo/demo']], quietOperation: true, workspaceUpdater: [$class: 'UpdateUpdater']])
}
}
stage('build')
{
steps
{
echo "build....."
sh "${MAVEN_HOME}/bin/mvn clean package -Dmaven.test.skip=true"
}
}
stage('deploy')
{
steps
{
echo "deploy....."
sshPublisher(publishers: [sshPublisherDesc(configName: 'test-fuwuqi', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '/home/work', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'Dockerfile'), sshTransfer(cleanRemote: false, excludes: '', execCommand: '''#自定义的工作路径(Dockerfile存放的路径)
MY_WORK_PATH=/home/work
PROJECT_NAME=my-demo
CID=$(docker ps | grep "$PROJECT_NAME" | awk '{print $1}')
IID=$(docker images | grep "$PROJECT_NAME" | awk '{print $3}')
function delete(){
docker stop $CID
docker rm $CID
docker rmi $IID
}
function build(){
cd $MY_WORK_PATH
docker build -t $PROJECT_NAME .
}
function run(){
echo "构建最新代码"
transfer
delete
build
docker run --name $PROJECT_NAME -d -p 8000:8000 $PROJECT_NAME
echo "$PROJECT_NAME容器创建完成"
}
run''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '/home/work', remoteDirectorySDF: false, removePrefix: 'target/', sourceFiles: 'target/*.jar')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
}
}
}
}
第五步、构建项目
可以看到,与之前构建模式相比,pipeline这种构建模式可以看到你自定义的构建步骤
常见问题 :
1、Jenkins 编译JAVA报错:package javafx.util does not exist
Ubuntu下mvn编译java程序时报错,但开发环境没有错误
package javafx.util does not exist
查找代码发现使用了javafx类,该类仅存在OracleJDK中,OpenJDK中没有该类,就算安装了OpenJFX也无法解决
解决过程
1、Jenkins多版本JDK
- 配置Jenkins的多版本JDK:Dashboard->全局工具配置->JDK
- 选择JDK版本,选择自动安装
- 或选择服务器上,其他版本JDK路径
2、Pipeline指定JDK版本
成功编译