使用 Docker 安装 Jenkins 并实现项目自动化部署

安装步骤

1. 拉取 Jenkins 镜像

首先,拉取 Jenkins 镜像:

docker pull jenkins/jenkins:2.500-jdk21

2. 创建 Jenkins 工作目录

创建 Jenkins 工作目录,并设置权限:

// Jenkins 创建数据卷(持久化数据)

mkdir -p /mnt/datadisks/docker-root/jenkins_5080/{jenkins_home,www}

mkdir -p /mnt/datadisks/docker-root/jenkins_5080/www/html

chmod 777 /mnt/datadisks/docker-root/jenkins_5080
chmod 777 /mnt/datadisks/docker-root/jenkins_5080/jenkins_home
chmod 777 /mnt/datadisks/docker-root/jenkins_5080/www/html

3. 启动 Jenkins 容器

启动 Jenkins 容器,并映射端口和挂载卷:

#启动容器
docker run --name jenkins-5080 -d --restart=always -p 5080:8080 -p 50000:50000  \
  -v /mnt/datadisks/docker-root/jenkins_5080/jenkins_home:/var/jenkins_home \
  -v /mnt/datadisks/docker-root/jenkins_5080/www/html:/var/www/html \
  -v /var/run/docker.sock:/var/run/docker.sock \
  jenkins/jenkins:2.500-jdk21

# 获取jenkins密码
docker exec jenkins-5080 cat /var/jenkins_home/secrets/initialAdminPassword

-p 5080:8080:Web 访问端口(宿主机端口:容器端口)

-p 50000:50000:Jenkins 代理通信端口

-v /mnt/datadisks/docker-root/jenkins_5080/jenkins_home:/var/jenkins_home:持久化 Jenkins 配置和数据

/var/www/html:/var/www/html:将nginx中的静态资源目录共享到jenkins中

/mnt/datadisks/docker-root/jenkins_5080/www/html : /var/www/html`:将nginx中的静态资源目录共享到jenkins中

-v /var/run/docker.sock:/var/run/docker.sock:允许容器内使用宿主机的 Docker(可选,用于在 Jenkins Pipeline 中调用 Docker)

--restart unless-stopped:容器自动重启策略

4. 获取初始管理员密码

查看 Jenkins 容器日志,获取初始管理员密码:

docker logs jenkins-5080

或者进入容器,查看密码文件:

docker exec jenkins-5080 cat /var/jenkins_home/secrets/initialAdminPassword

5. 访问 Jenkins

在浏览器中访问 Jenkins:

http://<your_server_ip>:8080

输入获取的初始管理员密码,完成初始设置。
jenkinsAdmin AdminJenkins

6. 配置插件源

为了加快插件下载速度,可以将插件源设置为国内镜像。编辑 hudson.model.UpdateCenter.xml 文件:

vim /usr/local/jenkins/hudson.model.UpdateCenter.xml

将 URL 修改为:

<url>https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json</url>

xxxxxxxxxx 修改配置文件重启nginx容器docker exec -it nginx service nginx reload查询docker中nginx容器的日志的前10行docker logs --tail="10" nginxdocker容器中安装vim(如果下载不下来,需要配置下国内镜像)apt-get updateapt-get install vimtext

docker restart jenkins-5080

配置 Jenkins

配置 JDK

Jenkins 容器内已经默认安装了 JDK,可以在全局配置中设置 JDK 路径:

/opt/java/openjdk

配置 Maven

安装 Maven 插件,并在全局工具配置中设置 Maven 路径:

/usr/local/maven

创建 Jenkins 任务

创建 Maven 项目

在 Jenkins 上新建一个 Maven 项目,配置代码仓库地址和构建命令。构建完成后,可以通过执行 Shell 脚本来启动服务。

示例 Shell 脚本


\#!/bin/bash

SERVER_NAME=jenkins-demo

APP_HOME=$(pwd)

JAR_NAME=jenkins-demo-0.0.1-SNAPSHOT.jar

JAR_PATH=${APP_HOME}/target

PID_FILE="${APP_HOME}/${SERVER_NAME}.pid"

if [ -f "${PID_FILE}" ]; then

PID=$(cat "${PID_FILE}") && kill -9 $PID && echo "kill process ${PID} finished!"

fi

cd $JAR_PATH

chmod 755 $JAR_NAME

BUILD_ID=dontKillMe nohup java -jar $JAR_NAME &

JAVA_PID=$!

echo "${JAVA_PID}" > "${PID_FILE}"

通过上述步骤,即可使用 Docker 安装 Jenkins 并实现项目的自动化部署

发布SpringBoot项目

1、Publish Over SSH

在插件管理中安装插件 Publish Over SSH

在系统管理 -> 系统配置中设置 Publish Over SSH,用于目标服务器的连接

  • Dashboard->Manage Jenkins -> System
    找到 SSH Servers 添加 SSH 远程服务
图1.png

新建任务

由于是 Gradle 项目,所以我们选择 “构建一个自由风格的软件项目

下面说几个关键的配置点:

图2.png

到达一定的天数或构建数目则自动废弃前面的构建

图3.png

构建触发器,有定时、轮询等情况。GitHub hook选项的意思是,检测代码有没有更新,如果有更新则自动构建。但前提是:GitHub收到提交的代码后要主动通知Jenkins,所以Jenkins所在服务器一定要有外网IP,并且还需要做一系列的配置,本文我们暂时不做详细的介绍。


图4.png

建步骤选的是:执行 shell,由于我要打包的是 manager 模块,所以先进入 manager 目录。先执行 gradle clean 清除之前打的包,再执行 gradle build 命令重新打包。整个项目的代码下载存放的路径在服务器的:/root/.jenkins/workspace 目录下,GradleTest 为我们在 Jenkins 中创建的构建任务名。

图5.png

构建后操作选择:Send build artifacts over SSH,将打好的 Jar 包发送到目标服务器指定的目录下,然后根据命令生成镜像,运行容器。

注意:生成镜像的前提是目标服务器上已经安装完成 docker 服务,基础镜像已经下载完成,dockfile已经正确编写。

构建后操作 在远程服务器上执行 下面的脚本文件


#!/bin/bash
#1.2.3.4.5.6 需要根据不同项目修改不同值
#1.服务名称
SERVER_NAME="mgt-admin"
#2 image 版本
Image_Version="v1.0"
#3 创建 image 的目录
Creat_Image_Path="/docker-images-creat/mgt-hotel"

#4.启动dev配置文件
CONFIG_NAME=prod

#5.源jar路径,mvn打包完成之后,target目录下的jar包或jar包名称(包含后缀)
JAR_NAME="/docker-images-creat/hotel-booking/target/hms-mgt-0.0.1.jar"

#6.端口
PORT=9060

echo "清理$SERVER_NAME的容器"

containerId=$(docker ps -a | grep -w  $SERVER_NAME | awk '{print $1}')
if [ -n "$containerId" ];
then
 docker stop $containerId
 docker rm $containerId
 echo "成功停止、删除容器--"$containerId
fi

imageId=$(docker images | grep -w $SERVER_NAME | awk '{print $3}')
if [ -n "$imageId" ];
then
 docker rmi -f  $imageId
 echo "成功删除镜像--"$imageId
fi

echo "停止并清除镜像完成,进入创建新镜像过程"

# echo "复制jar包到/createImages/demo目录下"

#复制jar包到/createImages/demo目录下
# cp $JAR_PATH/$JAR_NAME $JAR_WORK_PATH

#切换到demo创建镜像文件夹目录下
cd $Creat_Image_Path

#修改文件权限
chmod 755 $JAR_NAME

echo "执行命令创建新镜像"

#执行docker创建镜像命令
docker build -t $SERVER_NAME:$Image_Version .

#删除Dockerfile文本文件
# rm /var/jenkins_home/createImages/$SERVER_NAME/Dockerfile

#运行镜像
docker run --name $SERVER_NAME --restart=always -d -p $PORT:8080 \
-v /mnt/docker-root/hotel-booking/admin/config:/config/ \
-v /mnt/docker-root/hotel-booking/admin/logs-root:/logs-root/ \
-v /mnt/docker-root/hotel-booking/admin/upload_root:/upload_root/ \
--network my-net --log-opt max-size=10m --log-opt max-file=3 $SERVER_NAME:$Image_Version

echo "运行新镜像,流程完毕,端口号为:$PORT"
 

这样我们一次构建就已经完成了 代码下载、打包、停止并删除目标服务器指定的容器、删除镜像、重新生成镜像、启动容器等步骤,通过这一系列的动作完成了整个SpringBoot的项目的环境部署。

通过 docker 命令查询容器运行的日志可查看容器运行的情况,如下:

docker logs -f 85f42a7d3230
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容