当前位置:

首页 > 系统应用 > 运维|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 " 流水线执行失败,请查看日志排查问题!"
    }
    }
    }

    优化脚本之后


    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    系统应用 jenkins
    相关文章 更多
    jenkins配置git仓库步骤与凭证设置教程
    jenkins配置git仓库步骤与凭证设置教程

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

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

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

    jenkins自动部署jar包教程及完整操作流程
    jenkins自动部署jar包教程及完整操作流程

    手把手教你配置Jenkins自动部署Java应用。涵盖Git源码管理、Maven构建配置、SSH远程执行脚本及JAR包替换重启的全流程操作,解决手动部署繁琐易错的问题。

    如何使用正确的凭据登录 Jenkins
    如何使用正确的凭据登录 Jenkins

    简介 Jenkins 是一个广泛使用的开源自动化服务器,可帮助开发人员构建、测试和部署他们的软件项目。在本教程中,我们将指导你使用正确的凭据登录 Jenkins,并解决你可能遇到的任何登录问题。 Jenkins 简介 Jenkins 是一款广受欢迎的开源自动化服务器,用于构建、测试和部署软件应用程序

    如何设置 Jenkins 在系统启动时自动启动
    如何设置 Jenkins 在系统启动时自动启动

    简介 Jenkins作为一款备受青睐的开源自动化服务器,为开发人员构建、测试及部署软件项目提供了有力支持。在本教程里,我们将引领你完成Jenkins的配置,使其能在系统启动时自动开启,保证你的持续集成/持续交付(CI/CD)工作流程得以顺畅运行。 Jenkins 简介 Jenkins 是一款广受欢迎

    配置Jenkins自动拉取gitlab中的代码并部署方式
    配置Jenkins自动拉取gitlab中的代码并部署方式

    首先安装Jenkins必要插件并配置SSH密钥以实现免密拉取代码,然后创建Jenkins任务并设置构建后自动同步到Web服务器,最后一步配置GitLabWebhook使得代码推送时自动触发部署,从而最终完成一套完整的自动化CI/CD流水线搭建。

    Sublime配置Groovy环境_编写Jenkins流水线代码
    Sublime配置Groovy环境_编写Jenkins流水线代码

    SublimeText无法直接运行Groovy脚本,需依赖外部环境执行。它为编写Jenkinsfile提供高亮、校验和自动补全,通过安装Grv等插件增强PipelineDSL关键词语法识别。不建议配置构建系统本地执行,验证应依赖Jenkins环境。注意UTF-8编码和空格缩进。

    怎样在CodeIgniter中使用Jenkins_CodeIgniter持续集成服务器【配置】
    怎样在CodeIgniter中使用Jenkins_CodeIgniter持续集成服务器【配置】

    先说句大实话:Jenkins这个工具本身可不认识CodeIgniter,它的大脑里就只有三件事:拉代码、跑命令、发通知。CodeIgniter作为PHP框架,压根儿没有编译这个步骤,所以所谓的“在CodeIgniter里用Jenkins”,说穿了就是——用Jenkins自动去执行你PHP项目里的测试

    Linux怎么安装Jenkins并配置Java环境 Linux自动化部署实战详解
    Linux怎么安装Jenkins并配置Java环境 Linux自动化部署实战详解

    Linux怎么安装Jenkins并配置Ja va环境 Linux自动化部署实战详解 在CentOS 8或者Rocky Linux 8上部署Jenkins,第一步往往就决定了成败:ja va -version的输出必须是1.8,也就是JDK 8。如果版本不对,Jenkins要么启动失败,要么Web界面

    Jenkins如何重置管理员密码
    Jenkins如何重置管理员密码

    步骤一:备份并临时关闭 Jenkins 安全认证 忘记 Jenkins 管理员密码这事儿,说大不大,但处理起来得格外小心。第一步永远是备份,这是所有运维操作的黄金法则。 1、备份原始配置文件(强烈推荐) 别嫌麻烦,先用 cp -a 命令完整备份一下配置文件,权限和时间戳这些属性也得原样保留: sud

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

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

    Windows
    Windows

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

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。