在部署项目前需要对源码进行打包,一个简单的SpringBoot项目默认是打包为jar包,也就是在pom.xml中的
方式,当然也会有一些打包成war包方式,使用外置的Tomcat应用服务器部署war包,那么就是
。
在父子类聚合项目中,父工程的pom.xml
文件中的打包方式就需要改为pom
,如下:
<packaging>pompackaging>
那么所有的子工程pom.xml
中,就需要改为jar方式,或者war
jar包是默认的打包方式,子工程如果是打包成jar包那么不需要改任何配置,war包时如下配置
<packaging>warpackaging>
并且所有的子工程中需要,导入maven插件配置
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
<configuration>
<executable>trueexecutable>
<layout>JARlayout>
configuration>
<executions>
<execution>
<goals>
<goal>repackagegoal>
goals>
<configuration>
<attach>falseattach>
configuration>
execution>
executions>
plugin>
plugins>
build>
执行打包
在具有maven环境的情况下,到父工程pom.xml文件所在目录下执行
mvn clean package
即可将此父工程下所有子工程进行打包,假如这里得到了三个jar包为consumer.jar
、provider1.jar
、provider2.jar
那么就可以手动执行部署了。
使用命令行方式去部署3个jar包,可以说非常简单,但还要考虑项目中需要的一些环境:
nohup java -jar consumer.jar > consumer.logs.log 2 >&1 &
nohup java -jar provider1.jar > provider1.logs.log 2 >&1 &
nohup java -jar provider2.jar > provider2.logs.log 2 >&1 &
nohup:不挂断运行
> xxx.logs.log 2 > &1 &
:将程序日志输出到某个位置并且后台运行。
那么这些都是手动运行,目前而言大多都采用了自动化部署。
手动运行需要每次都去上传jar包,然后更新jar重启服务。若服务数量较少还比较好,一旦遇到微服务多jar包情况下,手动就会显得很繁琐而无助。或者说可以采用shell脚本的方式去部署,但这都不是最优秀的解决方案。可以使用Jenkins部署运行服务。
Jenkins的前身是Hudson。Jenkins是一款较为流行的开源持续集成工具,地位几乎可以说是CI&CD软件领导者,已经超过了Hudson,它拥有超过1000个插件来支持项目的构建和部署。几乎可以适用于所有的项目,没有项目编程语言的限制。
CI&CD:
Jenkins的特性:
Jenkins的官网地址是https://www.jenkins.io/,下载软件包的地址https://www.jenkins.io/download/。推荐下载LTS(长期支持)版本。笔者这里选择Generic Java package(.war),只需要java环境即可。
当然要注意你选择版本要和你本地的jdk环境的兼容关系:
笔者是java8的环境,选择一款适用的jenkins版本即可。笔者选择2.346.3
版本。
提供下下载地址:https://get.jenkins.io/war-stable/2.346.3/jenkins.war
运行
java -jar jenkins.war --httpPort=8085
nohup java -jar jenkins.war --httpPort=8085 > jenkins-logs.log 2 >&1 &
服务运行后,成功访问UI页面,记得需要打开防火墙的端口哦
firewall-cmd --permanent --zone=public --add-port=8085/tcp
firewall-cmd --reload
我们需要去上面的相应文件中去找到密码,然后填写,确定即可。
注意:第一次启动Jenkins会初始化去下载一些元(metadata)数据,打开界面时提示等待大概4分钟,等待期间,使用F12调试时,看到报错503是正常现象。等待日志打印Jenkins is fully up adn running 即可
下一步会让用户安装插件,若是新手可以选择Jenkins推荐的插件,可以减少很多的步骤。笔者这里也选择推荐的插件了,唯一的缺点是下载的东西多,稍微会慢点。
完成后创建一个管理员用户
Jenkins初始化完成后,还需要配置一些全局工具,如jdk,maven,git。在Jenkins后台页面点击Manage Jenkins,再点击Global Tool Configuration配置全局工具JDK、maven、git
配置maven
找好你的settings.xml文件
的路径,配置到这里即可。然后再去配置maven的路径
注意:如果你的maven的bin目录没有可执行的权限,要记得增加可执行权限,否则执行命令时会报错:Permission denied,可以在maven的根目录下使用命令赋权:chmod +x -R bin
配置jdk
直接输入JAVA_HOME的安装地址即可
最后配置git的目录,记得先安装git
yum install -y git
使用yum安装的git,目录是/usr/bin/git
持续集成一般有3个组成的要素:
现在还缺少一个代码存储库。在企业中为了掌握代码的所有权,一般都会自动搭建代码存储库。可以使用Gitlab。
GitLab使用git作为代码管理工具,并且在此基础上开发了Web管理页面来进行项目管理。
与github最大的不同是,gitlab部署在自己的服务器上,所有权都是掌握在自己手中。
采用yum方式安装GitLab
yum install -y curl policycoreutils-python openssh-server
systemctl enable sshd
systemctl start sshd
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
systemctl reload firewalld
yum install -y postfix
systemctl enable postfix
systemctl start postfix
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.rpm.sh | bash
EXTERNAL_URL="http://192.168.1.41" yum install -y gitlab-ee
firewall-cmd --permanent --zone=public --add-port=80/tcp
firewall-cmd --reload
/etc/gitlab/initial_root_password
找下初始化密码,然后登录即可Docker方式安装Gitlab
使用Docker方式安装Gitlab是比较快捷的方式,如下命令即可:
mkdir -p /data/gitlab # 先创建gitlab存储数据、配置、日志的目录
docker run -d --hostname 192.168.1.41:80 --publish 443:443 --publish 80:80 --publish 23:22 --name gitlab --restart always --volume /data/gitlab/config:/etc/gitlab --volume /data/gitlab/logs:/var/log/gitlab --volume /data/gitlab/data:/var/opt/gitlab gitlab/gitlab-ee:latest
-d : 后台运行
–hostname:gitlab服务地址
–publish或-p:宿主机和容器的端口映射
–name 设置容器名称
–volume或-v:宿主机和容器的目录映射
–restart always: 开机自启
Gitlab常用命令
现在已经有了存储库,然后创建git仓库把项目上传到Gitlab上面。
git init
git remote add origin http://192.168.1.41/root/jenkins-demo.git
git add .
git commit -m "Initial commit"
git push -u origin main
这些就比较简单了,笔者这里不再赘述了。直接展示下项目的目录
需要注意的是:如果普通用户push代码,可能会没有权限,管理员设置下即可。
Jenkins页面创建任务
clean package
这里的maven命令不需要添加mvn
,请注意!!
#!/bin/bash
# 先停止进程
ps -ef |grep consumer |grep -v 'grep' | awk '{print $2}' | xargs kill -s 15
ps -ef |grep provider-8001 |grep -v 'grep' | awk '{print $2}' | xargs kill -s 15
ps -ef |grep provider-8002 |grep -v 'grep' | awk '{print $2}' | xargs kill -s 15
sleep 5s # 5s后再启动
BUILD_ID=dontKillMe # 表示别干掉启动的程序
cd consumer/target/
nohup java -jar consumer-1.0-SNAPSHOT.jar > consumer.logs.log 2 >&1 &
cd ../../provider-8001/target/
nohup java -jar provider-8001-1.0-SNAPSHOT.jar > provider1.logs.log 2 >&1 &
cd ../../provider-8002/target/
nohup java -jar provider-8002-1.0-SNAPSHOT.jar > provider2.logs.log 2 >&1 &
完事后,保存即可。
同时还可以去看日志信息:
我们可以到服务器上看下程序有没有启动成功
ps -ef |grep java
成功部署了三个jar包。
当我们需要每次提交合并代码时,自动进行项目部署时,可以使用网络钩子Webhook完成我们的需求。
大致流程就是:Jenkins提供一个地址,当代码有更新时代码存储库(gitlab)主动调用一次这个地址,触发Jenkins构建即可。
需要在Jenkins上面安装Generic Webhook Trigger插件
到项目主界面,点击配置,到构建触发器那里,选择Generic Webhook Trigger一项,然后添加一个Token(随便写,但不要重复了)
那么,构建的URL格式如下:
http://JENKINS_URL/generic-webhook-trigger/invoke/invoke?token=刚刚自定义的Token
JENKINS_URL:是JENKINS的访问地址。
此项目中就是如下
http://192.168.1.41:8085/generic-webhook-trigger/invoke/invoke?token=nihaowoshichufaqi
回到gitlab
因为Gitlab10.6版本后,为了安全,默认不允许向本地网络发送Webhook请求,这里因为笔者是把gitlab和jenkins安装到一台服务器了,所以这里先允许发送本地网络webhook。
到gitlab项目中,设置webhook即可。这里暂时写所有分支push时触发了,实际可以按照项目情况执行。
配置完成
完成后,即可提交任意分支的代码,看到jenkins已经自动触发构建了,并且jar也重新启动了