Azure DevOps (十二) 通过Azure Devops部署一个SpringBoot应用
文章配套视频专栏:
https://space.bilibili.com/38649342/channel/seriesdetail?sid=2267536
视频正在努力更新。
上一篇文章中,我们通过Azure Devops完成了一个.NET Corey应用的部署,今天我们来实现一下JAVA的Spring Boot应用的部署。
首先我们创建一个springboot的模板项目,直接使用IDEA的Spring Initializr我们选择JDK的版本为1.8,springboot的版本我们选择2.3,当然也可以用更新版本的,这个根据大家自己的喜好来。

创建完成,之后我们按照之前的步骤,把我们的代码同步到azure上去,首先我们创建一个名叫:azure_java_app的仓库
创建好仓库之后,我们把我们的代码同步到仓库里去,这里还是要注意,azure和我们的使用习惯不太一样的点就是,他的默认仓库是main不是我们习惯的master
不知道怎么同步代码到azure仓库的可以查看我之前的文章:
Azure DevOps (一) 托管自己的Git仓库

代码同步完成之后,我们开始创建我们的编译流水线
首先,我们创建一条新的流水线叫:azure_java_app,创建流水线的时候一定要注意,不要选错了分支,流水线默认是创建在main分支上的,我们需要在左上角切换到master分支
或者我们可以在项目文件中,先创建一个名为:azure_pipeline.yml的空白yaml文件,创建流水线的时候,切换到master分支选择根据yaml文件创建,即可。

然后我们开始编辑流水线的文件,我们需要添加两个步骤:使用maven编译springboot应用和上传我们编译好的jar包到流水线仓库
点击右侧插件搜索框,分别搜索和添加:maven和PublishBuildArtifacts,注意顺序不要乱,一定要看左侧的流水线脚本的真实代码顺序。
首先我们先只添加一下maven的编译插件,添加完成后指定好POM的目录,这个目录是以你仓库的根目录的相对路径,如果你的POM就是放在根目录下的使用默认的就可以。

我的pom是放在根目录下的,这个是我的流水线脚本
- task: Maven@3
inputs:
mavenPomFile: 'pom.xml'
publishJUnitResults: true
testResultsFiles: '**/surefire-reports/TEST-*.xml'
javaHomeOption: 'JDKVersion'
mavenVersionOption: 'Default'
mavenAuthenticateFeed: false
effectivePomSkip: false
sonarQubeRunAnalysis: false
然后我们先执行一下编译,看看是否可以正常编译成功,并且我们要看一下我们编译后的输出目录在哪,用于填写下一步的制品上传。

我们可以看到我们的工作目录是/home/vsts/work/1/s
我们修改一下我们项目的pom文件,更改一下最终输出jar包的名称,方便我们后续进行操作,我们在pom的build节点中加入<finalName>app</finalName>,这样最后
我们输出的jar包的名称就会叫app.jar
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.7.RELEASE</version>
<configuration>
<mainClass>com.example.azure_java_app.AzureJavaAppApplication</mainClass>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
<finalName>app</finalName>
</build>
然后我们添加上传流水线制品步骤,把编译好的jar包上传到仓库里去

我们在上传流水线制品的时候不要把所有的东西都传上去,浪费空间而且杂乱无章,我们只需要上传我们的app.jar就够了。
- task: PublishBuildArtifacts@1
inputs:
PathtoPublish: '/home/vsts/work/1/s/target/app.jar'
ArtifactName: 'drop'
publishLocation: 'Container'
然后运行一下我们的流水线,看看执行结果。

可以看到流水线制品已经成功上传了。
然后我们开始编写部署流水线
我们创建一条部署流水线,通过SFTP上传我们的jar包到服务器上去,创建服务连接信息的步骤不在赘述,前几篇文章中都有写过。

然后我们去服务器上编写一下守护进程的文件,要注意指定对工作目录和执行用户
[Unit]
Description=Example JAVA APP running on Ubuntu [Service]
WorkingDirectory=/home/azure_app
ExecStart=/usr/bin/java -jar /home/azure_app/app.jar
Restart=always
# Restart service after 10 seconds if the dotnet service crashes:
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=azure_java
User=root [Install]
WantedBy=multi-user.target
接下来启动一下我们的守护进程
#app是service文件的名字
systemctl enable app
systemctl start app
访问一下我们的服务地址看看效果

然后我们在部署流水线中添加第二个步骤,用来重启我们的守护进程。

然后我们修改一下我们的返回结果重新执行一下流水线,看看效果。

重新运行流水线后,访问地址:

重新访问,输出友好问候。

到这里我们就完成了一个简单的JAVA的部署例子,视频已经录制好了,正在剪辑,视频中有更多细节,欢迎大家指正。
Azure DevOps (十二) 通过Azure Devops部署一个SpringBoot应用的更多相关文章
- docker 中部署一个springBoot项目
docker 中部署一个springBoot项目 (1)介绍 springBoot项目 1.项目结构 2.pom.xml <?xml version="1.0" encodi ...
- 使用 Visual Studio 开发、测试和部署 Azure Functions(二)测试,部署
1,引言 上一篇介绍了使用使用 Visual Studio 开发 "Azure Functions" 函数,此篇介绍 “Azure Functions” 的测试以及直接从 Vist ...
- 玩转Django2.0---Django笔记建站基础十二(Django项目上线部署)
第十二章 Django项目上线部署 目前部署Django项目有两种主流方案:Nginx+uWsGI+Django或者Apache+uWSGI+Django.Nginx作为服务器最前端,负责接收浏览器的 ...
- Kubernetes 学习笔记(二):本地部署一个 kubernetes 集群
前言 前面用到过的 minikube 只是一个单节点的 k8s 集群,这对于学习而言是不够的.我们需要有一个多节点集群,才能用到各种调度/监控功能.而且单节点只能是一个加引号的"集群&quo ...
- Azure Devops(十四) 使用Azure的私有Nuget仓库
哈喽大家好,最近因为工作的原因没有时间写文章,断更了俩月,今天我们开始继续研究Azure上的功能. 今天我们开始研究一下Azure的制品仓库,在之前的流水线的相关文章中,我们都使用到了制品仓库用来保存 ...
- Azure Devops(十五) 使用Azure的私有Maven仓库
上一篇文章中,我们介绍了如何使用Azure的nuget仓库,今天我们来研究一下如何使用azure给我们提供的maven仓库. 首先,我们打开azureDevops,点击到制品界面,然后选择maven. ...
- Android学习笔记(十二)——实战:制作一个聊天界面
//此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 运用简单的布局知识,我们可以来尝试制作一个聊天界面. 一.制作 Nine-Patch 图片 : Nine-Pa ...
- 二十二、SAP中创建一个内表,并添加内容循环输出显示
一.直接上代码 二.输出如下
- Android项目实战(二十二):启动另一个APP or 重启本APP
一.启动另一个APP 目前公司项目需求,一个主APP,需要打开某些小APP,这些小APP是整合了Unity的,但是还是android程序(所有小APP的包名是已知的). 以前没做过,查询了一下实现方法 ...
随机推荐
- 面试问题之C++语言:如何避免内存泄漏?
转载于:https://www.php.cn/csharp-article-416104.html 1.不要手动管理内存,可以尝试在适用的情况下使用智能指针. 2.使用string而不是char*.s ...
- 学习MFS(六)
一.文件系统选型 在一般的生产环境中,NFS共享存储算是比较常用的,简单.方便,但随着业务的不断扩展,数据量也是承爆发式的增长,因而对存储这些数据的文件系统要求也越来越高了,分存式.可扩展.大容量,这 ...
- 4-Pandas数据预处理之数据转换(df.map()、df.replace())
在数据分析中,根据需求,有时候需要将一些数据进行转换,而在Pandas中,实现数据转换的常用方法有: 利用函数或是映射 可以将自己定义的或者是其他包提供的函数用在Pandas对象上实现批量修改. ap ...
- 前端工作面试HTML相关问题
前端工作面试HTML相关问题 Q: doctype(文档类型)的作用是什么? A: 在HTML中 doctype 有两个主要目的. 对文档进行有效性验证: 它告诉用户代理和校验器这个文档是按照什么DT ...
- Canvas 核心技术
最近项目需求中要写较多H5小游戏,游戏本身体量不是很复杂,主要是承载较多业务逻辑,所以决定用canvas来完成游戏部分.之前只是知道H5中有canvas这个东西,也知道它大概是画图的,但具体怎么用,还 ...
- 手撕spring核心源码,彻底搞懂spring流程
引子 十几年前,刚工作不久的程序员还能过着很轻松的日子.记得那时候公司里有些开发和测试的女孩子,经常有问题解决不了的,不管什么领域的问题找到我,我都能帮她们解决.但是那时候我没有主动学习技术的意识,只 ...
- route -n 讲解
我们经常会出现临时添加路由,或者是路由重启路由丢失等导致网络不通的情况,上网查发现很多介绍或者没有实验跟进导致理解的时候很费劲的情况,可能人家认为是比较简单的事情了,但是很多不尽然,老手也不一定能很快 ...
- MySQL 表数据多久刷一次盘?
前言 事情是这样的,在某乎的邀请回答中看到了这个问题: - 然后当时我没多想就啪一下写下来这样的答案: 这个其实要通过 MySQL 后台线程来刷的,在 Buffer Pool 中被修改的过的 Page ...
- Array实现
(一)基本类型数组实现 public class Array { private int[] data; private int size; // 构造函数,传入数组的容量capacity构造Arra ...
- Git原理学习记录
Git原理学习记录 1.git init git-test git init 实际上就是在特定的目录下创建对应的目录和文件 2.object $ echo "V1" > ...