创建一个pipeline项目,默认各个项目的工作目录workspace是/var/lib/jenkins/workspace/
,如果是配置SCM的项目,这个目录下会迁出各个项目的代码,发布时是从此目录读取文件进行同步,基本上是没有问题的,但是如果某些项目或文件,如vue的工程,并不在此目录下,也没使用SCM,不想直接在服务器打包,而是要直接同步,类似lsyncd/rsync的做法,这样直接读文件是读不到的,用什么办法自动同步文件呢?
网上有些讨论修改workspace目录的,但一般要么是全局配置,要么是比较复杂,其实只要在发布指令使用dir(){}
就行了,下面是完整的jenkinsfile例子
pipeline {
agent any
environment {
ZG_DEBUG = true
}
stages {
stage('Choose Project'){
steps {
script{
env.choose_path = input message:'请选择要同步的目录', parameters:[string(defaultValue: '', description: '请选择要同步的目录,如/projects/project1/', name: 'project', trim:true)]
}
}
}
stage('Source') {
steps {
echo 'Check dir and sources...'
echo "sync ${env.choose_path}"
}
}
stage('Build') {
steps {
echo 'Building...'
}
}
stage('Publish') {
steps {
echo 'Publish...'
dir("/your-target-project-root-dir/" ) {
sshPublisher(
failOnError: true,
publishers: [
sshPublisherDesc(
configName: 'test-server',
transfers: [sshTransfer(sourceFiles:"${env.choose_path}/**",remoteDirectory:'/tmp/',removePrefix:'')],
usePromotionTimestamp: false,
useWorkspaceInPromotion: false,
verbose: true
)
]
)
}
}
}
}
}
有几点说明
- 上面的代码实现了,同步前输入文件夹,即可以指定任意目录同步,本例未检测输入的文件是否存在(这个比较容易,读者可以自行解决)
- your-target-project-root-dir 即要同步的文件夹根目录,要同步的项目均在此目录下
- 本例中要同步的目标服务器配置名称是test-server,在jenkins ssh全局配置中设置,远程目录是/tmp