使用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: ‘[email protected]: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

原文地址:https://blog.51cto.com/hld1992/2385108

时间: 2024-11-08 04:49:09

使用Jenkins Pipeline自动化构建发布Java项目的相关文章

Jenkins通过maven构建编译JAVA项目

Jenkins 通过maven 构建编译 JAVA 项目环境 官网下载合适Jenkins版本包: jenkins http://mirrors.jenkins.io/war-stable/  Jdk curl -L -O http://download.oracle.com/otn-pub/java/jdk/8u45-b14/jdk-8u45-linux-x64.tar.gz  JDK SE http://120.52.72.24/download.oracle.com/c3pr90ntc0td

Jenkins pipeline自动化构建审批功能

Jenkins Pipeline是一套插件,支持将连续输送Pipeline实施和整合到Jenkins.Pipeline提供了一组可扩展的工具,用于通过PipelineDSL为代码创建简单到复杂的传送Pipeline. 对于单个项目来说,使用这样的Pipeline来构建能够满足绝大部分需求,但是这样做也有很多缺陷,包括: 多个项目的Pipeline打包脚本不能公用,导致一个项目写一份脚本,维护比较麻烦.Jenkins提供了一个更优雅的管理Pipeline脚本的方式,在配置项目Pipeline的时候

Solo博客系统--Jenkins/docker自动化构建发布系统

部署 git服务器 yum install git useradd git passwd git 创建仓库 su - git mkdir solo.git git --bare init ##初始化仓库 docker cat >> /etc/docker/daemon.json << EOF { "insecure-registries":["reg.hequan.xyz:5000"] } EOF Jenkins服务器 wget https:

基于Jenkins Pipeline自动化部署

最近在公司推行Docker Swarm集群的过程中,需要用到Jenkins来做自动化部署,Jenkins实现自动化部署有很多种方案,可以直接在jenkins页面写Job,把一些操作和脚本都通过页面设置,也可以在每个项目中直接写Pipeline脚本,但像我那么优秀,那么追求极致的程序员来说,这些方案都打动不了我那颗骚动的心,下面我会跟你们讲讲我是如何通过Pipeline脚本实现自动化部署方案的,并且实现多分支构建,还实现了所有项目共享一个Pipeline脚本. 使用Jenkins前的一些设置 为了

运维技巧:简单4步完成自动化构建发布

各位看官,这不是一个揭发单身有为青年因同事们天天秀恩爱而受到一万点暴击伤害的故事.这里指的狗粮,不是真正的"狗粮"--当然,也不是你们认为的狗粮. 事实上,现在很多涉足产品开发的互联网公司,都会提到"吃狗粮"这一概念(出自"Eating yourown dog food -- 吃你自家的狗粮"),它的意思是公司内部员工使用自己生产的产品进行日常工作.这么做有什么好处呢,比方说一家公司做美颜APP的,结果他们自己员工却用某图秀秀P图,这产品对外怎么

Ant——使用Ant构建简单Java项目(二)

博客<Ant--使用Ant构建简单Java项目(一)>演示了使用Ant工具构建简单的Java项目,接着这个例子来进一步学习Ant: 上面例子执行build.xml文件脚本比较繁杂,能不能简化执行的脚本呢?答案是肯定的,可以将build.xml文件中的脚本改成下面的脚本: <?xml version="1.0" encoding="UTF-8"?> <project name="test" default="

Centos 如何 发布Java项目

在发布Java项目之前,我们先要安装如下软件 一.Windows 1.winscp(Windows到centos上传下载) 2.PuTTY(Windows访问centos服务器) 3.Navicat客户端(连接centos数据库) 二.Centos 1.jdk 2.mysql 3.Tomcat --------------------------------------------------------------------- 一.1.winscp 安装成功之后需要输入如下内容 2.PuTT

Ant——使用Ant构建简单Java项目(三)

博客<Ant--使用Ant构建简单Java项目(二)>我们简化了执行Test类中main方法需要执行的命令,本博客来介绍一下如何使build.xml文件和其中使用property标签定义的属性分离: 1.在test文件夹中新建名为build.properties的文件,文件中以"key=value"的形式输入原来在build.xml文件中定义的属性及其属性值如下: src=src lib=build/lib dest=build/classes np_jar=build/l

Ant—使用Ant构建简单Java项目(三)

博客<Ant-使用Ant构建简单Java项目(二)>我们简化了运行Test类中main方法须要运行的命令,本博客来介绍一下如何使build.xml文件和当中使用property标签定义的属性分离: 1.在test目录中新建名为build.properties的文件,文件里以"key=value"的形式输入原来在build.xml文件里定义的属性及其属性值例如以下: src=src lib=build/lib dest=build/classes np_jar=build/l