jenkins版本
2.445
为什么要使用pipeline方式
- 你可以将你的构建分为若干步骤
- 你可以看到每一步的执行时间与执行结果
- 如果构建失败,你可以单独执行构建步骤的某一步
- 你可以停止某个构建步骤
示例
要获取${env.BUILD_USER_ID}, ${env.BUILD_USER}这两个变量需要安装build user vars | Jenkins plugin插件,并在构建时启用用户变量,且不能使用管理员账号,只能使用普通账号,因为管理员账号不能设置账号名称,这个${env.BUILD_USER}变量是指账户名称,这个${env.BUILD_USER_ID}是指账号
pipeline{
agent any
environment {
SSH_USER = 'root'
SSH_HOST = 'myalpine'
SSH_KEY = '/root/.ssh/id_ed25519' // Path to your private key file
}
stages{
stage("拉取代码"){
steps {
echo '拉取代码'
checkout scmGit(branches: [[name: '*/main']], extensions: [], userRemoteConfigs: [[credentialsId: 'git-pwd', url: 'http://192.168.31.200:5000/pan/node-01.git']])
}
}
stage('生成Changelog') {
steps {
echo 'Hello World'
script {
result = sh(script: "git log --pretty=format:'SHA-1:%h - 创建人:%an 时间:%ad 提交信息:%s' --date=format:'%y-%m-%d %H:%M:%S' -30", returnStdout: true).trim()
echo "最近30条提交记录: ${result}"
}
}
}
stage("安装依赖"){
steps {
sh 'pnpm install'
}
}
stage("上传打包结果"){
steps {
script {
sh 'echo job工作目录: $WORKSPACE'
sshagent(['myalpine']) {
sh 'scp $WORKSPACE/package.json root@myalpine:/root/workspace/'
}
}
}
}
stage("执行远程脚本"){
steps {
script {
sshagent(['myalpine']) {
sh """
ssh -o StrictHostKeyChecking=no -i ${SSH_KEY} ${SSH_USER}@${SSH_HOST} "
cd /root/workspace &&
chmod +x test.sh &&
./test.sh
"
"""
}
}
}
}
}
post{
always{
echo 'always say goodbay'
}
failure{
script {
result = sh(script: "git log --pretty=format:'SHA-1:%h - 创建人:%an 时间:%ad 提交信息:%s' --date=format:'%y-%m-%d %H:%M:%S' -30", returnStdout: true).trim()
mail to: 'sd4015700@126.com',
subject: "Jenkins任务 ${currentBuild.fullDisplayName} 构建失败",
body: " ${env.JOB_NAME} # ${env.BUILD_NUMBER}!\n 通过这个url地址 ${env.BUILD_URL} 检查控制台输出.\n最新30条git日志为:\n${result}"
}
}
success{
script {
result = sh(script: "git log --pretty=format:'SHA-1:%h - 创建人:%an 时间:%ad 提交信息:%s' --date=format:'%y-%m-%d %H:%M:%S' -30", returnStdout: true).trim()
mail to: 'sd4015700@126.com',
subject: "Jenkins任务 ${currentBuild.fullDisplayName} 构建成功",
body: " ${env.JOB_NAME} # ${env.BUILD_NUMBER}!\n 通过这个url地址 ${env.BUILD_URL} 查看构建信息.\n最新30条git日志为:\n${result}"
}
}
}
}
关于ssh -o StrictHostKeyChecking=no -i 中 StrictHostKeyChecking=no 的作用,详见这里: SSH交互式脚本StrictHostKeyChecking选项 benchmode=yes - konglingbin - 博客园 (cnblogs.com)
而如果你的密钥文件加密了,怎么让其自动化不被打断?
ssh -o StrictHostKeyChecking=no -i 命令行参数中,-i 参数用于指定私钥文件,而 -o StrictHostKeyChecking=no 则是为了跳过SSH首次连接时对远程主机公钥的严格检查。但是,这并不会直接处理密钥文件本身的密码验证。
如果私钥文件是加密的(即设置了passphrase口令),在使用 ssh 连接时,系统会提示输入该密钥的密码。然而,为了自动化过程中不出现交互式输入,可以通过ssh-agent缓存密钥: 使用 ssh-agent 工具来临时存储解密后的私钥,避免每次连接都手动输入密码:
eval "$(ssh-agent -s)"
ssh-add /path/to/private/key
执行上面的语句后,就会让你输入一次密钥文件的密码,输入这次之后,就不需要再输出了。也就能保证,再执行ssh相关命令时,不会被密钥文件的密码验证打断了。
eval "$(ssh-agent -s)" 是启动ssh-agent服务
ssh-add /path/to/private/key是将密钥文件加入ssh-agent
jenkins触发器
手把手教你使用 Jenkins 之 PipeLine 和触发器的使用_pipeline sricpt form scm-CSDN博客
Jenkins项目构建,常用的六种构建触发器(触发远程构建,其他工程构建后触发,定时触发,轮询SCM,参数化构建,Githook自动触发)_调用jenkins触发构建-CSDN博客
一看就会的Jenkins实现Git提交后自动化构建详解_jenkins构建是构建自己提交的部分吗-CSDN博客
jenkins流水线语法全局变量
http://localhost:8008/job/demo-pipeline/pipeline-syntax/globals
jenkins全局变量
http://localhost:8008/env-vars.html/
jenkins流水线语法
通过url地址操作jenkins
关闭: http://localhost:8080/exit
重启: http://localhost:8080/restart
重新加载配置信息: http://localhost:8080/reload
参考资料
手把手教你使用 Jenkins 之 PipeLine 和触发器的使用_pipeline sricpt form scm-CSDN博客
[3] Jenkins 系列:如何获取触发Jenkins Job的用户信息?_动态获取jenkins启动用户-CSDN博客