文章配套视频专栏:

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应用的更多相关文章

  1. docker 中部署一个springBoot项目

    docker 中部署一个springBoot项目 (1)介绍 springBoot项目 1.项目结构 2.pom.xml <?xml version="1.0" encodi ...

  2. 使用 Visual Studio 开发、测试和部署 Azure Functions(二)测试,部署

    1,引言 上一篇介绍了使用使用 Visual Studio 开发 "Azure Functions" 函数,此篇介绍 “Azure Functions” 的测试以及直接从 Vist ...

  3. 玩转Django2.0---Django笔记建站基础十二(Django项目上线部署)

    第十二章 Django项目上线部署 目前部署Django项目有两种主流方案:Nginx+uWsGI+Django或者Apache+uWSGI+Django.Nginx作为服务器最前端,负责接收浏览器的 ...

  4. Kubernetes 学习笔记(二):本地部署一个 kubernetes 集群

    前言 前面用到过的 minikube 只是一个单节点的 k8s 集群,这对于学习而言是不够的.我们需要有一个多节点集群,才能用到各种调度/监控功能.而且单节点只能是一个加引号的"集群&quo ...

  5. Azure Devops(十四) 使用Azure的私有Nuget仓库

    哈喽大家好,最近因为工作的原因没有时间写文章,断更了俩月,今天我们开始继续研究Azure上的功能. 今天我们开始研究一下Azure的制品仓库,在之前的流水线的相关文章中,我们都使用到了制品仓库用来保存 ...

  6. Azure Devops(十五) 使用Azure的私有Maven仓库

    上一篇文章中,我们介绍了如何使用Azure的nuget仓库,今天我们来研究一下如何使用azure给我们提供的maven仓库. 首先,我们打开azureDevops,点击到制品界面,然后选择maven. ...

  7. Android学习笔记(十二)——实战:制作一个聊天界面

    //此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 运用简单的布局知识,我们可以来尝试制作一个聊天界面. 一.制作 Nine-Patch 图片 : Nine-Pa ...

  8. 二十二、SAP中创建一个内表,并添加内容循环输出显示

    一.直接上代码 二.输出如下

  9. Android项目实战(二十二):启动另一个APP or 重启本APP

    一.启动另一个APP 目前公司项目需求,一个主APP,需要打开某些小APP,这些小APP是整合了Unity的,但是还是android程序(所有小APP的包名是已知的). 以前没做过,查询了一下实现方法 ...

随机推荐

  1. Python form...import...和import的区别(自己理解的)

    Python有两种导入包和模块的方式,区别如下 form...import... import 相对导包 导入不同包子模块 可以导入模块所需变量/函数/类   init文件的__all__特殊变量(模 ...

  2. 什么是编织(Weaving)?

    为了创建一个 advice 对象而链接一个 aspect 和其它应用类型或对象,称为编 织(Weaving).在 Spring AOP 中,编织在运行时执行.

  3. 什么是 Spring 的依赖注入?

    依赖注入,是 IOC 的一个方面,是个通常的概念,它有多种解释.这概念是说你 不用创建对象,而只需要描述它如何被创建.你不在代码里直接组装你的组件和 服务,但是要在配置文件里描述哪些组件需要哪些服务, ...

  4. RENIX非对称时延测试——网络测试仪实操

    本文主要介绍RENIX软件如何进行非对称时延测试.文章分为四部分,第一部分为非对称时延概述,第二部分为测试说明,第三部分为测试配置,第四部分为测试报告. 第一部分:非对称时延概述 1.RFC2544测 ...

  5. 判断集合中存在String字符串 或 判断集合中不存在String字符串

    一.使用场景 用于集合中有多个相近的字符,无法使用包含判断 如: 这里如果我想判断以上集合中是否包含"信封件-DE"就会被"信封件-DE2"影响到 毕竟:&qu ...

  6. css文字颜色渐变的3种实现

    在web前端开发过程中,UI设计师经常会设计一些带渐变文字的设计图,在以前我们只能用png的图片来代替文字,今天可以实现使用纯CSS实现渐变文字了.下面就介绍3中实现方式供大家参考! 基础样式: .g ...

  7. 从 输入网址(URL)到页面展示的过程

    1.用户输入url网址(URL) 用户输入url(也就是我们说的网址,也是统一资源定义符,用于定义互联网资源) 比如输入https://www.baidu.com 其中https为协议 baidu.c ...

  8. template7入门教程及对它的一些看法

    template7是framework7的内置模板引擎,在此之前使用过jquery-tmpl,不过刚刚打开github看了下,已经停止更新,并且将要被JsRender所替代.妹的,JsRender又是 ...

  9. 无需Flash录视频——HTML5中级进阶

    前言 HTML5的权限越来越大了,浏览器可以直接调用摄像头.麦克风了,好激动啊.我们要用纯洁的HTML代码造出自己的天地. 视频采集 本篇介绍的栗子 都是在chrome 47 版本以上的,低版本的可能 ...

  10. web.xml 配置 contextConfigLocation

    web.xml中classpath:和classpath*:  有什么区别? classpath:只会到你的class路径中查找找文件; classpath*:不仅包含class路径,还包括jar文件 ...