Jenkins自动构建部署项目

2024-09-08 07:32

本文主要是介绍Jenkins自动构建部署项目,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 楔子

在实际开发中,经常需要编译、静态代码检查、自动化测试、打包、部署、启动等一连串重复机械的动作,浪费时间、而且容易出错,而Jenkins就是专门Continuous integration(CI)/ Continuous Deploy(CD)开源工具,本文简单介绍Jenkins的使用。

在线无安装免费试用Jenkins:http://www.jenkins.org.cn/test

2.jenkins介绍

Jenkins只是一个平台,真正运作的都是插件。这就是jenkins流行的原因,因为jenkins什么插件都有
Hudson是Jenkins的前身,是基于Java开发的一种持续集成工具,用于监控程序重复的工作,Hudson后来被收购,成为商业版。后来创始人又写了一个jenkins,jenkins在功能上远远超过hudson

官网:https://jenkins.io/
插件库:https://plugins.jenkins.io/

3.创建流水线

首先创建一个新的自由风格的流水线,是功能比较强大和自由的流水线方式。
在这里插入图片描述
填写流水线信息和构建结果保留策略:
在这里插入图片描述
配置代码管理,主要是拉取哪个目录的代码、放入哪个目录。
在这里插入图片描述
代码仓库结构为:
在这里插入图片描述
拉取到的效果为:(当前目录为workspace/Travel-dev-deploy Travel-dev-deploy为流水线项目名字)
在这里插入图片描述
可以配置流水线触发策略,比如定时,间隔或者cron表达式等:
在这里插入图片描述
执行gradle脚本完成构建、部署等。主要功能有gradle脚本完成。
在这里插入图片描述
一定要配置gradle脚本的目录,不然gradle的命令task找不到。
在这里插入图片描述
一个可用的部署脚本为:

    task deploy(dependsOn: distTar) {println("configDir------->" + System.getProperty("configDir"))def role = ""if (System.getProperty("configDir") == null || System.getProperty("configDir").isEmpty()) {role = "debug"}println "buildDir------>$buildDir"doLast {ssh.run {session(remotes.travle) {println "role" + role
//                    if (role.equals("debug")) {executeScript '''#!/bin/shcd /u01/SINO/SSP-Travel-Devbin/SSP-Travel stoppwdmv -f /u01/SINO/SSP-Travel-Dev/log /u01/SINO/log-devrm -rf /u01/SINO/SSP-Travel-Dev'''put from: "$buildDir/distributions/SSP-Travel-${version}.tar", into: '/u01/SINO/'execute "tar -xvf /u01/SINO/SSP-Travel-${version}.tar -C /u01/SINO/"execute "mv /u01/SINO/SSP-Travel-${version} /u01/SINO/SSP-Travel-Dev"execute "mv -f /u01/SINO/log-dev /u01/SINO/SSP-Travel-Dev/log"execute "rm -rf /u01/SINO/SSP-Travel-${version}.tar"executeScript '''#!/bin/shcd /u01/SINO/SSP-Travel-Devbin/SSP-Travel stopbin/SSP-Travel debug 5006'''}}}}ssh.settings {knownHosts = allowAnyHosts}remotes {travle {role('debug')host = '1.1.1.1'user = 'root'password = 'xxxxxxx'}}

归档打包部署完成的包:
在这里插入图片描述
构建成果文件在Jenkins上的位置如下,需要把这个文件拷贝归档。
在这里插入图片描述
采用匹配的方式,把所有符合规则的构建成果文件进行归档,效果如下:
在这里插入图片描述
配置邮件发送,构建成功或者失败给 特定的人 和 更改过代码的人发送邮件:

Default Content:默认邮件内容;这里是关键;我这里使用的是模板${SCRIPT, template="groovy-html-dev.template"};后面会讲;当然不想使用模板的话,可以通过使用jenkins自身提供的变量来自己定义;
在这里插入图片描述
下面一定要注意:
在这里插入图片描述
邮件模板采用groovy模板,官方给出了很多的模板(matrix模板、groovy模板):
在这里插入图片描述
本文采用的是Gradle的变成语言groovy模板,官方实例为:
https://github.com/jenkinsci/email-ext-plugin/blob/master/src/main/resources/hudson/plugins/emailext/templates/groovy-html.template

<STYLE>BODY, TABLE, TD, TH, P {font-family: Calibri, Verdana, Helvetica, sans serif;font-size: 12px;color: black;}.console {font-family: Courier New;}.filesChanged {width: 10%;padding-left: 10px;}.section {width: 100%;border: thin black dotted;}.td-title-main {color: white;font-size: 200%;padding-left: 5px;font-weight: bold;}.td-title {color: white;font-size: 120%;font-weight: bold;padding-left: 5px;text-transform: uppercase;}.td-title-tests {font-weight: bold;font-size: 120%;}.td-header-maven-module {font-weight: bold;font-size: 120%;    }.td-maven-artifact {padding-left: 5px;}.tr-title {background-color: <%= (build.result == null || build.result.toString() == 'SUCCESS') ? '#27AE60' : build.result.toString() == 'FAILURE' ? '#E74C3C' : '#f4e242' %>;}.test {padding-left: 20px;}.test-fixed {color: #27AE60;}.test-failed {color: #E74C3C;}
</STYLE>
<BODY><!-- BUILD RESULT --><table class="section"><tr class="tr-title"><td class="td-title-main" colspan=2>BUILD ${build.result ?: 'COMPLETED'}</td></tr><tr><td>URL:</td><td><A href="${rooturl}${build.url}">${rooturl}${build.url}</A></td></tr><tr><td>Project:</td><td>${project.name}</td></tr><tr><td>Date:</td><td>${it.timestampString}</td></tr><tr><td>Duration:</td><td>${build.durationString}</td></tr><tr><td>Cause:</td><td><% build.causes.each() { cause -> %> ${cause.shortDescription} <%  } %></td></tr></table><br/><!-- CHANGE SET --><%def changeSets = build.changeSetsif(changeSets != null) {def hadChanges = false %><table class="section"><tr class="tr-title"><td class="td-title" colspan="2">CHANGES</td></tr><% changeSets.each() { cs_list -> cs_list.each() { cs -> hadChanges = true %><tr><td>Revision<%= cs.metaClass.hasProperty('commitId') ? cs.commitId : cs.metaClass.hasProperty('revision') ? cs.revision : cs.metaClass.hasProperty('changeNumber') ? cs.changeNumber : "" %>by <B><%= cs.author %></B></td><td>${cs.msgAnnotated}</td></tr><% cs.affectedFiles.each() {p -> %><tr><td class="filesChanged">${p.editType.name}</td><td>${p.path}</td></tr><% }}}if ( !hadChanges ) { %><tr><td colspan="2">No Changes</td></tr><% } %></table><br/><% } %><!-- ARTIFACTS --><% def artifacts = build.artifactsif ( artifacts != null && artifacts.size() > 0 ) { %><table class="section"><tr class="tr-title"><td class="td-title">BUILD ARTIFACTS</td></tr><% artifacts.each() {f -> %><tr><td><a href="${rooturl}${build.url}artifact/${f}">${f}</a></td></tr><% } %></table><br/><% } %><!-- MAVEN ARTIFACTS --><%try {def mbuilds = build.moduleBuildsif ( mbuilds != null ) { %><table class="section"><tr class="tr-title"><td class="td-title">BUILD ARTIFACTS</td></tr><%try {mbuilds.each() {m -> %><tr><td class="td-header-maven-module">${m.key.displayName}</td></tr><%m.value.each() { mvnbld -> def artifactz = mvnbld.artifactsif ( artifactz != null && artifactz.size() > 0) { %><tr><td class="td-maven-artifact"><% artifactz.each() {f -> %><a href="${rooturl}${mvnbld.url}artifact/${f}">${f}</a><br/><% } %></td></tr><% }}}} catch(e) {// we don't do anything} %></table><br/><% }} catch(e) {// we don't do anything} %><!-- JUnit TEMPLATE --><%def junitResultList = it.JUnitTestResulttry {def cucumberTestResultAction = it.getAction("org.jenkinsci.plugins.cucumber.jsontestsupport.CucumberTestResultAction")junitResultList.add( cucumberTestResultAction.getResult() )} catch(e) {//cucumberTestResultAction not exist in this build}if ( junitResultList.size() > 0 ) { %><table class="section"><tr class="tr-title"><td class="td-title" colspan="5">${junitResultList.first().displayName}</td></tr><tr><td class="td-title-tests">Name</td><td class="td-title-tests">Failed</td><td class="td-title-tests">Passed</td><td class="td-title-tests">Skipped</td><td class="td-title-tests">Total</td></tr><% junitResultList.each {junitResult -> junitResult.getChildren().each {packageResult -> %><tr><td>${packageResult.getName()}</td><td>${packageResult.getFailCount()}</td><td>${packageResult.getPassCount()}</td><td>${packageResult.getSkipCount()}</td><td>${packageResult.getPassCount() + packageResult.getFailCount() + packageResult.getSkipCount()}</td></tr><% packageResult.getPassedTests().findAll({it.getStatus().toString() == "FIXED";}).each{test -> %><tr><td class="test test-fixed" colspan="5">${test.getFullName()} ${test.getStatus()}</td></tr><% } %><% packageResult.getFailedTests().sort({a,b -> a.getAge() <=> b.getAge()}).each{failed_test -> %><tr><td class="test test-failed" colspan="5">${failed_test.getFullName()} (Age: ${failed_test.getAge()})</td></tr><% }}} %></table><br/><% } %><!-- CONSOLE OUTPUT --><%if ( build.result == hudson.model.Result.FAILURE ) { %><table class="section" cellpadding="0" cellspacing="0"><tr class="tr-title"><td class="td-title">CONSOLE OUTPUT</td></tr><% 	build.getLog(100).each() {line -> %><tr><td class="console">${org.apache.commons.lang.StringEscapeUtils.escapeHtml(line)}</td></tr><% } %></table><br/><% } %>
</BODY>

模板需要在Jenkins的主目录下建立email-templates目录,把模板放入其中,如下所示:
在这里插入图片描述
可以测试下邮件效果:
在这里插入图片描述
邮件的最终效果如下:
在这里插入图片描述

4.邮件添加附件和附件正文

进行如下配置即可添加附件:
在这里插入图片描述
效果如下:
在这里插入图片描述
实现把附件的内容添加到邮件正文,需要使用groovy的邮件模板,采用groovy编程语言的优势进行文件的读取和显示:
在这里插入图片描述
在这里插入图片描述
结果如下:
在这里插入图片描述

5.认证,使用域账户登录

在这里插入图片描述

6.参考文献

  • jenkins 邮件配置之良心之作
  • Jenkins进阶系列之——01使用email-ext替换Jenkins的默认邮件通知
  • Jenkins自动构建部署项目到远程服务器上

这篇关于Jenkins自动构建部署项目的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1147495

相关文章

Nginx分布式部署流程分析

《Nginx分布式部署流程分析》文章介绍Nginx在分布式部署中的反向代理和负载均衡作用,用于分发请求、减轻服务器压力及解决session共享问题,涵盖配置方法、策略及Java项目应用,并提及分布式事... 目录分布式部署NginxJava中的代理代理分为正向代理和反向代理正向代理反向代理Nginx应用场景

vite搭建vue3项目的搭建步骤

《vite搭建vue3项目的搭建步骤》本文主要介绍了vite搭建vue3项目的搭建步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1.确保Nodejs环境2.使用vite-cli工具3.进入项目安装依赖1.确保Nodejs环境

idea+spring boot创建项目的搭建全过程

《idea+springboot创建项目的搭建全过程》SpringBoot是Spring社区发布的一个开源项目,旨在帮助开发者快速并且更简单的构建项目,:本文主要介绍idea+springb... 目录一.idea四种搭建方式1.Javaidea命名规范2JavaWebTomcat的安装一.明确tomcat

pycharm跑python项目易出错的问题总结

《pycharm跑python项目易出错的问题总结》:本文主要介绍pycharm跑python项目易出错问题的相关资料,当你在PyCharm中运行Python程序时遇到报错,可以按照以下步骤进行排... 1. 一定不要在pycharm终端里面创建环境安装别人的项目子模块等,有可能出现的问题就是你不报错都安装

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni

JAVA实现Token自动续期机制的示例代码

《JAVA实现Token自动续期机制的示例代码》本文主要介绍了JAVA实现Token自动续期机制的示例代码,通过动态调整会话生命周期平衡安全性与用户体验,解决固定有效期Token带来的风险与不便,感兴... 目录1. 固定有效期Token的内在局限性2. 自动续期机制:兼顾安全与体验的解决方案3. 总结PS

MyCat分库分表的项目实践

《MyCat分库分表的项目实践》分库分表解决大数据量和高并发性能瓶颈,MyCat作为中间件支持分片、读写分离与事务处理,本文就来介绍一下MyCat分库分表的实践,感兴趣的可以了解一下... 目录一、为什么要分库分表?二、分库分表的常见方案三、MyCat简介四、MyCat分库分表深度解析1. 架构原理2. 分

使用Node.js和PostgreSQL构建数据库应用

《使用Node.js和PostgreSQL构建数据库应用》PostgreSQL是一个功能强大的开源关系型数据库,而Node.js是构建高效网络应用的理想平台,结合这两个技术,我们可以创建出色的数据驱动... 目录初始化项目与安装依赖建立数据库连接执行CRUD操作查询数据插入数据更新数据删除数据完整示例与最佳

linux部署NFS和autofs自动挂载实现过程

《linux部署NFS和autofs自动挂载实现过程》文章介绍了NFS(网络文件系统)和Autofs的原理与配置,NFS通过RPC实现跨系统文件共享,需配置/etc/exports和nfs.conf,... 目录(一)NFS1. 什么是NFS2.NFS守护进程3.RPC服务4. 原理5. 部署5.1安装NF

linux查找java项目日志查找报错信息方式

《linux查找java项目日志查找报错信息方式》日志查找定位步骤:进入项目,用tail-f实时跟踪日志,tail-n1000查看末尾1000行,grep搜索关键词或时间,vim内精准查找并高亮定位,... 目录日志查找定位在当前文件里找到报错消息总结日志查找定位1.cd 进入项目2.正常日志 和错误日