基于 Jenkins 的企业级 CI/CD 流水线实战:Dev 分支监听 → 秒级构建 → 安全推送服务器 → 邮件通知》

基于Jenkins的CI/CD流水线实战操作

1、前言

在实际开发中,有时候我们可能需要监测 git 仓库的某个分支,如若这个分支发生了提交,然后就要 拉取代码、构建、发送到服务器、发送钉钉通知、发送邮件等操作,这个时候就需要用到 Jenkins流水线任务了。

Jenkins任务一共五个类型,最开始的文章使用的是 【构建一个自由风格的软件项目】,这篇文章使用的是 【流水线】

2、操作步骤

2.1 Jenkins任务的创建与配置

1、点击新建任务
在这里插入图片描述


2、输入一个任务名称,然后选择 流水线
在这里插入图片描述


3、处理一系列配置
在这里插入图片描述

触发器:选择这个 gitee webhook 触发构建

在这里插入图片描述

但是在实际开发中,不需要这样,一般都是指定分支,比如,我们现在使用的是 dev 分支

一般来说,开发环境、测试环境、生产环境,前端界面对应的服务器路径肯定不是一个,所以这样一般监听一个分支就够了,每个环境都创建一个单独的流水线任务比较好,如若三个环境用一个,那么就得在流水线代码里面区分当前是那个分支

在这里插入图片描述

下面有一个 【Gitee WebHook 密码】,点击后面的生成
点击生成以后,需要去gitee 上,第一大步骤创建的仓库中去配置以下

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

配置完成后,点击【添加


流水线这里,是有两种方式的
1、使用 【Pipeline script】,可以直接再下面这个框里面写脚本,这样别人就不会看到了
2、使用【Pipeline script from SCM】,会弹出一个脚本路径 输入框,如若选择这个,那就是要再前端项目的根目录下创建一个 Jenkinsfile,支持重命名,也支持自定义路径,但是一般默认就好

在这里插入图片描述

具体的代码见下一个章节

2.2 Pipeline script

  • 在安装Jenkins的时候,要选择 推荐的插件,具体可以看这个文章 jenkins 安装教程,SSH 配置也在这个文章里面,可以先看看这个,不然 打包后的文件有可能无法发送到服务器上
  • 必须要安装 SSH、配置完成SSH,不然打包以后的文件,无法发送到服务器上
  • 如若想要打包完成后或者其他情况,给某些人发送邮件需要这个插件Email Extension Plugin,在Jenkins第一次推荐安装中,也有这个, 具体的这个插件配置可以看这个文章 《Jenkins邮件通知终极指南:Email Extension Plugin高级配置》

SSH 有一点需要注意

在这里插入图片描述


SSH:SSH(Secure Shell)是一种 加密的网络协议,主要用于 安全地远程访问管理服务器,以及 安全地传输文件

pipeline {
    agent any
    options {
        timestamps()  // 为整个 Pipeline 的所有步骤添加时间戳
    }
    tools {
        nodejs 'v22.14.0'  // 与全局配置中的 Name 一致
    }
    stages {
        stage('拉取代码') {
            steps {
            	// ‘checkout scm’ is only available when using “多分支流水线” or “Pipeline script from SCM” ,checkout scm这个命令适用于 多分枝流水线任务 或者  Pipeline script from SCM ,多分枝流水线任务可以另一个文章,在最后有参考链接
                // checkout scm  // 拉取代码 
                git branch: 'dev', url: 'https://gitee.com/换成你自己的'
                sh 'ls -al'  // 检查代码是否拉取成功
            }
        }
        stage('初始化') {
            steps {
                echo "初始化:git本次提交的hash ${env.GIT_COMMIT}"
                echo "初始化:本次构建ID ${env.BUILD_ID}"
                echo "初始化:本次构建名称 ${env.JOB_NAME}"
                echo "初始化:本次构建URL ${env.BUILD_URL}"
                script {
                    def nodeVersion = sh(script: 'node --version', returnStdout: true).trim()
                    echo "初始化:node版本号: ${nodeVersion}"
                    def nodeRegistryUrl = sh(script: 'npm config get registry', returnStdout: true).trim()
                    echo "初始化:node下载源: ${nodeRegistryUrl}"
                    echo "初始化:当前git分支: ${env.BRANCH_NAME}"
                }
            }
        }
        stage('安装依赖') {
            steps {
                echo "安装依赖:开始安装依赖"
                sh 'npm i'
                sh 'npm run build'
            }
        }
        stage('构建') {
            steps {
                echo "构建:开始构建"
                sh 'npm run build'
            }
        }
        stage('发送到服务器') {
            steps {
                script {
                    // 使用 Publish Over SSH 插件传输文件
                    sshPublisher(
                        publishers: [
                            sshPublisherDesc(
                                configName: "呆呆狗",
                                transfers: [
                                    sshTransfer(
                                        sourceFiles: 'dist/**',  // 前端打包后的目录
                                        removePrefix: 'dist',    // 移除 dist 前缀
                                        remoteDirectory: "project/jenkinsPipelineTest/",
                                        execCommand: """
                                            
                                        """
                                    )
                                ]
                            )
                        ]
                    )
                }
            }
        }
    }
    post {
        always {
            script {
                // 计算构建耗时(秒)
                def durationSec = (currentBuild.duration / 1000).toInteger()
                // 格式化时间
                def timeFormat = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
                def startTime = timeFormat.format(new Date(currentBuild.startTimeInMillis))
    
                emailext(
                    subject: "构建通知: ${env.JOB_NAME} - ${currentBuild.result}",
                    body: """
                        <h2>构建详情</h2>
                        <p><b>项目:</b> ${env.JOB_NAME}</p>
                        <p><b>状态:</b> ${currentBuild.result ?: 'SUCCESS'}</p>
                        <p><b>分支:</b> ${env.GIT_BRANCH}</p>
                        <p><b>开始时间:</b> ${startTime}</p>
                        <p><b>构建耗时:</b> ${durationSec}</p>
                        <p><b>日志链接:</b> <a href="${env.BUILD_URL}console">点击查看</a></p>
                    """,
                    to: '换成需要接收邮件的邮箱,多个邮箱的话,逗号分隔',
                    attachLog: true,
                    mimeType: 'text/html'
                )
            }
        }
    }
}

弄完以后点击保存,这个时候可以选择立即构建
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这样就是i成功了。可以自己 push 代码了,然后Jenkins就会检测到,自动构建打包

参考链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值