Jenkins使用

Jenkins使用原理是在Jenkins客户端携带参数发送到节点执行节点的部署脚本,

每一台测试服务器就是一个节点。


 

使用前先安装的插件:

Extended Choice Parameter

ThinBackup

1.添加节点

在设置界面找到节点管理如下图:

 

然后点击新建节点:

输入节点名称,这里可以固定一个新节点(如果想复制一个已存在的节点,也可以勾选复制现有节点)勾选后在输入框出入要复制的节点名称,系统会模糊匹配,点击确定

 

 

【名称】输入节点名称

【描述】描述节点的作用

【远程工作目录】Jenkins工作的目录可自己随意填写

【用法选择】Use this node as possible,

【启动方式】选择Launch agents via SSH,

【主机】输入测试服务器IP地址,

【Credentials】输入主机账号密码

【Host Key Verification Strategy】选择Non verifying Verification Strategy

点击【高级】

【Java路径】 填写服务器的绝对路径如/usr/java/jdk1.8.0_131/bin/java

其他配置保持不变,或不填

点击【保存】

 

返回该节点详情页面点击【启动代理】

 

返回到节点列表,出现节点服务器的信息即连接成功,否则请检查节点参数选择、账号密码、Java路径是否正确

 

2.添加任务

节点添加完毕后,下边就是建立任务了

在Jenkins首页点击【新建item】

 

输入任务名称

选择第一个【Freestayle project】自由风格的任务,也可以在最下方输入现有任务名称,选择复制任务,然后再现有任务的基础上做修改,点击【确定】

 

【描述】填写任务描述

勾选This project is parameterized

点击【添加参数】选择Extended Choice Parameter,该参数的作用是通过Groovy 脚本列出版本列表,

 

【Choose Source for Value】勾选Groovy Script如下图

 

如果包为zip则输入脚本内容如下:(其中maven下载地址为需要部署项目的连接)

import groovy.json.JsonSlurper
import java.text.SimpleDateFormat
def connection = new
URL("maven下载").openConnection() as HttpURLConnection
connection.setRequestProperty('Accept', 'application/json')
def jsonSlurper = new JsonSlurper()

//获取到的是Map对象
def map = jsonSlurper.parseText(connection.inputStream.text)
List<Map> urlMaps = map["data"]
urlMaps.sort(new Comparator<Map>() {
    @Override
    int compare(Map o1, Map o2) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.s")
        return simpleDateFormat.parse((String) o2["lastModified"]) - simpleDateFormat.parse((String) o1["lastModified"])
    }
})
String urls = ""
for (int i = 0; i < urlMaps.size(); i++) {
    Map urlMap = urlMaps.get(i)
    urls += (urlMap["resourceURI"] + ",")
}
urls = urls.substring(0, urls.length() - 1)
return urls

  

如果包为war包则输入脚本内容如下:

import groovy.json.JsonSlurper
import java.text.SimpleDateFormat
def connection = new
URL("maven下载地址").openConnection() as HttpURLConnection
        connection.setRequestProperty('Accept', 'application/json')
        def jsonSlurper = new JsonSlurper()
        //获取到的是Map对象
        def map = jsonSlurper.parseText(connection.inputStream.text)
        List<Map> urlMaps = map["data"]
        urlMaps.sort(new Comparator<Map>() {
            @Override
            int compare(Map o1, Map o2) {
                SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.s")
                return simpleDateFormat.parse((String) o2["lastModified"]) - simpleDateFormat.parse((String) o1["lastModified"])
            }
        })
        String urls = ""
        for (Map map1 : urlMaps) {
            def resourceURI = map1["resourceURI"];
            if (resourceURI.contains("SNAPSHOT")) {
                def connection1 = new URL(resourceURI).openConnection() as HttpURLConnection
                connection1.setRequestProperty('Accept', 'application/json')
                def jsonSlurper1 = new JsonSlurper()
                def map2 = null
                try {
                    map2 = jsonSlurper1.parseText(connection1.inputStream.text)
                } catch (Exception e) {
                    continue;
                }
                List<Map> urlMaps1 = map2["data"]
                urlMaps1.sort(new Comparator<Map>() {
                    @Override
                    int compare(Map o1, Map o2) {
                        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.s")
                        return simpleDateFormat.parse((String) o2["lastModified"]) - simpleDateFormat.parse((String) o1["lastModified"])
                    }
                })
                for (Map map3 : urlMaps1) {
                    if (map3.containsKey("resourceURI")) {
                        def object = map3["resourceURI"];
                        if (object.endsWith(".war")) {
                            urls += (object + ",")
                        }
                    }
                }
            }
        }
        urls = urls.substring(0, urls.length() - 1)
        return urls

 

继续点击【添加参数】选择Multi-line String Parameter 该参数作用是手动添加一个参数以供接下来的shell脚本使用

例如INSTANCE 该选项可以根据实际情况添加多个自定义参数名称

 

接下来勾选【限制项目的运行节点】,(想在哪台服务器上运行就选择哪个节点)

在标签表达式里输入节点名称,

最后到【构建】>点击【增加构建步骤】选择【Execute shell】

输入如下脚本,将

#!/bin/sh -l
export LANG="en_US.UTF-8"
export BUILD_ID=dontKillMe
echo "###########检查脚本是否存在#############"
deploy_name=web_deploy.sh #脚本名称
wgte_ftpurl=ftp://*****IP*****/wget/linux_shell_deploy/web_deploy.sh  #脚本下载地址

function download() {
    wget -q -P /opt/war/ $wgte_ftpurl
	chmod u+x /opt/war/$deploy_name
	echo "脚本下载完成"
}
if [ -d "/opt/war/" ];then
	echo "目录存在"
	if [ -f "/opt/war/$deploy_name" ];then
		echo "文件存在"
	else
		echo "未发现脚本文件,即将下载脚本"
		download
	fi
else
	echo "目录不存在,即将创建/opt/war目录和下载脚本"
	mkdir /opt/war
	download
fi

INSTANCE=$INSTANCE
TOMCAT=$TOMCAT
files=$files

/opt/war/$deploy_name $war_file_Url  
# 根据实际项目替换文件某一行
sed -i '6c <base href="/xx_market_ms/">' $TOMCAT/webapps/$INSTANCE/index.html 

  

***注意以上脚本中的deploy_name和wgte_ftpurl参数值根据部署的是前台和后台有不同的参数(脚本是事先写好的)

前端参数:

deploy_name=web_deploy.sh

wgte_ftpurl=ftp://dev.handsmap.com/wget/linux_shell_deploy/web_deploy.sh

后台docker参数

deploy_name=docker_deploy.sh

wgte_ftpurl=ftp://dev.handsmap.com/wget/linux_shell_deploy/docker_deploy.sh地址

 

最后点击【保存】即可

返回jenkins首页点击【构建】

 

选择要部署的版本,其他参数不变,点击【开始构建】

 

 

点击左右下【控制台输出】查看任务构建日志

系统会返回脚本执行的过程

 设置备份路径 每周五晚23:00定期备份

 

 

posted @ 2020-09-27 14:26  子寒子寒  阅读(860)  评论(0)    收藏  举报