Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具。本文使用Jenkins自动构建git仓库中的微服务项目,包括Jenkins的安装,插件的安装;系统环境的配置;docker镜像构建的远程SSH命令;部署到指定的机器等。
Jenkins的官方安装文档地址:
https://www.jenkins.io/doc/book/installing/linux/#red-hat-centos
下面以CentOS为例演示安装过程:
使用下面命令,Jenkins添加仓库
sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key
如果已经导入过key,rpm --import
可能会报错,忽略,继续下面命令:
yum install fontconfig java-11-openjdk
yum install jenkins
使用下面命令编辑服务
vim /usr/lib/systemd/system/jenkins.service
修改用户为root
User=root
Group=root
修改启动端口
Environment="JENKINS_PORT=16060"
修改完成后使用下面命令应用:
systemctl daemon-reload
使用以下命令启用Jenkins服务在启动时启动:
sudo systemctl enable jenkins
使用以下命令启动Jenkins服务:
sudo systemctl start jenkins
使用命令检查Jenkins服务的状态:
sudo systemctl status jenkins
如果你启动报错:
Job for jenkins.service failed because a timeout was exceeded. See "systemctl status jenkins.service" and "journalctl -xe" for details.
可使用下面方式:
方式一:
d /etc/init.d
# 启动
./jenkins start
# 停止
./jenkins stop
# 状态
./jenkins status
方式二:
修改配置文件中的用户名为root
# 老版本
vim /etc/sysconfig/jenkins
JENKINS_USER="root"
# 新版本
vim /usr/lib/systemd/system/jenkins.service
修改为:
User=root
Group=root
更多解决方案见:
当您首次访问新的Jenkins实例时,系统会要求您使用自动生成的密码来解锁它。
浏览器访问:http://ip:16060
(自己配置的端口),等到解锁Jenkins页面出现
从Jenkins控制台日志输出中,复制自动生成的字母数字密码(在2组星号之间)。
cat /var/lib/jenkins/secrets/initialAdminPassword
解锁Jenkins之后,可以选择安装Jenkins的插件,根据需要选择
之后,创建管理员用户。
我这里直接跳过了上述步骤,如果你和我一样,请使用下面账户登陆
账户:admin
密码:
cat /var/lib/jenkins/secrets/initialAdminPassword
更改密码
进入控制面板后,坐上角点击账户名进入Configure
,找到Password
,修改之后Save
即可。
在面板页面点击Manage Jenkins
,在System Configuration
下点击Plugins
在插件页面,左侧选择Available plugins
为了方便自动部署仓库中的微服务项目,请安装如下插件:
Localization: Chinese (Simplified):中文汉化插件
Docker:Docker集成插件(可不安装应该)
GitLab Plugin:GitLab集成插件
Publish Over SSH:远程发布插件
SSH2 Easy:远程脚本执行插件
安装后需要重启Jenkins
在CentOS中还需要安装如下:
本次安装的JDK版本为11.0.20
和自己项目的JDK版本保持一致最合适
JDK下载地址:https://www.oracle.com/cn/java/technologies/downloads/#java11
下载之后解压到服务器的/usr/java/
目录下,重命名为jdk-11.0.20
tar -zxvf jdk-11.0.20_linux-x64_bin.tar.gz
添加配置信息
vim /etc/profile
添加如下内容:
JAVA_HOME=/usr/java/jdk-11.0.20
PATH=$PATH:$JAVA_HOME/bin
CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar
export JAVA_HOME PATH CLASSPATH
保存之后,使用下面命令应用:
source /etc/profile
使用下面命令验证安装
java -version
Maven下载地址:https://maven.apache.org/download.cgi
下载到/usr/local/maven/
,目录下并解压:
tar -zxvf apache-maven-x.x.x-bin.tar.gz
添加阿里云镜像地址
vim /usr/local/maven/apache-maven-3.9.3/conf/settings.xml
找到mirrors
,添加镜像地址
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
添加配置信息
vim /etc/profile
修改为如下内容:
JAVA_HOME=/usr/java/jdk-11.0.20
MAVEN_HOME=/usr/local/maven/apache-maven-3.9.3
PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar
export JAVA_HOME PATH CLASSPATH MAVEN_HOME
保存之后,使用下面命令应用:
source /etc/profile
使用下面命令验证安装
mvn -v
Docker官方安装文档:https://docs.docker.com/engine/install/centos/
安装yum工具
yum install -y yum-utils
更新本地镜像源
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
yum makecache fast
安装Docker
yum install -y docker-ce
启动docker
sudo systemctl start docker
使用下面命令验证安装
docker -v
配置Docker镜像加速
阿里云镜像加速配置文档:
https://help.aliyun.com/zh/acr/user-guide/accelerate-the-pulls-of-docker-official-images
使用下面命令安装即可
yum install -y git
配置Jenkins的Tool,在面板页面点击Manage Jenkins
在System Configuration
下点击System
,找到Server Group Center
新增一个Group
新增一个Server
在System Configuration
下点击Tools
,找到JDK
,勾掉Install automatically
,选择系统安装的JDK
勾掉Install automatically
,选择系统安装的Git
勾掉Install automatically
,选择系统安装的Maven
勾掉Install automatically
,选择系统安装的Docker
配置完成后点击Save
保存即可!
推送微服务到仓库中,使用Gitee新建仓库,并将微服务父工程及其子模块全部推送到Gitee仓库
在有src
目录但是没有启动类的子模块的pom文件中加入一下内容:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>none</mainClass>
<classifier>execute</classifier>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
在需要构建镜像的服务子模块的pom中加入如下内容,注意修改jar文件名,和服务名保持一致
<properties>
<docker.image>docker_storage</docker.image>
</properties>
<build>
<!-- 打包的jar包文件名 -->
<finalName>leadnews-article</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.3.6</version>
<configuration>
<repository>${docker.image}/${project.artifactId}</repository>
<buildArgs>
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>
</plugins>
</build>
在需要构建镜像的服务子模块的根目录(和src
以及target
同级)创建Dockerfile文件
FROM openjdk:11
VOLUME /tmp
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENV JAVA_OPTS="\
-server \
-Xms256m \
-Xmx512m \
-XX:MetaspaceSize=256m \
-XX:MaxMetaspaceSize=512m"
# 空参数,方便创建内容时传参
ENV PARAMS=""
ENTRYPOINT ["sh", "-c", "java -jar ${JAVA_OPTS} /app.jar ${PARAMS}"]
JAR_FILE
是构建参数,在pom文件中有定义修改yaml配置信息(可不修改)
spring:
profiles:
active: prod
修改完成后,重新推送到仓库中!!
如果使用了Nacos作为配置中心,还需要进行如下修改
将配置名改为leadnews-user-dev.yml
和leadnews-user-prod.yml
各一份
leadnews-user-dev.yml
:为开发配置leadnews-user-prod.yml
:为生产配置leadnews-user
:为微服务的spring.application.name
在微服务分模块开发中,这步是必不可少的。为了保证所有模块的依赖正确性,需要提前将所有模块安装到Maven仓库中。
创建Jenkins任务,在首页右侧点击新建任务,选择构建一个自由风格的软件项目
,点击确定;
在配置
页面的源码管理部分,添加一个Git仓库,Credentials
为Git仓库的用户名和密码
在Build Steps
中新增一个构建步骤,选择调用顶层 Maven 目标
版本选择自己配置的Maven,目标中填入install命令
clean install -Dmaven.test.skip=true
完成后点击保存
即可,在新页面点击右侧立即构建
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary for lead-news 0.0.1-SNAPSHOT:
[INFO]
[INFO] lead-news .......................................... SUCCESS [ 1.347 s]
[INFO] leadnews-model ..................................... SUCCESS [ 5.066 s]
[INFO] leadnews-utils ..................................... SUCCESS [ 0.576 s]
[INFO] leadnews-common .................................... SUCCESS [ 2.494 s]
[INFO] leadnews-feign-api ................................. SUCCESS [ 0.982 s]
[INFO] leadnews-gateway ................................... SUCCESS [ 0.318 s]
[INFO] leadnews-app-gateway ............................... SUCCESS [ 0.641 s]
[INFO] leadnews-wemedia-gateway ........................... SUCCESS [ 0.665 s]
[INFO] leadnews-service ................................... SUCCESS [ 0.141 s]
[INFO] leadnews-user ...................................... SUCCESS [ 1.374 s]
[INFO] leadnews-basic ..................................... SUCCESS [ 0.016 s]
[INFO] leadnews-file-starter .............................. SUCCESS [ 0.787 s]
[INFO] leadnews-article ................................... SUCCESS [ 2.475 s]
[INFO] leadnews-wemedia ................................... SUCCESS [ 2.404 s]
[INFO] leadnews-schedule .................................. SUCCESS [ 1.330 s]
[INFO] leadnews-search .................................... SUCCESS [ 2.417 s]
[INFO] leadnews-behavior .................................. SUCCESS [ 1.913 s]
[INFO] leadnews-test ...................................... SUCCESS [ 0.057 s]
[INFO] es-init ............................................ SUCCESS [ 0.619 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 26.854 s
[INFO] Finished at: 2023-08-15T13:50:30+08:00
[INFO] ------------------------------------------------------------------------
Finished: SUCCESS
这一步是将提供服务的微服务模块构建为Docker镜像,确保该模块的pom文件配置了构建命令,且根目录下有Dockerfile文件;否则参考修改项目配置
1、同样创建一个自由风格
的Jenkins任务,Git仓库配置同上
2、在Build Steps
中添加调用顶层 Maven 目标
,目标中填入如下命令:
clean install -Dmaven.test.skip=true dockerfile:build -f leadnews-service/leadnews-user/pom.xml
3、在Build Steps
中添加执行 shell
,目标中填入如下命令:
if [ -n "$(docker ps -a -f name=$JOB_NAME --format '{{.ID}}')" ]; then
# 删除之前的容器
docker rm -f $(docker ps -a -f name=$JOB_NAME --format '{{.ID}}')
fi
# 清理镜像
docker image prune -f
# 启动docker服务
docker run -d --net=host -e PARAMS="--spring.profiles.active=prod" --name $JOB_NAME docker_storage/$JOB_NAME
#JOB_NAME
为Jenkins任务的名称,需要和构建的jar包文件名以及Docker镜像名保持一致构建日志:
[INFO] Building jar: /var/lib/jenkins/workspace/leadnews-user/leadnews-service/leadnews-user/target/leadnews-user-docker-info.jar
[INFO] Successfully built docker_storage/leadnews-user:latest
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 18.869 s
[INFO] Finished at: 2023-08-16T13:16:25+08:00
[INFO] ------------------------------------------------------------------------
[leadnews-user] $ /bin/sh -xe /tmp/jenkins7230786785147070619.sh
++ docker ps -a -f name=leadnews-user --format '{{.ID}}'
+ '[' -n de7f106527bc ']'
++ docker ps -a -f name=leadnews-user --format '{{.ID}}'
+ docker rm -f de7f106527bc
de7f106527bc
+ docker image prune -f
+ docker run -d --net=host -e PARAMS=--spring.profiles.active=prod --name leadnews-user docker_storage/leadnews-user
ee78a237a4d8647b5e305f2d0a12b437ddc887d69d63e04dd6d238d67b6f705c
Finished: SUCCESS
来到系统中,查看构建的镜像
[root@VM-28-13-centos maven]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker_storage/leadnews-user latest 61d0675c5e36 2 minutes ago 759 MB
查看运行的容器
[root@VM-28-13-centos maven]# docker ps
CONTAINER ID IMAGE CREATED STATUS PORTS NAMES
ee78a237a4d8 docker_storage/leadnews-user 3 minutes ago Up 3 minutes leadnews-user
如果需要将构建的镜像在其他机器上启动,需要配置一个镜像仓库,将构建的镜像推送到镜像仓库,然后其他机器中镜像仓库中拉取镜像并启动容器
下载最新Registry镜像
docker pull registry
启动Registry镜像服务
docker run -d -p 5000:5000 --name registry -v /usr/local/docker/registry:/var/lib/registry registry
配置Docker客户端,重启docker后生效
vim /lib/systemd/system/docker.service
访问地址:
http://ip:5000/v2/_catalog
对于使用 systemd
的系统,请在 /etc/docker/daemon.json
中写入如下内容
{
"insecure-registries": [
"ip:5000"
]
}
重启Dokcer
systemctl restart docker
构建参数
名称: docker_registry # 仓库名
默认值: 124.221.23.47:5000 # 镜像仓库地址
shell脚本
image_tag=$docker_registry/docker_storage/$JOB_NAME
echo '================docker镜像清理================'
if [ -n "$(docker ps -a -f name=$JOB_NAME --format '{{.ID}}')" ]; then
# 删除之前的容器
docker rm -f $(docker ps -a -f name=$JOB_NAME --format '{{.ID}}')
fi
# 清理镜像
docker image prune -f
# 创建TAG
docker tag docker_storage/$JOB_NAME $image_tag
echo '================docker镜像推送================'
# 推送镜像
docker push $image_tag
# 删除Tag
docker rmi $image_tag
echo '================docker镜像清理================'
新增构建步骤,选择远程执行命令
echo '================拉取最新镜像================'
docker pull $docker_registry/docker_storage/$JOB_NAME
echo '================删除清理容器镜像================'
if [ -n "$(docker ps -a -f name=$JOB_NAME --format '{{.ID}}')" ]; then
# 删除之前的容器
docker rm -f $(docker ps -a -f name=$JOB_NAME --format '{{.ID}}')
fi
# 清理镜像
docker image prune -f
echo '================启动容器================'
docker run -d --net=host -e PARAMS="--spring.profiles.active=prod" --name $JOB_NAME $docker_registry/docker_storage/$JOB_NAME
手机扫一扫
移动阅读更方便
你可能感兴趣的文章