Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具。本文使用Jenkins自动构建git仓库中的微服务项目,包括Jenkins的安装,插件的安装;系统环境的配置;docker镜像构建的远程SSH命令;部署到指定的机器等。

部署Jenkins

安装Jenkins

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

配置Jenkins

使用下面命令编辑服务

vim /usr/lib/systemd/system/jenkins.service

修改用户为root

User=root
Group=root

修改启动端口

Environment="JENKINS_PORT=16060"

修改完成后使用下面命令应用:

systemctl daemon-reload

启动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实例时,系统会要求您使用自动生成的密码来解锁它。

  1. 浏览器访问:http://ip:16060(自己配置的端口),等到解锁Jenkins页面出现

  2. 从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环境
  • Maven环境
  • Docker环境

安装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

添加配置信息

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

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

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

安装Git

使用下面命令安装即可

yum install -y 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文件中加入一下内容:

<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配置

如果使用了Nacos作为配置中心,还需要进行如下修改

将配置名改为leadnews-user-dev.ymlleadnews-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服务
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

使用Jenkins部署Git仓库微服务项目的更多相关文章

  1. 微服务项目Git仓库自动化脚本

    说明 基于微服务项目,产生的的多项目仓库管理脚本. 目录结构 xxxx Xxx1Api/ Xxx2Api/ git_clone_api.sh git_branch_dev.sh git_pull_al ...

  2. K8S+Jenkins自动化构建微服务项目(后续)

    因为之前写过基于K8S部署jenkins master/slave平台,在这个的基础上构建微服务到K8S集群中 Jenkins-slave构建微服务项目到K8S集群 1.微服务项目上传到git仓库 这 ...

  3. Docker实战 | 第二篇:IDEA集成Docker插件实现一键自动打包部署微服务项目,一劳永逸的技术手段值得一试

    一. 前言 大家在自己玩微服务项目的时候,动辄十几个服务,每次修改逐一部署繁琐不说也会浪费越来越多时间,所以本篇整理通过一次性配置实现一键部署微服务,实现真正所谓的一劳永逸. 二. 配置服务器 1. ...

  4. Docker部署golang微服务项目

    这篇博客是为了记录一下部署步骤. 因为实训需要,我要在服务器上用docker部署我们小组的微服务项目.我们的微服务有Gateway,User,Scene,Device四个部分,分别占用不同的端口,其中 ...

  5. docker微服务部署之:三,搭建Zuul微服务项目

    docker微服务部署之:二.搭建文章微服务项目 一.新增demo_eureka模块,并编写代码 右键demo_parent->new->Module->Maven,选择Module ...

  6. docker微服务部署之:二、搭建文章微服务项目

    docker微服务部署之:一,搭建Eureka微服务项目 一.新增demo_article模块,并编写代码 右键demo_parent->new->Module->Maven,选择M ...

  7. docker微服务部署之:一,搭建Eureka微服务项目

    先说明一下docker需要搭建的微服务的基本情况: 项目情况:一个demo_parent项目,下面三个子模块:demo_eureka(eureka服务).demo_article(文章服务).demo ...

  8. 【spring colud】spring cloud微服务项目搭建【spring boot2.0】

    spring cloud微服务项目搭建 =================================== 示例版本: 1.spring boot 2.0版本 2.开发工具 IntellJ IDE ...

  9. SpringCloud(1)---基于RestTemplate微服务项目案例

    基于RestTemplate微服务项目 在写SpringCloud搭建微服务之前,我想先搭建一个不通过springcloud只通过SpringBoot和Mybatis进行模块之间额通讯.然后在此基础上 ...

  10. Docker 搭建 ELK 读取微服务项目的日志文件

    思路: 在docker搭建elasticsearch与kibana来展示日志,在微服务部署的机子上部署logstash来收集日志传到elasticsearch中,通过kibana来展示,logstas ...

随机推荐

  1. 2022-03-27:class AreaResource { String area; // area表示的是地区全路径,最多可能有6级,比如: 中国,四川,成都 或者 中国,浙江,杭州 Str

    2022-03-27:class AreaResource { String area; // area表示的是地区全路径,最多可能有6级,比如: 中国,四川,成都 或者 中国,浙江,杭州 Strin ...

  2. 【Java】包名规范及整理

    目录 前言 包名规范 总结 前言 最近学习Java的时候,有一个 class 需要在每一个 java文件中写一写,然后我喜欢一次实验的java文件放到一个 Package 中,这就导致了持续不断的报错 ...

  3. Github疯传!200本计算机经典书籍!

    好书在精不在多,每一本经典书籍都值得反复翻阅,温故而知新! 下面分享几本计算机经典书籍,都是我自己看过的. 重构 改善既有代码的设计 就像豆瓣评论所说的,看后有种醍醐灌顶.欲罢不能的感觉.无论你是初学 ...

  4. WPF中关于转换器

    实例:关于播放器按钮状态的改变 说明:对Kind(种类)的绑定首先在viewmodel中声明一个属性IsPlay,然后在转换器中实现按钮的状态 转换器 在解决方案中的项目里新建一个Converters ...

  5. 2022 i春秋冬季赛

    Misc nan's analysis 下载附件之后,打开是一道流量数据包. 开始分析流量,首先看到的是FTP流量 追踪tcp,发现ftp账号密码 先记录一下,接下来发现一个zip文件,选择原始数据, ...

  6. 安装指定版本的mysql(mysql5.7)

    安装指定版本的mysql(mysql5.7) 目标:解决需求,安装mysql5.7 前言: 安装软件的三种方式: rpm 安装 源代码编译安装 yum仓库安装 本地光盘 阿里云yum源 自建yum仓库 ...

  7. JetBrain学信网注册(Clion)

    一.打开网站 首先打开JetBrains关于学生认证的网站:https://www.jetbrains.com/shop/eform/students,可以看见以下页面: 二.人工验证 人工验证适合于 ...

  8. Python编程和数据科学中的人工智能:如何创建复杂的智能系统并提高模型性能

    目录 1. 引言 2. 技术原理及概念 3. 实现步骤与流程 4. 应用示例与代码实现讲解 标题:<Python编程和数据科学中的人工智能:如何创建复杂的智能系统并提高模型性能> 1. 引 ...

  9. Maven进阶学习指南

    前言 当我们在开发项目时,有时需要用到外部依赖组件,例如当我们需要Json序列化的时候需要用到FastJson组件,我们可以通过下载对应jar包加载到项目中.但当一个大的项目同时需要依赖各种各样的外部 ...

  10. 一文了解 io.Copy 函数

    1. 引言 io.Copy 函数是一个非常好用的函数,能够非常方便得将数据进行拷贝.本文我们将从io.Copy 函数的基本定义出发,讲述其基本使用和实现原理,以及一些注意事项,基于此完成对io.Cop ...