当前位置:

首页 > 系统应用 > 运维|devops|JenkinsPipeline流程构建

运维|devops|JenkinsPipeline流程构建

本文目录

    运维|devops|Jenkins Pipeline流程构建基于 jenkins Version 2.541.3 实操案例Jenkins Pipeline基于 Groovy 的持续交付流水线代码(Pipeline as Code)Pipeline script vs Pipeline script

    运维|devops|Jenkins Pipeline流程构建

    基于 jenkins Version 2.541.3 实操案例

    Jenkins Pipeline

    基于 Groovy 的持续交付流水线代码(Pipeline as Code)

    Pipeline script vs Pipeline script from SCM(实操)

    • Pipeline script

      流水线代码直接粘贴在 Jenkins 任务页面文本框内,存储在 Jenkins 任务配置数据库中,不关联 Git 仓库
    • Pipeline script from SCM

      流水线代码(Jenkinsfile)存放在代码仓库 (Git/SVN),Jenkins 运行流水线时先拉取代码,读取仓库内的 Jenkinsfile 执行

    Jenkinsfile 脚本内容的语法格式如下两种

    • Declarative Pipeline(声明式-实操)这套写法,语法更严格,结构也更清晰,读起来一目了然,放到绝大多数项目里都很合适。

      pipeline {
      agent any
      stages {
      stage('构建') {
      steps {
      echo "hello"
      }
      }
      }
      }
    • Scripted Pipeline(脚本式):基于原生 Groovy 编写,自由度很高,尤其适合处理复杂逻辑。

      node {
      stage('构建') {
      echo "hello"
      }
      }

    前置条件

    git、ssh、jdk、ma ven 等配置

    服务器端开启ssh登录

    • 生成密钥

      ssh-keygen -t rsa -b 4096
    • 将公钥添加到本机的 authorized_keys

      cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
    • 配置 SSH 服务(/etc/ssh/sshd_config)

      PubkeyAuthentication yes
      PasswordAuthentication yes
    • 重启 SSH 服务

      sudo systemctl reload sshd
    • 将私钥拷贝到Jenkins全局令牌凭证中

    Jenkinsfile文件和脚本创建

    Jenkinsfile位置放入项目pom同级别
    • 位置参照

      Core(仓库根目录|父pom)
      ├─ pom.xml 聚合父工程
      ├─ common-core 公共依赖模块(无需Jenkinsfile)
      │ └─ pom.xml
      ├─ Core.Api 业务子模块
      │ ├─ pom.xml
      │ └─ Jenkinsfile 当前模块流水线文件
    • Groovy构建脚本(Jenkinsfile)

      pipeline {
      agent any

      options {
      disableConcurrentBuilds()
      timeout(time: 20, unit: 'MINUTES')
      timestamps()
      buildDiscarder(logRotator(numToKeepStr: '10'))
      }

      parameters {
      booleanParam(
      name: 'AUTO_DEPLOY',
      defaultValue: false,
      description: '构建完成自动推送Jar并重启远程服务'
      )
      }

      environment {
      SERVICE_DIR = 'app'
      SERVICE_NAME = 'app'
      JAR_VERSION = '1.0.0-SNAPSHOT'
      JAR_FILE = "${SERVICE_NAME}-${JAR_VERSION}.jar"
      REMOTE_SUB_DIR = "${SERVICE_NAME}"
      REMOTE_FULL_DIR = "/usr/local/${REMOTE_SUB_DIR}"
      LOCAL_JAR_PATH = "${SERVICE_DIR}/target/${JAR_FILE}"
      JA VA_HOME = '/usr/local/jdk21'
      M2_HOME = '/usr/local/ma ven'
      // SSH 配置
      REMOTE_HOST = '192.168.0.66'
      REMOTE_USER = 'test'
      SSH_CREDENTIALS_ID = 'test'
      }

      stages {
      stage('1. 环境信息打印') {
      steps {
      echo "【构建信息】服务名:${env.SERVICE_NAME}|Jar包:${env.JAR_FILE}"
      echo "本地路径:${env.LOCAL_JAR_PATH}"
      echo "远端目录:${env.REMOTE_FULL_DIR}"
      }
      }

      stage('2. Ma ven编译打包') {
      steps {
      sh '''
      test -d ${JA VA_HOME} || { echo " JA VA_HOME目录不存在"; exit 1; }
      test -d ${M2_HOME} || { echo " M2_HOME目录不存在"; exit 1; }
      ${JA VA_HOME}/bin/ja va -version
      ${M2_HOME}/bin/mvn -v
      cd ${SERVICE_DIR}
      ${M2_HOME}/bin/mvn clean package -DskipTests
      '''
      }
      }

      stage('3. 归档构建产物') {
      steps {
      archiveArtifacts artifacts: "${env.LOCAL_JAR_PATH}", fingerprint: true, onlyIfSuccessful: true
      }
      }

      stage('4. 远程发布部署') {
      when {
      expression { params.AUTO_DEPLOY }
      }
      steps {
      echo "开始推送Jar包并远程重启服务"

      withCredentials([sshUserPrivateKey(
      credentialsId: "${env.SSH_CREDENTIALS_ID}",
      keyFileVariable: 'SSH_KEY',
      usernameVariable: 'SSH_USER'
      )]) {
      sh """
      set -e -x
      # 传输 JAR
      scp -i $SSH_KEY -o StrictHostKeyChecking=no ${LOCAL_JAR_PATH} ${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_FULL_DIR}/${JAR_FILE}

      # 远程执行部署【修复pgrep匹配BUG】
      ssh -i $SSH_KEY -o StrictHostKeyChecking=no ${REMOTE_USER}@${REMOTE_HOST} << 'EOF'
      export JA VA_HOME=/usr/local/jdk-21.0.11
      SERVICE_NAME=${SERVICE_NAME}
      REMOTE_FULL_DIR=${REMOTE_FULL_DIR}
      JAR_FILE=${JAR_FILE}

      mkdir -p ${REMOTE_FULL_DIR}
      cd ${REMOTE_FULL_DIR}

      # 根据服务名杀死进程,不再写死jar名称
      pkill -f "${SERVICE_NAME}" || true
      sleep 1

      # 后台启动服务
      nohup ${JA VA_HOME}/bin/ja va -jar ${JAR_FILE} > app.log 2>&1 &
      sleep 3

      # 校验进程:匹配服务名称,不再匹配jar短文件名
      if pgrep -f "${SERVICE_NAME}" > /dev/null; then
      echo " 服务启动成功"
      else
      echo " 服务启动失败,打印最近日志"
      [ -f app.log ] && tail -15 app.log || echo "app.log 文件尚未生成"
      exit 1
      fi
      EOF
      """
      }

      echo "远程部署流程执行完毕"
      }
      }
      }

      post {
      always {
      echo "【Post钩子】流水线构建结束"
      }
      success {
      cleanWs()
      echo " 流水线全部执行成功!"
      }
      failure {
      echo " 流水线执行失败,请查看日志排查问题!"
      }
      }
      }

    创建Pipeline任务

    构建相关pipeline

    • 脚本指向路径

    执行构建结果

    优化脚本

    增加git 打印、和后台应用日志
    pipeline {
    agent any

    options {
    disableConcurrentBuilds()
    timeout(time: 20, unit: 'MINUTES')
    timestamps()
    buildDiscarder(logRotator(numToKeepStr: '10'))
    }

    parameters {
    booleanParam(
    name: 'AUTO_DEPLOY',
    defaultValue: false,
    description: '构建完成自动推送Jar并重启远程服务'
    )
    }

    environment {
    SERVICE_DIR = 'app'
    SERVICE_NAME = 'app'
    JAR_VERSION = '1.0.0-SNAPSHOT'
    JAR_FILE = "${SERVICE_NAME}-${JAR_VERSION}.jar"
    REMOTE_SUB_DIR = "${SERVICE_NAME}"
    REMOTE_FULL_DIR = "/usr/local/${REMOTE_SUB_DIR}"
    LOCAL_JAR_PATH = "${SERVICE_DIR}/target/${JAR_FILE}"
    JA VA_HOME = '/usr/local/jdk21'
    M2_HOME = '/usr/local/ma ven'
    REMOTE_HOST = '192.168.0.66'
    REMOTE_USER = 'test'
    SSH_CREDENTIALS_ID = 'test'
    }

    stages {
    stage('1. 环境信息 & Git提交日志打印') {
    steps {
    sh '''#!/bin/bash
    echo "==================== Git 最新提交信息 ===================="
    echo "短提交号: $(git rev-parse --short HEAD)"
    echo "完整commit: $(git rev-parse HEAD)"
    echo "提交人姓名: $(git log -1 --pretty=%an)"
    echo "提交备注:"
    git log -1 --pretty=%B
    echo "=========================================================="
    '''

    echo "【构建信息】服务名:${env.SERVICE_NAME}|Jar包:${env.JAR_FILE}"
    echo "本地路径:${env.LOCAL_JAR_PATH}"
    echo "远端目录:${env.REMOTE_FULL_DIR}"
    }
    }

    stage('2. Ma ven编译打包') {
    steps {
    sh '''#!/bin/bash
    test -d ${JA VA_HOME} || { echo " JA VA_HOME目录不存在"; exit 1; }
    test -d ${M2_HOME} || { echo " M2_HOME目录不存在"; exit 1; }
    ${JA VA_HOME}/bin/ja va -version
    ${M2_HOME}/bin/mvn -v
    cd ${SERVICE_DIR}
    ${M2_HOME}/bin/mvn clean package -DskipTests
    '''
    }
    }

    stage('3. 归档构建产物') {
    steps {
    archiveArtifacts artifacts: "${env.LOCAL_JAR_PATH}", fingerprint: true, onlyIfSuccessful: true
    }
    }

    stage('4. 远程发布部署') {
    when {
    expression { params.AUTO_DEPLOY }
    }
    steps {
    echo "开始推送Jar包并远程重启服务"

    withCredentials([sshUserPrivateKey(
    credentialsId: "${env.SSH_CREDENTIALS_ID}",
    keyFileVariable: 'SSH_KEY',
    usernameVariable: 'SSH_USER'
    )]) {
    // ===== 使用三双引号 """ 允许Groovy解析Jenkins环境变量 =====
    sh """#!/bin/bash
    set -e -x
    scp -i $SSH_KEY -o StrictHostKeyChecking=no ${LOCAL_JAR_PATH} ${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_FULL_DIR}/${JAR_FILE}

    ssh -i $SSH_KEY -o StrictHostKeyChecking=no ${REMOTE_USER}@${REMOTE_HOST} << EOF
    SERVICE_NAME=${SERVICE_NAME}
    REMOTE_FULL_DIR=${REMOTE_FULL_DIR}
    JAR_FILE=${JAR_FILE}

    mkdir -p ${REMOTE_FULL_DIR}
    cd ${REMOTE_FULL_DIR}

    echo "【1】优雅停止旧服务进程"
    pgrep -f "ja va.*${SERVICE_NAME}" | xargs kill -15 2>/dev/null || true
    sleep 2
    pgrep -f "ja va.*${SERVICE_NAME}" | xargs kill -9 2>/dev/null || true
    sleep 1

    echo "【2】启动新服务 >> 追加日志,不再清空日志文件"
    # 远端服务器JA VA路径【硬编码】,彻底避开变量冲突大坑
    nohup /usr/local/jdk-21.0.11/bin/ja va -Dfile.encoding=UTF-8 -jar ${JAR_FILE} >> app.log 2>&1 &
    sleep 3

    echo "========== 远端应用启动日志(尾部30行) =========="
    [ -f app.log ] && tail -30 app.log || echo "app.log 文件尚未生成"
    echo "===================================================="

    echo "【3】校验进程状态"
    if pgrep -f "ja va.*${SERVICE_NAME}" > /dev/null; then
    echo " 服务进程启动成功"
    else
    echo " 服务启动失败!"
    exit 1
    fi
    EOF
    """
    }

    echo "远程部署流程执行完毕"
    }
    }
    }

    post {
    always {
    echo "【Post钩子】流水线构建结束"
    }
    success {
    cleanWs()
    echo " 流水线全部执行成功!"
    }
    failure {
    echo " 流水线执行失败,请查看日志排查问题!"
    }
    }
    }

    优化脚本之后


    本文内容来源于网友投稿,如有侵权请联系删除。
    作者最新文章
    系统应用 jenkins
    相关文章 更多
    docker容器自动重启怎么解决 排查原因与修复方法
    docker容器自动重启怎么解决 排查原因与修复方法

    遇到Docker容器频繁自动重启?本文提供从查看容器日志、解读退出代码到配置Restart Policy的完整排查与修复方案,确保服务稳定性。

    Linux设置静态路由命令与永久生效教程
    Linux设置静态路由命令与永久生效教程

    学习如何在Linux中使用命令行添加临时静态路由,并通过修改网络配置文件实现重启后依然有效的永久静态路由设置,涵盖CentOS和Ubuntu的不同配置方法。

    摄像头连接电脑后怎么打开查看实时画面教程
    摄像头连接电脑后怎么打开查看实时画面教程

    摄像头连接电脑后不知如何查看画面?本教程演示如何使用Windows自带的“相机”应用快速调取实时视频流,无需下载额外软件,步骤简单直观,适用于大多数USB及内置摄像头。

    jenkins配置git仓库步骤与凭证设置教程
    jenkins配置git仓库步骤与凭证设置教程

    遇到Jenkins拉取代码报错?本教程手把手教你配置Git仓库地址,正确添加SSH或HTTP凭证,并演示在自由风格项目和Pipeline中如何调用,彻底解决权限验证难题。

    如何在 windows 11 关闭自动关机
    如何在 windows 11 关闭自动关机

    针对 Windows 11 电脑在无人操作时自动关机或重启的问题,本文详解如何通过任务计划程序禁用更新重启任务,并调整电源睡眠策略,从根源解决非预期的自动关机现象。

    jenkins构建失败怎么查看原因及日志排查教程
    jenkins构建失败怎么查看原因及日志排查教程

    面对Jenkins构建失败,通过解析控制台输出、检查系统日志和验证节点状态,快速区分代码逻辑错误与环境配置问题,提供高效的故障排查思路。

    电脑摄像头怎么测试人脸识别功能及效果判断方法
    电脑摄像头怎么测试人脸识别功能及效果判断方法

    详细讲解在Windows电脑上测试摄像头人脸识别功能的步骤,包括开启Windows Hello、录入面部数据、不同环境下的效果验证及常见问题排查,帮助用户确认设备兼容性与识别准确率。

    docker 容器无法启动的配置检查命令及排查方法
    docker 容器无法启动的配置检查命令及排查方法

    当 Docker 容器启动后立即退出时,不要盲目重启。本文详解如何通过 docker logs 查看标准输出错误,利用 docker inspect 检查挂载与网络配置,并修正入口点脚本权限问题,提供一套高效的因果排查流程。

    安卓手机投屏到电脑win10怎么设置教程
    安卓手机投屏到电脑win10怎么设置教程

    详解如何利用Windows 10自带功能将安卓手机画面投射至电脑屏幕,涵盖开启步骤、连接技巧及延迟分析,适合临时演示与多屏协作场景。

    移动硬盘解除加密怎么操作?详细步骤教程
    移动硬盘解除加密怎么操作?详细步骤教程

    详细介绍如何在Windows系统中为移动硬盘解除BitLocker加密,包括解锁驱动器、关闭加密功能及监控解密进度的完整操作流程,帮助用户安全移除数据保护。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    macOS软件
    macOS软件

    正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

    Mac软件 更多
    Blender
    Blender
    Windows、macOS 和 Linux

    Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。

    灵活计算器
    灵活计算器
    macOS/iOS/Android

    灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

    赤友清理大师
    赤友清理大师
    macOS

    赤友清理大师是一款为 Mac 设计的智能清理优化工具,可精准扫描垃圾、大文件、重复文件等,释放磁盘空间。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

    WINDOWS 更多
    Blender
    Blender
    Windows、macOS 和 Linux

    Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。

    Windows 10
    Windows 10
    Windows

    Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

    极度公式
    极度公式
    Windows/macOS/Linux

    极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。