首页 文章 精选 留言 我的

精选列表

搜索[自动装配],共10000篇文章
优秀的个人博客,低调大师

Jenkins+maven+gitlab+Tomcat自动部署版本更新及回滚

该博文实现效果:结合maven+gitlab,可以使用Jenkins对不同环境(测试及线上环境)的tomcat服务器实现版本的迭代更新及版本回滚操作,部署完成后,只需点击几下,即可实现。 一、环境准备 系统 IP 主机名 运行服务 Centos7.3 192.168.171.131 Jenkins Jenkins+gitlab+Maven Centos7.3 192.168.171.134 Tomcat1 Tomcat Centos7.3 192.168.171.135 Tomcat2 Tomcat Jenkins、gitlab服务部署可参考:部署Jenkins+Gitlab实现持续集成Tomcat1用于测试环境,Tomcat2用于生产环境,部署可参考:Tomcat 的安装与优化在进行真正的配置前,优先确保可以访问到以下几个页面:1、gitlab2、Jenkins3、访问tomcat14、访问tomcat2二、部署及配置1、Jenkins服务器上安装JDK环境 [root@jenkins ~]# rpm -qa | grep jdk copy-jdk-configs-1.2-1.el7.noarch java-1.8.0-openjdk-headless-1.8.0.102-4.b14.el7.x86_64 java-1.8.0-openjdk-1.8.0.102-4.b14.el7.x86_64 java-1.7.0-openjdk-1.7.0.111-2.6.7.8.el7.x86_64 java-1.7.0-openjdk-headless-1.7.0.111-2.6.7.8.el7.x86_64 #卸载下面的两个包 [root@jenkins ~]# rpm -e --nodeps java-1.8.0-openjdk-headless-1.8.0.102-4.b14.el7.x86_64 [root@jenkins ~]# rpm -e --nodeps java-1.7.0-openjdk-headless-1.7.0.111-2.6.7.8.el7.x86_64 #部署我提供的jdk包 [root@jenkins ~]# tar zxf jdk-8u211-linux-x64.tar.gz -C /usr/local/ [root@jenkins ~]# vim /etc/profile export JAVA_HOME=/usr/local/jdk1.8.0_211 export JRE_HOME=/usr/local/jdk1.8.0_211/jre export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH [root@jenkins ~]# . /etc/profile [root@jenkins ~]# java -version java version "1.8.0_211" Java(TM) SE Runtime Environment (build 1.8.0_211-b12) Java HotSpot(TM) 64-Bit Server VM (build 25.211-b12, mixed mode) 2、部署Maven服务 [root@jenkins ~]# tar zxf apache-maven-3.6.1-bin.tar.gz [root@jenkins ~]# mv apache-maven-3.6.1/ /usr/local/maven [root@jenkins ~]# vim /etc/profile export MAVEN_HOME=/usr/local/maven export PATH=$PATH:$MAVEN_HOME/bin [root@jenkins ~]# . /etc/profile [root@jenkins ~]# mvn -v #执行命令,只要出现下面内容就部署成功了(因为这是二进制的方式部署) Apache Maven 3.6.1 (d66c9c0b3152b2e69ee9bac180bb8fcc8e6af555; 2019-04-05T03:00:29+08:00) Maven home: /usr/local/maven Java version: 1.8.0_211, vendor: Oracle Corporation, runtime: /usr/local/jdk1.8.0_211/jre Default locale: en_US, platform encoding: UTF-8 OS name: "linux", version: "3.10.0-514.el7.x86_64", arch: "amd64", family: "unix" 3、指定阿里云仓库 [root@jenkins ~]# vim /usr/local/maven/conf/settings.xml #在158行下写入以下内容 <mirror> <id>aliyun</id> <mirrorOf>central</mirrorOf> <name>aliyun maven</name> <url>https://maven.aliyun.com/nexus/content/groups/public/</url> </mirror> </mirrors> #添加在该行上面 4、解决Jenkins无法启动问题至此,maven服务已经部署成功了,但是,这里还同时部署着Jenkins,Jenkins的启动是依赖之前的Java环境的,部署maven服务又重新配置了Java环境,所以,Jenkins当前无法正常启动,现在需要对Java命令做软连接 [root@jenkins ~]# ln -sf /usr/local/jdk1.8.0_211/bin/java /usr/bin/ [root@jenkins ~]# /etc/init.d/jenkins restart #重启Jenkins,确定可以启动成功 Restarting jenkins (via systemctl): [ OK ] 5、maven构建测试代码并上传至gitlab [root@jenkins ~]# mvn archetype:generate -DgroupId=cn.test.testweb -DartifactId=testweb -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false [root@jenkins ~]# cd testweb/ [root@jenkins testweb]# vim src/main/webapp/index.jsp <html> <body> <h2>Hello World! test1 web</h2> #更改此行,以便区分不同版本 </body> </html> #删除本地gitlab库之前的文件,并提交到gitlab库 [root@jenkins test1]# rm -rf * [root@jenkins test1]# git commit -m "del" [root@jenkins test1]# git push origin master #将maven构建的项目复制到此目录下,并提交到gitlab远端库 [root@jenkins test1]# cd ~/testweb/ [root@jenkins testweb]# cp -r pom.xml src/ ~/test1/ [root@jenkins testweb]# cd ~/test1/ [root@jenkins test1]# git add * [root@jenkins test1]# git commit -m "test1 web" [root@jenkins test1]# git push origin master 6、配置Jenkins免密登录tomcat服务器 #由于需要Jenkins向Tomcat服务器复制代码及添加目录,所以需要配置免密登录 #默认在配置gitlab时,已经生成了当前用户的秘钥对,所以无需重新生成 #将公钥分别发送至两台tomcat服务器,自行输入“yes”确认,及tomcat的root密码 [root@jenkins test1]# ssh-copy-id root@192.168.171.135 [root@jenkins test1]# ssh-copy-id root@192.168.171.134 7、修改Jenkins的运行用户同样,也是为了方便Jenkins服务在运行过程中,拥有一些创建目录或写入文件的权限,我这里为了方便,直接改为root用户运行Jenkins,生产环境中,需要好好考虑权限问题 [root@jenkins test1]# sed -i 's/JENKINS_USER="jenkins"/JENKINS_USER="root"/g' /etc/sysconfig/jenkins [root@jenkins test1]# /etc/init.d/jenkins restart 8、配置Jenkins的web界面安装插件按照下面的提示,依次安装插件提取码:08n5 (可以自行使用在线安装插件的方式,自行研究),共7个,除了要先安装jquery插件再安装jquery-ui插件外,其他插件的上传顺序可随意,注意:一次只能上传一个插件 9、配置Jenkins的web界面指定maven及jdk安装路径1)配置maven依次点击(Jenkins首页开始):系统管理>>全局工具配置>>2)配置jdk依次点击(Jenkins首页开始):系统管理>>全局工具配置>>10、构建maven项目添加第二个选项参数:写入内容,并添加文本参数:在以下的Build框中输入:clean package -Dmaven.test.skip=true以下脚本可以直接复制下面内容(注意,需要根据实际情况修改下面定义host的IP字段,建议仔细阅读脚本,以便查看这个脚本的作用)这个脚本是实现版本的迭代升级及回滚的关键!!!这个脚本是实现版本的迭代升级及回滚的关键!!!这个脚本是实现版本的迭代升级及回滚的关键!!! ##Deploy tomcat war_bak="/data/war/bak" tomcat_deploy="/usr/local/tomcat/webapps" #WAR_PATH="${WORKSPACE}/${MODULE_NAME}/target/*.war" WAR_PATH="${WORKSPACE}/target/*.war" #以下是定义测试服务器及线上服务器 test_host="192.168.171.134" #测试服务器,IP可以写多个,但是要注意格式 stag_host="192.168.171.135" #线上服务器,同样,IP可以写多个 port="8080" echo "构建环境:${deploy} 项目名称:${JOB_NAME} 构建时间:`date +%F` 本次上线版本:${GIT_COMMIT}" >> /var/log/${JOB_NAME}.log ### status deploy or rollback ##判断git是否为空,如果是为空进行提示 if [ "${git}" = "" ];then echo "请输入git版本 #############" exit 1 else ## 判断发布 or 回滚 if [ "${Status}" = "Deploy" ];then ### 判断是否为测试环境 if [ "${deploy}" = "test" ];then ### 构建主机 for i in ${test_host} do ssh ${i} "mkdir -p ${war_bak}/${JOB_NAME}/${git}" scp ${WAR_PATH} ${i}:${war_bak}/${JOB_NAME}/${git}/ROOT.war ssh ${i} rm -rf ${tomcat_deploy}/* ssh ${i} cp ${war_bak}/${JOB_NAME}/${git}/ROOT.war ${tomcat_deploy} ssh ${i} /etc/init.d/tomcat restart ### 判断tomcat是否正常 for http in `seq 1 5` do tomcat_status=`curl -I ${i}:${port} -s|awk -F "[ ]" '{print $2}' |sed -n '1p'` if [[ "$tomcat_status" -ne 200 ]] || [[ "$tomcat_status" = "" ]];then echo -e "\033[5;34m 请稍等,服务启动中........ \033[0m" sleep 5 else echo -e "\033[5;34m 构建 ${i}环境发布正常,返回值[${tomcat_status}] \033[0m" break fi done if [[ "${tomcat_status}" -ne 200 ]] || [[ "${tomcat_status}" = "" ]];then if [[ "${tomcat_status}" = "" ]];then echo -e "\033[5;34m 构建 ${i}服务启动异常 \033[0m" exit 1 fi echo -e "\033[5;34m 构建 ${i}环境发布异常,返回值[${tomcat_status}] \033[0m" fi done echo -e "\033[5;34m 本次构建${test_host}主机,本次环境 ${deploy} \033[0m" ## 判断为预发布环境 elif [ "${deploy}" = "stag" ];then for i in "${stag_host}" do ssh ${i} mkdir -p ${war_bak}/${JOB_NAME}/${git} scp ${WAR_PATH} ${i}:${war_bak}/${JOB_NAME}/${git}/ROOT.war ssh ${i} rm -rf ${tomcat_deploy}/* ssh ${i} cp ${war_bak}/${JOB_NAME}/${git}/ROOT.war ${tomcat_deploy} ssh ${i} /etc/init.d/tomcat restart ### 判断tomcat是否正常 for http in `seq 1 5` do tomcat_status=`curl -I ${i}:${port} -s|awk -F "[ ]" '{print $2}' |sed -n '1p'` if [[ "$tomcat_status" -ne 200 ]] || [[ "$tomcat_status" = "" ]];then echo -e "\033[5;34m 请稍等,服务启动中........ \033[0m" sleep 5 else echo -e "\033[5;34m 构建 ${i}环境发布正常,返回值[${tomcat_status}] \033[0m" break fi done if [[ "${tomcat_status}" -ne 200 ]] || [[ "${tomcat_status}" = "" ]];then if [[ "${tomcat_status}" = "" ]];then echo -e "\033[5;34m 构建 ${i}服务启动异常 \033[0m" exit 1 fi echo -e "\033[5;34m 构建 ${i}环境发布异常,返回值[${tomcat_status}] \033[0m" fi done echo -e "\033[5;34m 本次构建${test_host}主机,本次环境 ${deploy} \033[0m" fi ### 回滚操作 elif [[ "${Status}" = "RollBack" ]];then ### 判断回滚环境及主机 if [ "${deploy}" = "test" ];then for i in ${test_host} do ssh ${i} "[ -d ${war_bak}/${JOB_NAME}/${git} ]" if [ $? -ne '0' ];then echo -e "\033[5;34m git commit 回滚目录不存在,环境${deploy} 错误主机${i} \033[0m" exit 3 else echo -e "\033[5;34m 准备回滚操作 本次回滚环境${deploy} 回滚主机${i} \033[0m" sleep 3 fi ssh ${i} "mkdir -p ${war_bak}/${JOB_NAME}/${git}_${Status}_rollback/" ssh ${i} "cp -r ${tomcat_deploy}/* ${war_bak}/${JOB_NAME}/${git}_${Status}_rollback/" ssh ${i} "rm -rf ${tomcat_deploy}/*" ssh ${i} "cp -r ${war_bak}/${JOB_NAME}/${git}/*.war ${tomcat_deploy}/" ssh ${i} /etc/init.d/tomcat restart ### 判断tomcat是否正常 for http in `seq 1 5` do tomcat_status=`curl -I ${i}:${port} -s|awk -F "[ ]" '{print $2}' |sed -n '1p'` if [[ "$tomcat_status" -ne 200 ]] || [[ "$tomcat_status" = "" ]];then echo -e "\033[5;34m 请稍等,服务启动中........ \033[0m" sleep 5 else echo -e "\033[5;34m 构建 ${i}环境发布正常,返回值[${tomcat_status}] \033[0m" break fi done if [[ "${tomcat_status}" -ne 200 ]] || [[ "${tomcat_status}" = "" ]];then if [[ "${tomcat_status}" = "" ]];then echo -e "\033[5;34m 构建 ${i}服务启动异常 \033[0m" exit 1 fi echo -e "\033[5;34m 构建 ${i}环境发布异常,返回值[${tomcat_status}] \033[0m" fi done elif [ "${deploy}" = "stag" ];then for i in ${stag_host} do ssh ${i} "[ -d ${war_bak}/${JOB_NAME}/${git} ]" if [ $? -ne '0' ];then echo -e "\033[5;34m git commit 回滚目录不存在,环境${deploy} 错误主机${i} \033[0m" exit 3 else echo -e "\033[5;34m 准备回滚操作 本次回滚环境${deploy} 回滚主机${i} \033[0m" sleep 3 fi ssh ${i} "mkdir -p ${war_bak}/${JOB_NAME}/${git}_${Status}_rollback/" ssh ${i} "cp -r ${tomcat_deploy}/* ${war_bak}/${JOB_NAME}/${git}_${Status}_rollback/" ssh ${i} "rm -rf ${tomcat_deploy}/*" ssh ${i} "cp -r ${war_bak}/${JOB_NAME}/${git}/*.war ${tomcat_deploy}/" ssh ${i} /etc/init.d/tomcat restart ### 判断tomcat是否正常 for http in `seq 1 5` do tomcat_status=`curl -I ${i}:${port} -s|awk -F "[ ]" '{print $2}' |sed -n '1p'` if [[ "$tomcat_status" -ne 200 ]] || [[ "$tomcat_status" = "" ]];then echo -e "\033[5;34m 请稍等,服务启动中........ \033[0m" sleep 5 else echo -e "\033[5;34m 构建 ${i}环境发布正常,返回值[${tomcat_status}] \033[0m" break fi done if [[ "${tomcat_status}" -ne 200 ]] || [[ "${tomcat_status}" = "" ]];then if [[ "${tomcat_status}" = "" ]];then echo -e "\033[5;34m 构建 ${i}服务启动异常 \033[0m" exit 1 fi echo -e "\033[5;34m 构建 ${i}环境发布异常,返回值[${tomcat_status}] \033[0m" fi done ### 判断测试环境fi结束 fi fi #### fi是判断是否有git地址的结束 fi 11、编写tomcat服务的启动脚本,两台服务器都需要进行以下配置如果不编写tomcat的启动脚本,则在上面的shell脚本需要更改很多地方,因为上面脚本指定的tomcat启动脚本是/etc/init.d/tomcattomcat1配置如下 [root@tomcat1 ~]# vim /etc/init.d/tomcat #!/bin/bash # description: Tomcat is a Java Servlet Container TOMCAT_HOME=/usr/local/tomcat start () { TOMCAT_PID=`ps -ef |grep "$TOMCAT_HOME" |grep -v "grep" |awk '{print $2}'` if [ -z $TOMCAT_PID ];then source /etc/profile /bin/bash $TOMCAT_HOME/bin/startup.sh else echo "$0 is running" fi } stop () { TOMCAT_PID=`ps -ef |grep "$TOMCAT_HOME" |grep -v "grep" |awk '{print $2}'` if [ -z $TOMCAT_PID ];then echo "$0 is not running" else echo "shutting down $0" kill -9 "$TOMCAT_PID" && echo "PID $TOMCAT_PID killed." fi } status () { TOMCAT_PID=`ps -ef |grep "$TOMCAT_HOME" |grep -v "grep" |awk '{print $2}'` if [ -z $TOMCAT_PID ];then echo "$0 is not running" else echo "$0 is running PID is $TOMCAT_PID" fi } case $1 in start) start #tail -f $TOMCAT_HOME/logs/catalina.out ;; stop) stop ;; status) status ;; restart) stop start #tail -f $TOMCAT_HOME/logs/catalina.out ;; *) echo "Usage:$0 {start|stop|status|restart}." ;; esac [root@tomcat1 ~]# chmod +x /etc/init.d/tomcat # 赋予执行权限 [root@tomcat1 ~]# /etc/init.d/tomcat restart # 测试脚本是否可以使用 注:tomcat2配置相同注:tomcat2配置相同注:tomcat2配置相同12、将gitlab的代码部署到tomcat1测试服务器上首先需要在gitlab的web界面找到该测试代码的commit ID号,然后复制,如下:然后回到Jenkins的web界面,开始构建,点击如下:查看构建信息:既然在测试服务器上构建成功了,那么就访问一下测试服务器,页面是否真的变了访问测试服务器tomcat01(需要刷新页面,注意缓存问题)可以看到构建项目的内容13、将gitlab的代码部署到tomcat02线上服务器上访问线上服务器,查看其页面是否更改,如下(如果部署失败,那么建议参考构建的控制台输出信息进行排错):14、对tomcat服务进行页面升级1)准备测试代码: #执行mvn命令,生成代码 [root@jenkins /]# mvn archetype:generate -DgroupId=cn.test.testweb -DartifactId=testweb -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false [root@jenkins /]# vim testweb/src/main/webapp/index.jsp <html> <body> <h2>Hello World! test2 web</h2> # 修改为test2 </body> </html> [root@jenkins /]# cd testweb/ [root@jenkins testweb]# ls pom.xml src [root@jenkins testweb]# cp -r pom.xml src/ ~/test1/ [root@jenkins testweb]# cd ~/test1/ [root@jenkins test1]# git add * [root@jenkins test1]# git commit -m "test2 web" [root@jenkins test1]# git push origin master # 将代码推送至gitlab 查看gitlab上推送来代码的commit ID号:先升级测试服务器:刷新测试服务器的页面,查看是否更新成功:接下来,升级线上的tomcat服务器:刷新线上tomcat服务器的页面,如下表示成功:15、进行版本回滚的测试对测试服务器tomcat进行版本回滚:可以看到测试服务器的页面已经回滚到上一个版本了,而此时线上服务器的页面还是test02的页面对线上服务器的页面进行版本回滚:

优秀的个人博客,低调大师

一看就会:Python+Appium实现自动化测试

一、环境准备 1.脚本语言:Python3.x IDE:安装Pycharm 2.安装Java JDK 、Android SDK 3.adb环境,path添加E:\Software\Android_SDK\platform-tools 4.安装Appium for windows,官网地址http://appium.io/ 点击下载按钮会到GitHub的下载页面,选择对应平台下载 安装完成后,启动Appium,host和port默认的即可,然后设置Android SDk和Java JDK 然后点下边那个保存并重启的按钮,然后点第一个Start Server按钮,将会看到 二、真机测试 1.连接手机 打开开发者模式,USB线连接手机和电脑,并且在开发者选项当中,开启USB调试 测试是否连接成功,可执行命令adb devices 出现上图就证明手机和电脑连接成功。。。 2.点击Start Inspector Session 按如下配置Desired Capabilities platformName:声明是ios还是Android系统 platformVersion:Android内核版本号,可通过命令adb shell getprop ro.build.version.release查看 deviceName:连接的设备名称,通过命令adb devices -l中model查看 appPackage:apk的包名 appActivity:apk的launcherActivity,通过命令adb shell dumpsys activity | findstr “mResume”查看(需先打开手机应用) 注意:Android 8.1之前应使用adb shell dumpsys activity | findstr “mFocus” 3.运行Start Session,选择元素 右侧 Selected Element 区域有三个按钮 Tap:执行选中元素的点击事件 Send Keys:为文本框等对象传值 如果是文本输入元素,就清除文本 4.录制脚本 录制生成的python代码如下: # This sample code uses the Appium python client# pip install Appium-Python-Client# Then you can paste this into a file and simply run with Pythonfrom appium import webdrivercaps = {}caps["platformName"] = "Android"caps["platformVersion"] = "9.0.0"caps["deviceName"] = "Mi_Note_3"caps["appPackage"] = "com.antfortune.wealth"caps["appActivity"] = "com.alipay.mobile.quinox.LauncherActivity"caps["resetKeyboard"] = Truecaps["unicodeKeyboard"] = Truedriver = webdriver.Remote("http://localhost:4723/wd/hub", caps)el1 = driver.find_element_by_id("com.antfortune.wealth.login:id/login_main_button")el1.click()el2 = driver.find_element_by_id("com.alipay.mobile.accountauthbiz:id/auth_login_btn")el2.click()driver.quit() 5.在pycharm中建立项目将代码粘入,在运行之前,还需通过pip命令安装pip install Appium-Python-Client依赖包 最后,记一个我在这些过程中遇到的问题(现已解决) 在Appium-desktop中运行Start Session时,出现 解决方法:在开发者模式下,打开usb调试功能和use模拟点击,两个都要打开,此时再重新运行,即可解决 -END- 耐住寂寞,必有结果 本文分享自微信公众号 - 爱码小士(AIMA-1024)。如有侵权,请联系 support@oschina.cn 删除。本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

优秀的个人博客,低调大师

Jenkins:批量自动将 Maven 类型 Job 迁移到自由风格类型

为什么要迁移? 近期进行 Jenkins 从1.X到2.X的升级演练 Jenkins2 最新版本只能在 JDK8 或 JDK11 版本下运行,我所使用的 JDK 版本为 JDK8 在构建 Maven Job,Job 配置的 JDK 版本为 JDK7时,构建报错 $ /usr/local/java/bin/java -cp /data/jenkins/maven31-agent.jar:/usr/local/maven/boot/plexus-classworlds-2.5.2.jar:/usr/local/maven/conf/logging jenkins.maven3.agent.Maven31Main /usr/local/maven /data/jenkins/slave.jar /data/jenkins/maven31-interceptor.jar /data/jenkins/maven3-interceptor-commons.jar 45631 Exception in thread "main" java.lang.UnsupportedClassVersionError: hudson/remoting/Launcher : Unsupported major.minor version 52.0 at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:800) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) at java.net.URLClassLoader.defineClass(URLClassLoader.java:449) at java.net.URLClassLoader.access$100(URLClassLoader.java:71) at java.net.URLClassLoader$1.run(URLClassLoader.java:361) at java.net.URLClassLoader$1.run(URLClassLoader.java:355) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:354) at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClassFromSelf(ClassRealm.java:401) at org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy.loadClass(SelfFirstStrategy.java:42) at org.codehaus.plexus.classworlds.realm.ClassRealm.unsynchronizedLoadClass(ClassRealm.java:271) at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:247) at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:239) at jenkins.maven3.agent.Maven31Main.main(Maven31Main.java:138) at jenkins.maven3.agent.Maven31Main.main(Maven31Main.java:67) 经定位,原来 Maven 类型 Job 与 JDK 版本有一定兼容性,部分说明如下: Maven jobs and Java versions compatibility: Because java serialized classes are exchanged between Jenkins master and Maven Jobs it is required that the JVM used to launch Maven is superior or equal to the version of Java for which Jenkins Master is built for. Jenkins >= 1.520 requires Java 6 thus Maven jobs must be launched with Java >= 6. Jenkins >= 1.612 requires Java 7 thus Maven jobs must be launched with Java >= 7. Jenkins >= 2.54 requires Java 8 thus Maven jobs must be launched with Java >= 8. 详见:https://wiki.jenkins.io/display/JENKINS/Maven+Project+Plugin 而我们的这些Job 必须使用指定 JDK 版本构建,不能随意修改 JDK 版本 而自由风格类型的 Job,不会出现这个问题 所以,计划将 Maven 类型 Job 迁移到自由风格类型 如何迁移? 那么如何迁移呢? 统计了下 Maven 类型的 Job,有数百个,手动迁移不现实的 通过 google 发现有前人写的 grovvy 脚本:https://github.com/akomakom/jenkins-scripts/blob/master/maven-to-freestyle.groovy 尝试运行该脚本,可能与环境有关,它会报错 由于对 groovy 不太熟悉,解决起来比较麻烦 所以参考它的逻辑,使用 python 脚本实现了迁移的功能 python 脚本如下所示,有需要的可以自行修改: # -*- coding:utf-8 -*- import xml.etree.ElementTree as ET import sys from jenkinsapi.jenkins import Jenkins reload(sys) sys.setdefaultencoding('utf8') def get_jenkins_server(): JENKINS_URL = "http://127.0.0.1:8080/" JENKINS_USERNAME = "jenkins" JENKINS_PASSWORD = "jenkins" return Jenkins(JENKINS_URL, username=JENKINS_USERNAME, password=JENKINS_PASSWORD, timeout=30) def get_modified_xml(job_config_xml_tree): # create builders node builders_element = ET.Element("builders") job_config_xml_tree.append(builders_element) # Move prebuilders to builders prebuilders_node = job_config_xml_tree.find("prebuilders") if prebuilders_node is not None and prebuilders_node.getchildren() is not None: for pre_builder in prebuilders_node.getchildren(): builders_element.append(pre_builder) job_config_xml_tree.remove(prebuilders_node) # Create a maven block maven_node = ET.Element("hudson.tasks.Maven") builders_element.append(maven_node) move(job_config_xml_tree.find("goals"), job_config_xml_tree, maven_node, "targets") maven_name_node = job_config_xml_tree.find("mavenName") if maven_name_node: move(maven_name_node, job_config_xml_tree, maven_node) else: maven_name_node = ET.Element("mavenName") maven_name_node.text = "Maven" maven_node.append(maven_name_node) move(job_config_xml_tree.find("rootPOM"), job_config_xml_tree, maven_node) move(job_config_xml_tree.find("mavenOpts"), job_config_xml_tree, maven_node) move(job_config_xml_tree.find("settings"), job_config_xml_tree, maven_node) move(job_config_xml_tree.find("globalSettings"), job_config_xml_tree, maven_node) # items that don't exist in maven step: remove(job_config_xml_tree, [ 'resolveDependencies', 'processPlugins', 'siteArchivingDisabled', 'archivingDisabled', 'mavenValidationLevel', 'disableTriggerDownstreamProjects', 'blockTriggerWhenBuilding', 'fingerprintingDisabled', 'incrementalBuild', 'processPlugins', 'siteArchivingDisabled', 'ignoreUpstremChanges', 'rootModule' ]) # Move postbuilders to builders postbuilders_node = job_config_xml_tree.find("postbuilders") if postbuilders_node is not None and postbuilders_node.getchildren() is not None: for post_builder in postbuilders_node.getchildren(): builders_element.append(post_builder) job_config_xml_tree.remove(postbuilders_node) # rename top-level element # new parent node new_job_config_xml_tree = ET.Element("project") for child_node in job_config_xml_tree.getchildren(): new_job_config_xml_tree.append(child_node) return new_job_config_xml_tree def move(from_node, from_parent_node, to_node, to_name=None): if from_node is not None: if to_name: tmp_element_node = ET.Element(to_name) tmp_element_node.text = from_node.text tmp_element_node.attrib = from_node.attrib to_node.append(tmp_element_node) from_parent_node.remove(from_node) else: to_node.append(from_node) from_parent_node.remove(from_node) def remove(from_node, name_list): for name in name_list: tmp_node = from_node.find(name) if tmp_node is not None: from_node.remove(tmp_node) def main(): jenkins_server = get_jenkins_server() job_list = jenkins_server.get_jobs_list() for job_name in job_list: if not job_name.endswith("-DEPRECATED"): job_obj = jenkins_server.get_job(job_name) config_text = job_obj.get_config() config_xml_tree = ET.fromstring(config_text) if config_xml_tree.tag == "maven2-moduleset": new_config_xml_tree = get_modified_xml(config_xml_tree) new_config_xml = ET.tostring(new_config_xml_tree) jenkins_server.rename_job(job_name, job_name + "-DEPRECATED") jenkins_server.create_job(job_name, new_config_xml) print("migrate job from Maven Type to FreeStyle Type: " + job_name) if __name__ == "__main__": main() 参考 https://github.com/akomakom/jenkins-scripts/blob/master/maven-to-freestyle.groovy

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册