使用Spring Boot应用程序将代码管道化

这是有关基于本地Docker compose堆栈的持续交付的一系列帖子中的最后一篇(请参阅此处的第一篇和第二篇文章 )。 在这篇文章中,我使用一个简单的Spring Boot项目来展示如何利用“ 管道作为代码 ”的概念。 请注意,这仅是示例,还有更多可能。 我使用的应用程序来自Spring Boot站点 。 Jenkinsfile的灵感来自于这篇文章中的内容,但是我不得不修改一些东西才能使其与我的堆栈一起使用。 我的项目的资源可以在这里找到。 我将在这篇文章中解释最重要的片段。
我使用的管道包含以下阶段:

  • 建设阶段
  • 部署阶段
  • 烟雾测试阶段

建设阶段
在构建阶段,我使用GitLab插件检出项目的源代码。 我还将当前的commitId放在工作目录中的textFile中。 接下来,我使用Maven(在Jenkins配置中我们称为“ M3”的代码,如我在此处所述)打包代码。 我还要确保将commitId作为参数传递给Maven。

部署阶段
在部署步骤中,我通过将'true'发布到/ shutdown路径来关闭应用程序的运行实例。 然后,我只需运行上一步中构建的jar。 之后,作业将等待,直到应用程序响应简单的请求。

冒烟测试
在这个简单的测试步骤中,我将返回的已部署服务的commitId与我们签出最新提交的代码时得到的commitId进行了比较。 如果一切顺利,则这两个id应该匹配,如果链中没有什么地方出错了。

本示例仅此而已。 让我们看看这对源代码意味着什么。 由于这是一个Maven项目,因此我从pom.xml开始:

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><!-- used for metrics like status, health etc --><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><!-- used for unit tests --><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
</dependencies>

该项目不需要特殊的依赖关系。 “ spring-boot-starter-web ”用于我们的REST控制器。 ' sprint-boot-starter-actuator '可用于检查运行状况等等 。
最后,使用“ spring-boot-starter-test”可以(对单元进行)单元测试。
让我们看一下Java源代码。 该应用程序仅启动Spring Boot应用程序。 Controller类也非常基础:

package hello;import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;@RestController
public class HelloController {@RequestMapping("/")public String index() {return "Greetings from Spring Boot!";}    
}

如您所见,当GET请求进入“ /”时,我只是返回一个固定的字符串。 测试类具有以下测试代码:

/*** Created by pascal on 19/01/2017.*/
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class HelloControllerTest {@Autowiredprivate MockMvc mvc;@Testpublic void getHello() throws Exception {mvc.perform(MockMvcRequestBuilders.get("/").accept(MediaType.APPLICATION_JSON)).andExpect(status().isOk()).andExpect(content().string(equalTo("Greetings from Spring Boot!")));}
}

我想这也很简单,我希望将固定字符串作为对GET请求的响应。 Java代码旁边是“ application.properties”文件:

server.port=8888
info.app.name=@project.name@
info.app.description=@project.description@
info.app.version=@project.version@
info.app.commitid=@commitid@
endpoints.shutdown.enabled=true

除了两个功能属性,我们正在其上运行应用程序的端口(8888),还具有通过调用端点来关闭应用程序的功能(endpoints.shutdown.enabled = true),其余的将在调用端点'/时显示。信息'。 因为我们过滤了资源,所以Maven将参数@…@替换为实际值:

...
<resources><!-- used for variable substitution in application.properties --><!-- https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-1.3-Release-Notes#maven-resources-filtering --><resource><directory>src/main/resources</directory><filtering>true</filtering></resource>
</resources>
...

最后,我们在项目中有了Jenkinsfile:

import groovy.json.JsonSlurper;properties([[$class: 'GitLabConnectionProperty', gitLabConnection: 'my-gitlab-connection']])node{stage 'Build, Test and Package'env.PATH = "${tool 'M3'}/bin:${env.PATH}"checkout scm// workaround, taken from https://github.com/jenkinsci/pipeline-examples/blob/master/pipeline-examples/gitcommit/gitcommit.groovydef commitid = sh(returnStdout: true, script: 'git rev-parse HEAD').trim()def workspacePath = pwd()sh "echo ${commitid} > ${workspacePath}/expectedCommitid.txt"withMaven(maven: 'M3',mavenSettingsConfig: 'a1adf035-653b-410d-b5a6-16b6da77b322',mavenLocalRepo: '.repository') {// Run the maven buildsh "mvn clean package -Dcommitid=${commitid}"}
}node{stage 'Stop, Deploy and Start'// shutdownsh 'curl -X POST http://localhost:8888/shutdown || true'// copy file to target locationsh 'cp target/*.jar /tmp/'// start the applicationsh 'nohup java -jar /tmp/*.jar &'// wait for application to respondsh 'while ! httping -qc1 http://localhost:8888 ; do sleep 1 ; done'
}node{stage 'Smoketest'def workspacePath = pwd()sh "curl --retry-delay 10 --retry 5 http://localhost:8888/info -o ${workspacePath}/info.json"if (deploymentOk()){return 0} else {return 1}
}def deploymentOk(){def workspacePath = pwd()expectedCommitid = new File("${workspacePath}/expectedCommitid.txt").text.trim()actualCommitid = readCommitidFromJson()println "expected commitid from txt: ${expectedCommitid}"println "actual commitid from json: ${actualCommitid}"return expectedCommitid == actualCommitid
}def readCommitidFromJson() {def workspacePath = pwd()def slurper = new JsonSlurper()def json = slurper.parseText(new File("${workspacePath}/info.json").text)def commitid = json.app.commitidreturn commitid
}

我之前描述了脚本的工作。 Jenkins安装必须匹配三个重要的常量:

  • 在声明中: properties([[$class: 'GitLabConnectionProperty', gitLabConnection: 'my-gitlab-connection']])我-gitlab连接 ”我给我的gitlabConnection在詹金斯为我描述了插件的名称相匹配这里 。
  • 正如我在声明中的“ M3”之前所述:
    env.PATH = "${tool 'M3'}/bin:${env.PATH}"必须与Jenkins中的Maven安装相匹配,如我在此处所述。
  • 最后一行是mavenSettingsConfig: 'a1adf035-653b-410d-b5a6-16b6da77b322' 。 本ID这里提到的是一个复制的设置文件我设置了配置文件提供插件描述这里 。

这就是项目来源的全部。 接下来,让我向您展示如何在Jenkins中创建管道作业。 在仪表板中,选择创建“管道”类型的新作业:

接下来配置此作业,其中最重要的是使用从git获得的Jenkinsfile。 要配置它,我们必须使用用户名/密码登录到Gitlab(我在这里还没有找到使用Gitlab插件的方法。如果要将Jenkinsfiles与项目分开,也可以在此处使用另一个存储库。来源): 现在,当我运行作业时,它将在最后一步失败,并显示以下错误:

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException:不允许脚本使用新的java.io.File java.lang.String
在org.jenkinsci.plugins.scriptsecurity.sandbox.whitelists.StaticWhitelist.rejectNew(StaticWhitelist.java:187)
…。

要使此工作成功运行,有一项最终设置。 默认情况下,管道作业不允许某些操作,因此我必须告诉Jenkins在这种情况下是允许的。
为此,请转到“管理Jenkins”并转到“进程内脚本批准”:
提到了可能的安全漏洞,您必须先批准该漏洞,然后作业才能执行操作: 在单击“批准”按钮后,重新运行该作业,将需要批准另一个漏洞才能使作业成功完成。 现在,构建将成功完成所有三个阶段,如仪表板所示: 到此结束了连续交付和流水线作为代码的示例。 如前所述,这只是管道的一个非常简单的示例,但是您可以使用它来入门该概念并从中获得更多收益。

翻译自: https://www.javacodegeeks.com/2017/03/pipeline-code-spring-boot-application.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/350909.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matlab function的使用

首先创建一个m文件&#xff1b; Matlab函数定义格式&#xff0c;用关键字function定义函数 function [输出变量] 函数名称(输入变量&#xff09; % 注释 % 函数体 简单的函数如下&#xff1a; function [a,b,c]test(d,e,f) ade; bef; cfd; end 函数的调用&#xff1a; …

关键词热度分析工具_阿里国际站外贸独立站关键词的收集

很多朋友在做外贸独立站SEO和阿里巴巴国际站的时候&#xff0c;一定要查找收集一定数量的关键词&#xff0c;并且按照关键词的热度和词品相关性进行分类&#xff0c;从而为后面阿里巴巴国际站发布产品或者独立站谷歌推广打下坚实的基础。所谓磨刀不误砍柴工&#xff0c;好的关键…

matlab区分卷积和相关

区分卷积和相关 图像处理中常常需要用一个滤波器做空间滤波操作。空间滤波操作有时候也被叫做卷积滤波&#xff0c;或者干脆叫卷积&#xff08;离散的卷积&#xff0c;不是微积分里连续的卷积&#xff09;&#xff1b;滤波器也有很多名字&#xff1a;卷积模版、卷积核、掩模、…

2345电脑管家_2345软件管家下载|2345软件管家 2.0 官方正式版

对于很多类似的软件而言&#xff0c;这一款软件在互联网行业也不算无名之辈&#xff0c;毕竟你都搜索到这里&#xff0c;也是认可了这款软件的地位和作用。而且看最新的版本迭代&#xff0c;也有一些比较欣喜的变化&#xff0c;是以前版本所没有的。2345软件管家功能介绍 新一代…

matlab imwrite将图像保存到其他目录

%读入C:\desktop 文件夹下图片test.jpg imgimread(C:\desktop\test.jpg); %用imwrite将图片写入到D:\目标 文件夹下&#xff0c;并重命名为img_propose.jpg imwrite(img,D:\目标\img_propose.jpg);

设计模式 原型模式_原型设计模式:创建另一个小车

设计模式 原型模式创建对象确实是一个耗时的过程&#xff0c;也是一件昂贵的事情。 因此&#xff0c;我们现在正冒险节省时间和金钱。 我们该怎么做&#xff1f; 克隆奇迹多莉 有人记得多莉吗&#xff1f; 是的&#xff0c;是绵羊&#xff0c;是第一个被克隆的哺乳动物。 好吧…

实验四:三角形判断

本次实验问题稍多&#xff0c;出租车计价一题逻辑比较简单&#xff0c;就是情况比较多&#xff0c;在多次尝试后才让程序成功运行。而三角形的判断一题中主要出现了以下几点错误 1.else 和 if 语句不搭配 2.对三角形成立的条件理解不正确&#xff08;是任意两边之和大于第三…

电脑键盘上每个键的作用_眼看着淡出大众视野 键盘上Esc键的隐秘往事

众所周知&#xff0c;苹果一些新的Macbook产品线不仅取消了Esc键&#xff0c;而且还对通常用于多数计算机键盘的功能键布局进行了变更。它们有的被转移到了TouchBar&#xff0c;有的则被永久取消掉了。那个常标配于每个键盘的Esc键&#xff0c;眼看着却有淡出大众视野的趋势——…

matlab save将变量值保存为mat

将变量a的值保存到.mat文件中 save(object.mat,a)

开发人员的新分布式基元

面向对象的原语&#xff08;进程中的原语&#xff09; 作为Java开发人员&#xff0c;我非常熟悉面向对象的概念&#xff0c;例如类&#xff0c;对象&#xff0c;继承&#xff0c;封装&#xff0c;多态性等。除了面向对象的概念之外&#xff0c;我还非常熟悉Java运行时。它提供的…

LOJ.2865.[IOI2018]狼人(Kruskal重构树 主席树)

LOJ洛谷 这题不就是Peaks(加强版)或者归程么。。这算是\(IOI2018\)撞上\(NOI2018\)的题了&#xff1f;\(Kruskal\)重构树&#xff08;具体是所有点按从小到大/从大到小的顺序&#xff0c;依次加入这些点的边&#xff09;&#xff0c;我们可以得到两棵树&#xff08;和那两题不一…

b站在线解析_这款游戏被全B站所唾弃,每个月却依然有5000万玩家坚持在线?!...

彩虹 | 视频安妮 | 编辑《迷你世界》&#xff0c;相信不少人都听过这个名字。这是个非常神奇的游戏&#xff0c;当然并不是指这个游戏很有自己的特色或者有趣的玩法。它神奇的地方在于你随便在bilibili挑一个有关《迷你世界》的视频打开&#xff0c;弹幕都是“呕”、“开炮”、…

linux 安装软件

安装软件 下载软件的源网址所放目录 vi /etc/apt/sources.list sudo apt-get update 更新源 sudo apt-get install xxx 安装软件&#xff0c;xxx为软件名 sudo apt-get build-dep xxx 安装相关的编译环境 sudo apt…

怎么创建数据表的实体类和业务类_怎样创建一个网站?

怎样创建一个网站&#xff1f;创建网站有三个特别重要的元素&#xff0c;域名、服务器和程序&#xff0c;网站域名按照流程注册就可以了&#xff0c;网站服务器根据网站需要的空间选择&#xff0c;这两个只要你查查或者问提供商就可以慢慢操作的&#xff0c;其中最难的程序&…

Neo4j:绘制“我的名字是……我在工作”图

在过去的几天里&#xff0c;我一直在关注DHH兴起的“我的名字是……”的推文。 据我了解&#xff0c;其想法是表明在白板上编写采访谜语/艰巨任务是荒谬的。 您好&#xff0c;我叫大卫。 我将无法在白板上写气泡排序。 我一直在互联网上查找代码。 我不做谜语。 — DHH&#…

LeetCode 705 Design HashSet 解题报告

题目要求 Design a HashSet without using any built-in hash table libraries. To be specific, your design should include these functions: add(value): Insert a value into the HashSet. contains(value) : Return whether the value exists in the HashSet or not.remo…

ubuntu vim命令

打开默认命令模式&#xff0c;按 i键&#xff0c;进入编辑&#xff08;插入&#xff09;模式&#xff1b;编辑完&#xff0c;按Esc键回到命令模式&#xff0c;&#xff1a;&#xff08;冒号&#xff09;进入末行模式 进入编辑模式&#xff0c;键I a o 显示行号 在末行模式下&…

mt4 指标 涨跌幅 颜色k线_Tick级别K线显示指标

tick是指价格的波动&#xff0c;价格每波动一次&#xff0c;tick数加1。这是一个生成新K线图的指标&#xff0c;做这个指标的原因是因为我听说某个机构就是用的这种图表交易的&#xff0c;我在网上找了一下&#xff0c;本来我是想找个现成的Tick图指标看看效果的&#xff0c;结…

java程序打包为jar_将Java应用程序打包为一个(或胖)JAR

java程序打包为jar这篇文章将针对一个有趣但非常强大的概念&#xff1a;将您的应用程序打包为单个可运行的JAR文件&#xff0c;也称为一个或胖 JAR。 我们习惯了大型WAR归档文件&#xff0c;其中包含所有打包在某些常见文件夹结构下的依赖项。 使用类似于JAR的打包&#xff0c…