使用jenkins的pipeline方式构建你的job

298 阅读3分钟

jenkins版本

2.445

为什么要使用pipeline方式

  • 你可以将你的构建分为若干步骤
  • 你可以看到每一步的执行时间与执行结果
  • 如果构建失败,你可以单独执行构建步骤的某一步
  • 你可以停止某个构建步骤

示例

要获取${env.BUILD_USER_ID}, ${env.BUILD_USER}这两个变量需要安装build user vars | Jenkins plugin插件,并在构建时启用用户变量,且不能使用管理员账号,只能使用普通账号,因为管理员账号不能设置账号名称,这个${env.BUILD_USER}变量是指账户名称,这个${env.BUILD_USER_ID}是指账号

image.png

image.png

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}"
            }
        }
    }
}

image.png

关于ssh -o StrictHostKeyChecking=no -iStrictHostKeyChecking=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流水线语法

Using a Jenkinsfile

通过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博客

jenkins pipeline构建后发送邮件通知 - 老头还我葵花宝典 - 博客园 (cnblogs.com)