Jenkins运维之路(Jenkins流水线改造Day01)

62 阅读3分钟

公司之前所有项目的Pipeline都是在Jenkins里面,每次都需要到不同项目里面去修改和调试,项目少还好,一多起来真的让人头大,所以这次选择直接使用Jenkinsfile SCM的方式来将流水线集成到Git代码库当中,这样能够统一管理,也为后面使用sharelib做准备

这次我使用的是Gitee代码库来存放,后期准备在转移到内部的Gitlab上,操作上大同小异。

1. 目前公司流水线状态

image-20250909153646209

image-20250909153646209

2.创建运维Jenkins专用项目

创建运维专用代码库

代码库结构

├── Ansible
│ └── Readme.md
├── Jenkinsfile
│ ├── HelloWorld-Pipeline.jenkinsfile 这是docker项目的测试流水线(现在不用在意)
│ └── Readme.md
├── Readme.md
├── src
│ └── org
│ └── foo
│ └── Readme.md
└── vars
└── Readme.md

image-20250909153826061

image-20250909153826061

使用Vscode clone代码库,来进行编写,同时Vscode要安装 JenkinsFile Support 插件(可以高亮显示语法)

image-20250909154025654

image-20250909154025654

3.创建Dockerfile文件

创建Dockerfile的时候要和你的项目同名,这样能够方便后面的一些操作

image-20250909154409339

image-20250909154409339

将Pipeline script的内容转移到Jenkinsfile中

image-20250909154617727

image-20250909154617727

推送Jenkinsfile文件到代码库

image-20250909154755350

image-20250909154755350

image-20250909154814216

image-20250909154814216

image-20250909154843841

image-20250909154843841

4.将Jenkins项目连接使用代码库中的jenkinsfile

image-20250909155715452

image-20250909155715452

尝试构建

image-20250909155830855

image-20250909155830855

5.流水线改造

让我们先看下目前流水线,并标注出目前流水线中的问题。

def createVersion() {
    // 创建了一个方法createVersion()
    // 定义一个时间戳+构建ID作为版本号,为tag使用
    return new Date().format('yyyyMMddHHmmss') + "_${env.BUILD_ID}"
}
pipeline {
    agent { node { label "node47"}}
    tools {
        git 'Git'
        maven 'maven399'
        jdk 'jdk1701'
    }
    // 定义环境变量
    environment {
        GIT_REPO_URL = 'git@git.xxxxxx.git'
        //引用createVersion这个方法
        _tag = createVersion()
    }
    options {
        timeout(time: 10, unit: 'MINUTES')
        //这里我增加几个参数来优化一下
        // 不允许同时执行流水线
        disableConcurrentBuilds()
        // 构建时的时间信息
        timestamps()
    }
    parameters {
        // 这里的参数是在每次构建的过程中输入分支名称,这就不太科学了,这里我们改造成自动获取分支和tag名称
        //string(name: 'BRANCH_TAG', defaultValue: 'master', description: 'Enter the GF branch to checkout')
        gitParameter(
            name: 'BRANCH_TAG',
            type'PT_BRANCH_TAG',
            defaultValue: 'master',
            description: '请选择你要部署的分支或Tag',
            //branchFilter: '^(master|dev|test)$', // 只匹配 master、dev 和 test 分支
            //tagFilter: 'rel-.*', // 匹配所有以 rel- 开头的标签
            useRepository: 'git@git.xxxxxx.git', // 这里要使用完整的Git仓库地址
            quickFilterEnabled: true // 启用快速筛选
        )
        }
    stages {
        stage('Show info') {
            steps {
                script {
                    wrap([$class'BuildUser']) {
                        echo "Built by: ${env.BUILD_USER_ID}"
                        currentBuild.description = "Built by: ${env.BUILD_USER_ID}, Branch: ${env.BRANCH_TAG}"
                    }
                }
            }
        }
        stage('CleanWorkDir') {
            steps {
                // Clean before build
                cleanWs()
            }
        }
        stage('Checkout') {
            steps {
                script {
                //这里就不在用之前的Git方式了,改为checkout方式
                //git (credentialsId: "GF-Git", url: "${GIT_REPO_URL}", branch: "${BRANCH_TAG}")
                //这里引用的环境变量 GIT_REPO_URL
                checkout([$class'GitSCM', 
                        branches: [[name: params.BRANCH_TAG]], 
                        userRemoteConfigs: [[url: "${GIT_REPO_URL}", credentialsId: "GF-Git"]]])
                }
            }
        }
        stage('Build') {
            steps {
                echo "Building"
                sh 'java -version && mvn -v && ls -l'
                sh 'mvn clean package -Dmaven.test.skip=true'
            }
        }
        stage('PullProject') {
            steps {
                sh 'echo PullProject'
                sh 'ls target/build/'
                sh 'cd target/build/ && tar zcf easy-dis-im.tar.gz easy-dis-im.jar lib'
                sh 'ansible easydisim -m copy -a "src=target/build/easy-dis-im.tar.gz dest=/project/pre-release/easy-dis-im/ mode=777"'
            }
        }
        stage('Delpoy') {
            steps {
                sh 'echo Delpoy'
                script {
                    sh 'ssh root@xxxxxx 'cd /project/easy-dis-order && sh deploylib.sh''
                    sh 'ssh root@xxxxxx 'cd /project/easy-dis-order && sh deploylib.sh''
                }
            }
        }
    }
    post {
        always{
            script {
                println("流水线结束后,经常做的事情")
            }
        }
        success{
            script {
            // 检查用户选择的是分支还是标签
            if (params.BRANCH_TAG.startsWith("rel-")) {
                echo "选择的是标签,不打标签。"
                } else if (params.BRANCH_TAG == "master") {
                // 只有在 master 分支时打标签
                sh "git tag rel-${_tag}" // 打标签
                sh "git push origin rel-${_tag}" // 推送标签到远程
                echo "为分支 ${params.BRANCH_TAG} 打标签 rel-${_tag}。"
                } else {
                echo "当前分支 ${params.BRANCH_TAG} 不是 master,不打标签。"
                }
            }
            // 发送成功通知
            dingtalk (
                robot: 'BuildBoy',
                type:'MARKDOWN',
                title: "success: ${JOB_NAME}",
                text: [
                    "- 成功构建部署: ${JOB_NAME}项目!\n" +
                    "- 版本: ${BRANCH_TAG}\n" +
                    "- 标签: rel-${_tag}\n" + // 加入标签信息
                    "- 持续时间: ${currentBuild.durationString}\n" +
                    "- 任务: #${JOB_NAME}"
                ]
            )
        }
        failure{
            dingtalk (
                robot: 'BuildBoy',
                type:'MARKDOWN',
                title: "fail: ${JOB_NAME}",
                text: ["- 失败构建部署:${JOB_NAME}项目!\n- 版本:${BRANCH_TAG}\n- 持续时间:${currentBuild.durationString}\n- 任务:#${JOB_NAME}"]
            )
        }
        aborted{
            dingtalk (
            robot: 'BuildBoy',
            type:'MARKDOWN',
            title: "aborted: ${JOB_NAME}",
            text: ["- 流水线被取消:${JOB_NAME}项目!\n- 版本:${BRANCH_TAG}\n- 持续时间:${currentBuild.durationString}\n- 任务:${JOB_NAME}"]
        )
        }
    }
}

欢迎大家入群一起讨论运维技术

欢迎大家入群一起讨论运维技术