Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具。本文使用Jenkins自动构建git仓库中的微服务项目,包括Jenkins的安装,插件的安装;系统环境的配置;docker镜像构建的远程SSH命令;部署到指定的机器等。
部署Jenkins 安装Jenkins Jenkins的官方安装文档地址:
下面以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
配置Jenkins 使用下面命令编辑服务
vim /usr/lib/systemd/system/jenkins.service
修改用户为root
修改启动端口
Environment="JENKINS_PORT=16060"
修改完成后使用下面命令应用:
启动Jenkins 使用以下命令启用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
更多解决方案见:
https://zhuanlan.zhihu.com/p/609882788
解锁Jenkins 当您首次访问新的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
为了方便自动部署仓库中的微服务项目,请安装如下插件:
安装后需要重启Jenkins
系统配置 在CentOS中还需要安装如下:
安装JDK 本次安装的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
添加配置信息
添加如下内容:
JAVA_HOME=/usr/java/jdk-11.0.20 PATH=$PATH :$JAVA_HOME /bin CLASSPATH=$JAVA_HOME /jre/lib/ext:$JAVA_HOME /lib/tools.jarexport JAVA_HOME PATH CLASSPATH
保存之后,使用下面命令应用:
使用下面命令验证安装
安装Maven 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 >
添加配置信息
修改为如下内容:
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.jarexport JAVA_HOME PATH CLASSPATH MAVEN_HOME
保存之后,使用下面命令应用:
使用下面命令验证安装
安装Docker Docker官方安装文档:https://docs.docker.com/engine/install/centos/
安装yum工具
更新本地镜像源
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
启动docker
sudo systemctl start docker
使用下面命令验证安装
配置Docker镜像加速
阿里云镜像加速配置文档:
https://help.aliyun.com/zh/acr/user-guide/accelerate-the-pulls-of-docker-official-images
安装Git 使用下面命令安装即可
配置Jenkins 配置Jenkins的Tool,在面板页面点击Manage Jenkins
配置SSH 在System Configuration
下点击System
,找到Server Group Center
新增一个Group
新增一个Server
配置JDK 在System Configuration
下点击Tools
,找到JDK
,勾掉Install automatically
,选择系统安装的JDK
配置Git 勾掉Install automatically
,选择系统安装的Git
配置Maven 勾掉Install automatically
,选择系统安装的Maven
配置Docker 勾掉Install automatically
,选择系统安装的Docker
配置完成后点击Save
保存即可!
部署微服务 推送微服务 推送微服务到仓库中,使用Gitee新建仓库,并将微服务父工程及其子模块全部推送到Gitee仓库
修改项目配置 在有src
目录但是没有启动类的子模块的pom文件中加入一下内容:
pom.xml <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文件名,和服务名保持一致
pom.xml <properties > <docker.image > docker_storage</docker.image > </properties > <build > <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_FILECOPY ${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} " ]
修改yaml配置信息(可不修改)
spring: profiles: active: prod
修改完成后,重新推送到仓库中!!
修改Nacos配置 如果使用了Nacos作为配置中心,还需要进行如下修改
将配置名改为leadnews-user-dev.yml
和leadnews-user-prod.yml
各一份
leadnews-user-dev.yml
:为开发配置
leadnews-user-prod.yml
:为生产配置
leadnews-user
:为微服务的spring.application.name
安装模块到Maven 在微服务分模块开发中,这步是必不可少的。为了保证所有模块的依赖正确性,需要提前将所有模块安装到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镜像 这一步是将提供服务的微服务模块构建为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
-f [path]/pom.xml :其中 path 为pom文件在仓库中的位置
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 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] REPOSITORY TAG IMAGE ID CREATED SIZE docker_storage/leadnews-user latest 61d0675c5e36 2 minutes ago 759 MB
查看运行的容器
[root@VM-28-13-centos maven] CONTAINER ID IMAGE CREATED STATUS PORTS NAMES ee78a237a4d8 docker_storage/leadnews-user 3 minutes ago Up 3 minutes leadnews-user
部署到指定机器 如果需要将构建的镜像在其他机器上启动,需要配置一个镜像仓库,将构建的镜像推送到镜像仓库,然后其他机器从镜像仓库中拉取镜像并启动容器
镜像仓库 下载最新Registry镜像
启动Registry镜像服务
docker run -d -p 5000:5000 --name registry -v /usr/local/docker/registry:/var/lib/registry registry
访问地址:
http://ip:5000/v2/_catalog
对于使用 systemd
的系统,请在 /etc/docker/daemon.json
中写入如下内容
{ "insecure-registries" : [ "ip:5000" ] }
重启Dokcer
创建任务 构建参数
名称: 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 docker tag docker_storage/$JOB_NAME $image_tag echo '================docker镜像推送================' docker push $image_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 -fecho '================启动容器================' docker run -d --net=host -e PARAMS="--spring.profiles.active=prod" --name $JOB_NAME $docker_registry /docker_storage/$JOB_NAME