使用Jenkins Pipeline自动化构建发布Java项目的方法

简介

Pipeline,简而言之,就是一套运行于Jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排与可视化。

Pipeline是Jenkins2.X的最核心的特性,帮助Jenkins实现从CI到CD与DevOps的转变。

一,创建pipeline项目

二,清除部分历史构建

三,参数化构建

这里使用三个参数,分别对应是否拉取代码,项目名称,以及发版选项

四,编写pipeline脚本

选择pipeline script

编写pipeline脚本

def userMap
def proMap = ['api': 'test_api', 'report':'test_report', 'job': 'test_job']   //定义项目字典
def deployMap = ['test-pipeline': 'test-pro.sh']     //定义发版脚本
def predeployMap = ['test-pipeline': 'test-pre.sh']   //定义预发布脚本
def rollbackMap = ['test-pipeline': 'test-pro-rollback.sh']   //定义回滚脚本
pipeline {
  agent any
  //parameters { string(defaultValue: '', name: 'PULL_FLAG', description: '请根据发布类型进行选择发布:\n1,输入-TESTING-发布-最新代码-到灰度\n2,输入-LATEST-发布-最新代码-到生产\n3,输入-版本号-发布-制定版本-到生产 ' ) }
  stages {
    stage('Checkout') {
      when {
                //判断是否要拉取代码
        environment name: 'PULL_FLAG', value: 'yes'
      }
      steps {
        echo "${PULL_FLAG}"
                //拉取代码
        checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'CleanBeforeCheckout']], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '797fddfc-d9d6-42a7-9a2b-38421a6963b0', url: 'git@git.test.com:test/test.git']]])
        echo 'Checkout'
      }
    }
    stage('Build') {
      when {
        environment name: 'PULL_FLAG', value: 'yes'
      }
      steps {
        echo 'Building'
                // 使用maven进行构建
        sh 'mvn clean install -Dmaven.test.skip=true -Pprod'
      }
    }
    stage('Push package') {
      when {
        environment name: 'PULL_FLAG', value: 'yes'
      }
      steps {
        echo 'push package'
                //上传war包至跳板机
        sh 'sh /srv/shell/PAY_scp_pipe.sh '
      }
    }
    stage('Deploy/Rollback') {

      steps {
                //定义发版密码校验,只有输入口令正确,才会发版到线上机器,密码保存在环境变量中
        timeout(60) {
          script {
            userMap = input message: 'please input password', ok: 'ok', submitter: 'admin', parameters: [password(name:'password', defaultValue: '', description: '发布代码口令' )], submitterParameter: 'admin'

            if (userMap['password'].toString() == PASSWORD) {
              echo '密码正确'
              if (DEPLOY_FLAG == 'deploy') {
                echo "发版"
                sh "ssh test 'cd /data/faban && sh ${deployMap[env.JOB_NAME]} ${proMap[PROJECT]}'"
              }else if (DEPLOY_FLAG == 'predeploy') {
                echo '预发布'
                sh "ssh test 'cd /data/faban/pre-release && sh ${predeployMap[env.JOB_NAME]} ${proMap[PROJECT]}'"
              }else if (DEPLOY_FLAG == 'rollback') {
                echo '回滚'
                sh "ssh test 'cd /data/faban && sh ${rollbackMap[env.JOB_NAME]} ${proMap[PROJECT]}'"
              }
            }else {
              echo '密码错误'
              echo "${env.JOB_NAME}"
            }
          }
        }
      }
    }
  }
  post {
    always {
      echo 'This will always run'
            //发版结束后删除jenkins workspace下的临时目录
      deleteDir()
    }
    success {
      echo 'This task is successful!'
            //记录日志信息
      sh """
        printf '%s %s %s %s %s %s' `date +'%F %H:%M:%S'` "${env.JOB_NAME}" "${proMap[PROJECT]}" "${DEPLOY_FLAG}" "success!\n" >> /srv/jk_logs/jk.log
      """
    }
  }
}

五,用到的shell脚本

1, 上传war包的脚本 /srv/shell/TEST_scp_pipe.sh

#!/bin/bash

scp -r /srv/jenkins/workspace/test/test/api/target/api.war test:/data/faban/server_war/risk_api.war
scp -r /srv/jenkins/workspace/test/test/report/target/report.war test:/data/faban/server_war/risk_report.war
scp -r /srv/jenkins/workspace/test/test/job/target/job.war test:/data/faban/server_war/risk_job.war

2, 发版脚本(跳板机)

#!/bin/bash
project="$1"
java_config=/data/faban/java_config
war_rebuild=/data/faban/war_rebuild

if [ $# -lt 1 ]; then
 echo "usage: $0 <project>"
 exit 1
fi

case "$project" in
    test_api)
    tomcat=/opt/tomcat_api
    server="test"
  ;;
    test_report)
    tomcat=/opt/tomcat_report
    server="test"
  ;;
    test_job)
    tomcat=/opt/tomcat_job
    server="test"
  ;;

esac

rm -rf $war_rebuild/*
rsync -av /data/faban/server_war/$project.war /data/faban/war_rebuild
cd $war_rebuild

ssh $server "pkill -9 -f $tomcat"
ssh $server "rm -rf $tomcat/webapps/ROOT; mv $tomcat/webapps/ROOT.war $tomcat/webapps/ROOT.war.bak"
scp $project.war $server:$tomcat/webapps/ROOT.war
ssh $server "chown www.www $tomcat/webapps/ROOT.war"
ssh $server "su - www -c $tomcat/bin/startup.sh"

sleep 5

3, 回滚脚本(跳板机)

#!/bin/bash
project="$1"

if [ $# -lt 1 ]; then
 echo "usage: $0 <project>"
 exit 1
fi

case "$project" in
    test_api)
    tomcat=/opt/tomcat_api
    server="test"
  ;;
    test_report)
    tomcat=/opt/tomcat_report
    server="test"
  ;;
    test_job)
    tomcat=/opt/tomcat_job
    server="test"
  ;;

esac

ssh $server "pkill -9 -f $tomcat"
ssh $server "rm -rf $tomcat/webapps/ROOT; mv $tomcat/webapps/ROOT.war.bak $tomcat/webapps/ROOT.war"
ssh $server "su - www -c $tomcat/bin/startup.sh"
sleep 5

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Java利用jenkins做项目的自动化部署

    最近领导要求上海本地的项目需要使用进jenkins实现自动化部署,以便可以直接将项目移交给运维的同学,减轻开发的工作量.记录下这次爬坑的过程. 一.前言 Jenkins是基于Java开发的一种持续集成工具,用于监控持续重复的工作,功能包括: 1.持续的软件版本发布/测试项目. 2.监控外部调用执行的工作. 上面是我从百科上down下来的,老实说没看懂,这是个什么玩意啊?其实以我现在的理解和应用,最多的便是部署了,其他功能待研究╮(╯_╰)╭撸主目前在上海一个不知名国企打工,我们现在项目的发布流程

  • 使用Jenkins Pipeline自动化构建发布Java项目的方法

    简介 Pipeline,简而言之,就是一套运行于Jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排与可视化. Pipeline是Jenkins2.X的最核心的特性,帮助Jenkins实现从CI到CD与DevOps的转变. 一,创建pipeline项目 二,清除部分历史构建 三,参数化构建 这里使用三个参数,分别对应是否拉取代码,项目名称,以及发版选项 四,编写pipeline脚本 选择pipeline script 编写pipelin

  • jenkins自动构建发布vue项目的方法步骤

    简介 Jenkins是一个开源的.提供友好操作界面的持续集成(CI)工具,起源于Hudson(Hudson是商用的),主要用于持续.自动的构建/测试软件项目.监控外部任务的运行(这个比较抽象,暂且写上,不做解释).Jenkins用Java语言编写,可在Tomcat等流行的servlet容器中运行,也可独立运行.通常与版本管理工具(SCM).构建工具结合使用.常用的版本控制工具有SVN.GIT,构建工具有Maven.Ant.Gradle. jenkins安装 1.安装JDK yum install

  • 通过jenkins发布java项目到目标主机上的详细步骤

    发布java项目的步骤: 拉取代码并打包 mvn clean package 备份目标服务器上已有的要发布项目 将包传到目标服务器的webapss目录中 需做免密登录 重启目标服务器的tomcat服务 修改项目的配置 重启目标服务器的tomcat服务 项目要求: 两台主机上分别安装jenkins,tomcat jenkins主机上操作 #两台主机做免密登录 [root@localhost ~]# ssh-keygen -t rsa Generating public/private rsa ke

  • jenkins构建go及java项目的方法

    写在前面 jenkins作为java的好基友,经历过单体项目时代->集群项目时代->容器集群分布式时代,使用稳定可靠,cpu友好(就泪存有点儿难看),如果有问题就... (当然这种情况不多(_) ) , 至于后期又有了jenkins x(容器版),对于非容器环境这里这里就不介绍啦 然后简略介绍我自己的项目情况吧,说说我的思路:首先我的项目有一个后台mee(java).mee-api(多个,为Java项目)以及gee-api项目(多个,go项目),后台项目暂不集群分布(目前够用), mee-ap

  • 使用Jenkins来构建GIT+Maven项目的方法步骤

    前言 最近写了一篇博客是关于 使用Jenkins来构建SVN+Maven项目 ,这里使用的的代码版本工具是SVN,但是事实上也有很多公司使用GIT来进行代码管理,那么我们如何使用Jenkins去自动发布GIT+Maven项目呢? 正文 Jenkins Jenkins是一个开源的.可扩展的持续集成.交付.部署的基于web界面的平台.允许持续集成和持续交付项目,无论用的是什么平台,可以处理任何类型的构建或持续集成. 通常我们使用Jenkins主要实现以下功能: 持续集成指的是,频繁地(一天多次)将代

  • Gradle构建多模块项目的方法步骤

    通常我在使用Maven构建项目的时候是将应用项目划分为多个更小的模块. Gradle 项目也拥有多于一个组件,我们也将其称之为多项目构建(multi-project build). 我们首先创建一个多项目构建: mkdir cmdGradleProj && cd cmdGradleProj gradle init 这时候 D:\cmdGradleProj> 目录下执行:tree /f 的项目结构如下: │ build.gradle │ gradlew │ gradlew.bat │

  • jenkins分环境部署vue/react项目的方法步骤

    vue/react部署请参考上一篇文章:https://www.jb51.net/article/238583.htm 项目开发正常都需要开发环境.测试环境.生产环境,每个环境部署都比较麻烦,可以使用jenkins自动化部署 1.安装自定义参数化插件 Extended Choice Parameter Plug-In 2.配置自定义参数 3.配置shell脚本 shell脚本内容 #!/bin/bash // 判断环境 if [ $env == "dev" ]; then url=&q

  • 使用eclipse创建java项目的方法

    本文为大家分享了如何使用eclipse创建java项目,供大家参考,具体内容如下 首先,打开Eclipse,在工具栏依次点击[File]>>>[New]>>>[Other],这个窗口显示的所有我们可以新建的项目类型,上面有个搜索框可以输入你想新建什么样的项目 我们在搜索框里输入[java],然后下面会列出符合要求的列表,我们点击一下[Java Project],然后点击[Next] 这里要输入你JAVA项目的名称了,我测试一下,就输入HelloWorld,你可以输入你想

  • 使用Jenkins自动化构建工具进行敏捷开发

    目录 一.序言 二.安装与使用 (一)安装 1.查看初始密码 2.修改默认工作空间 (二)使用 1.构建配置 2.添加项目 (三)免密登录 三.触发策略 (一)定时触发 (二)URL 触发 (三)钩子触发 附录.工具使用 1.语言设置 2.构建环境清单 3.环境配置 4.任务配置 一.序言 Jenkins 是一款自动化构建工具,能够基于 Maven 构建后端 Java 项目,也能够基于 nodejs 构建前端 vue 项目,并且有可视化 web 界面. 所谓自动化构建是按照一定的策略执行打包脚本

  • Gogs+Jenkins+Docker 自动化部署.NetCore的方法步骤

    环境说明 腾讯云轻量服务器, 配置 1c 2g 6mb ,系统是 ubuntu 20.14,Docker 和 Jenkins 都在这台服务器上面, 群晖218+一台,Gogs 在这台服务器上. Docker安装 卸载旧的 Docker sudo apt-get remove docker docker-engine docker.io containerd runc 更新 apt 包索引并安装包以允许 apt 通过 HTTPS 使用存储库 sudo apt-get update sudo apt

随机推荐