Jenkins Pipeline使用File parameter,將文件通過publish over cifs上傳到Windows Share.
Jenkins Pipeline直接使用File parameter,無法將文件上傳到當前job的workspace下面,需要通過調用第三方jenkinsci-unstashParam-library庫實現,方法如下:
1.訪問 https://github.com/janvrany/jenkinsci-unstashParam-library ,下載zip壓縮包,然后將其拷貝到Jenkins本機目錄 /datafile/Jenkins2Library/jenkinsci-unstashParam-library,如下圖:
2.Jenkins - 系統配置 - Global Pipeline Libraries,新增Library,但由於Jenkins設計,需要從遠程git或scm拉去庫,所以需要初始化本地 git 存儲庫並將其用作SCM來實現需求,而不需要任何遠程主機git remote service,
如下圖所示
參考:https://www.jianshu.com/p/e1630651c95c
3.cd /datafile/Jenkins2Library/jenkinsci-unstashParam-library,然后 init a git repo 初始化git
git init git add . git commit -m "init"
4.檢查git init 是否生效:
git status
/usr/bin/git ls-remote -h /datafile/Jenkins2Library/jenkinsci-unstashParam-library #在遠程存儲庫中列出引用
以上完成后,在PipeLine中引用jenkinsci-unstashParam-library庫即可,如下:
//引用jenkinsci-unstashParam-library library "jenkinsci-unstashParam-library" def file_upload pipeline{ agent any stages{ stage("cifspub"){ steps { script{ file_upload = unstashParam "myFileParam" sh "pwd ${file_upload}" println "curr file is: ${file_upload}" } //上傳文件到Windows cifs share cifsPublisher(publishers: [[ configName: 'CifsShare_10.10.3.21', //cifs share name transfers: [[cleanRemote: false, excludes: '', flatten: false, makeEmptyDirs: true, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: "$JOB_NAME/$BUILD_ID", //remote directory remoteDirectorySDF: false, removePrefix: '', sourceFiles: "${file_upload}" ]], //file parameter usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: true]] ) } } } }
########################################################################################################
文件上傳成功后,移動到
#!groovy def call(fileparam_name,fileparam,filetype,cifsname){ //調用jenkinsci-unstashParam-library庫上傳文件 library "jenkinsci-unstashParam-library" if(fileparam != ''){ uploadfilesplit = fileparam.split('\\.') as List }else{ println "\033[31m 還未上傳文件,任務已終止。 \033[0m" return } if(uploadfilesplit[1] == filetype){ file_upload = unstashParam fileparam_name //file_upload = unstashParam "上傳文件" //sh "pwd ${file_upload}" fileupload_remotepath = "$JOB_NAME/$BUILD_ID/${file_upload}" file_content=new File("$WORKSPACE/${file_upload}").readLines() file_size = file_content.size()-1 //拷貝文件到Windows cifs share cifsPublisher(publishers: [[ configName: cifsname, transfers: [[cleanRemote: false, excludes: '', flatten: false, makeEmptyDirs: true, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: "$JOB_NAME/$BUILD_ID", remoteDirectorySDF: false, removePrefix: '', sourceFiles: "${file_upload}" ]], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: true]] ) //將上傳的文件移動到build_id目錄下 sh """ set +x mkdir $WORKSPACE/$BUILD_ID mv ${file_upload} $WORKSPACE/$BUILD_ID/ find $WORKSPACE/ -type f -mtime +15 -exec rm -f {} \\; set -x """ }else{ println "\033[31m 上傳文件不是 $filetype 格式,任務已終止。 \033[0m" //skipRemainingStages = true //currentBuild.result = 'ABORTED' //return } }
將如下文件保存到/data/Jenkins2Library/SharedLibrary下,命名為UploadFile.groovy
#!groovy def call(fileparam_name,fileparam,filetype,cifsname){ //調用jenkinsci-unstashParam-library庫上傳文件 library "jenkinsci-unstashParam-library" if(fileparam != ''){ uploadfilesplit = fileparam.split('\\.') as List }else{ println "\033[31m 還未上傳文件,任務已終止。 \033[0m" return } if(uploadfilesplit[1] == filetype){ file_upload = unstashParam fileparam_name //file_upload = unstashParam "上傳文件" //sh "pwd ${file_upload}" fileupload_remotepath = "$JOB_NAME/$BUILD_ID/${file_upload}" file_content=new File("$WORKSPACE/${file_upload}").readLines() file_size = file_content.size()-1 //拷貝文件到Windows cifs share cifsPublisher(publishers: [[ configName: cifsname, transfers: [[cleanRemote: false, excludes: '', flatten: false, makeEmptyDirs: true, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: "$JOB_NAME/$BUILD_ID", remoteDirectorySDF: false, removePrefix: '', sourceFiles: "${file_upload}" ]], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: true]] ) //將上傳的文件移動到build_id目錄下 sh """ set +x mkdir $WORKSPACE/$BUILD_ID mv ${file_upload} $WORKSPACE/$BUILD_ID/ find $WORKSPACE/ -type f -mtime +15 -exec rm -f {} \\; set -x """ }else{ println "\033[31m 上傳文件不是 $filetype 格式,任務已終止。 \033[0m" //skipRemainingStages = true //currentBuild.result = 'ABORTED' //return } }
在pipeline中通過ShareLibrary調用:
library "SharedLibrary"
UploadFile("上傳文件",上傳文件,"csv","CifsShare_10.10.4.25")