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

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: Jenkins 是一款开源的持续集成(DI)工具,广泛用于项目开发,能提供自动构建,测试,部署等功能。作为领先的开源自动化服务器,Jenkins 提供了数百个插件来支持构建、部署和自动化任何项目。
我是陈皮,一个在互联网 Coding 的 ITer,个人微信公众号「陈皮的JavaLib」关注第一时间阅读最新技术文章。

Jenkins 简介

Jenkins 是一款开源的持续集成(DI)工具,广泛用于项目开发,能提供自动构建,测试,部署等功能。作为领先的开源自动化服务器,Jenkins 提供了数百个插件来支持构建、部署和自动化任何项目。

官网地址:https://www.jenkins.io/

它有如下特点:

  • 持续集成和持续交付
  • 易于安装
  • 易于配置
  • 插件功能
  • 可扩展性
  • 分布式

Jenkins 安装

此安装 Jenkins 基于 Docker 方式。首先拉取 Jenkins 镜像。

docker pull jenkinsci/blueocean

# 上面拉取的是最新的镜像,当时最新镜像对应的tag应该是1.25.3,所以你也可以按如下拉取
# docker pull jenkinsci/blueocean:1.25.3

创建 Jenkins 工作目录,将容器内目录挂载到此目录上,这样我们可以在宿主机上对文件的修改同步到容器内。

mkdir -p /usr/local/jenkins
chmod 777 /usr/local/jenkins

启动容器,同时映射宿主机和容器内端口。

# -d 后台方式启动
# -p 映射端口,宿主机端口:容器内端口
# -v 挂载卷,将容器Jenkins工作目录/var/jenkins_home挂载到宿主机目录/usr/local/jenkins
# -name 给容器起个别名
docker run -d -p 8099:8080 -p 50099:50000 -v /usr/local/jenkins:/var/jenkins_home --name myjenkins jenkinsci/blueocean

查看容器是否启动成功。

[root@chenpihost local]# docker ps
CONTAINER ID   IMAGE                 COMMAND                  CREATED          STATUS          PORTS                                                                                      NAMES
538de1b1b1f5   jenkinsci/blueocean   "/sbin/tini -- /usr/…"   18 seconds ago   Up 17 seconds   0.0.0.0:8099->8080/tcp, :::8099->8080/tcp, 0.0.0.0:50099->50000/tcp, :::50099->50000/tcp   myjenkins

查看 Jenkins 容器日志。

docker logs myjenkins

将 Jenkins 端口添加到防火墙。

firewall-cmd --zone=public --add-port=8099/tcp --permanent
systemctl restart firewalld
firewall-cmd --zone=public --list-ports

配置镜像加速

打开宿主机 Jenkins 工作目录下的hudson.model.UpdateCenter.xml文件。

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

原始内容如下:

<?xml version='1.1' encoding='UTF-8'?>
<sites>
  <site>
    <id>default</id>
    <url>https://updates.jenkins.io/update-center.json</url>
  </site>
</sites>

url 修改为国内的清华大学官方镜像地址,最终内容如下:

<?xml version='1.1' encoding='UTF-8'?>
<sites>
  <site>
    <id>default</id>
    <url>https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json</url>
  </site>
</sites>

重启 Jenkins 服务。

docker stop 容器ID
docker start 容器ID

当然,也可以在登录 Jenkins 后在插件的高级设置里进行配置镜像加速,如下:

1650673746856-ad733f08-a54b-47a8-a173-64e6f0972770.png

登录初始化 Jenkins

在浏览器访问http://jenkins所在主机ip:8099,出现如下界面需要等待些时间。

1650641268873-5713cfa9-0a15-4b40-a00f-07169fa66bc5.png

等待后出现如下界面,需要输入密码。

1650642089658-7938d0c9-5ae5-42c1-8b31-49a6d987f516.png

可以查看宿主机/usr/local/jenkins/secrets/initialAdminPassword文件获取密码。

cat /usr/local/jenkins/secrets/initialAdminPassword

或者进入容器,查看/var/jenkins_home/secrets/initialAdminPassword文件获取密码。

# 进入容器
docker exec -it 容器ID /bin/bash
# 查看密码
cat /var/jenkins_home/secrets/initialAdminPassword

输入密码后,出现如下界面,推荐选择第一种,选择后等待插件安装。

1650642148191-cf7d8ab7-ac27-44e2-a1d4-a160d413e560.png

1650642167773-226e463a-24e5-4816-bc5b-d5120a5ca4dd.png

创建一个 root 用户,并进行登录。

1650642297724-062acb32-c2f8-4c62-a326-704f2c2a3a84.png

登录成功后进入如下页面。

1650642366405-57187eb8-f3b9-49b7-92d1-d5175e67eba8.png

配置 Jenkins

配置 JDK

使用容器方式安装的 Jenkins,容器内已经默认安装好 JDK 了,如下所示:

bash-5.1$ java -version
openjdk version "11.0.14.1" 2022-02-08
OpenJDK Runtime Environment Temurin-11.0.14.1+1 (build 11.0.14.1+1)
OpenJDK 64-Bit Server VM Temurin-11.0.14.1+1 (build 11.0.14.1+1, mixed mode)

bash-5.1$ echo $JAVA_HOME
/opt/java/openjdk
bash-5.1$ 

将 JDK 安装的路径配置到 Jenkins 全局配置中,如下所示:

1650642428228-a35ee3ac-8eda-4d2f-8124-f7fabd6a1665.png

1650642525118-f76c27a1-666f-47b5-bb5c-992b5d0a6c8c.png

配置 Maven

此演示安装 Maven 3.6.3 版本。

1650642660948-649ca1f6-8b6d-4d46-9423-d1da35ccb610.png

安装 Maven 插件

如果我们开发的项目是 Maven 项目的话,就需要安装 Maven 插件,安装后重启 Jenkins。

1650642706144-3909b57a-5c21-4675-8de1-2795961eab8b.png

1650642747759-6deab9c4-5201-4724-af0b-ad055c5f546c.png

在浏览器输入地址http://192.168.164.134:8099/restart重启 Jenkins,然后就可以在新建任务看到 Maven 项目选项了。

1650643032247-9bc9e23e-bdcf-4966-a279-8810560b2cbe.png

配置码云代码仓库实现自动部署

在 Jenkins 上新建一个 Maven 项目。

1650643392628-c4a1ab69-4e58-406c-ad13-deda92cdaedb.png

配置码云上的项目地址,如下。添加凭证时需要输入码云的账号和密码。

1650644085666-556b411d-cf8c-45bf-acda-ffa5f388d773.png

1650643825204-61cf81ec-397f-4229-8064-301ad5a9b89c.png

构建命令根据自身情况进行配置,我们从码云拉取的项目是一个简单的 Maven 项目,所以配置简单命令即可。

1650644163025-8761c662-a784-482a-8fdc-bbdc8b5f2e91.png

Post Steps 选择执行 shell。此步骤是在打包完后进行的操作,此为执行 shell 来启动工程。

1650644457396-caa15c04-fab0-4f47-b1a0-9d2d36d799ce.png

一个简单的启动服务脚本如下:

#!/bin/bash

# 服务名称
SERVER_NAME=jenkins-demo

# 工程所在路径(根据自己情况进行调整)
APP_HOME=$(pwd)

# maven打包后的jar包名
JAR_NAME=jenkins-demo-0.0.1-SNAPSHOT.jar

# 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 &

# 将新进程ID写到文件中
JAVA_PID=$!
echo "${JAVA_PID}" > "${PID_FILE}"

保存好工程配置后,点击立即构建,即可进行代码拉取、构建打包、启动服务。

1650644521395-51941158-0998-4918-a826-1b634ebb6d72.png

我们可以查看构建的控制台输出日志,如下:

1650645263446-578a1004-5f9b-4d9e-99f3-d75c5288483c.png

第一次构建 Maven 项目,因为一开始我们为 Jenkins 配置的是自动下载的 Maven 3.6.3,所以首次需要下载 Maven 安装包,导致构建速度会比较慢,从上图日志可以看出,下载的 Maven 安装包被解压到如下目录:

/var/jenkins_home/tools/hudson.tasks.Maven_MavenInstallation/maven3.6.3/conf

为加快 Maven 项目下载依赖的速度,我们可以打开setting.xml配置文件,将仓库更改为阿里云的。

vi /var/jenkins_home/tools/hudson.tasks.Maven_MavenInstallation/maven3.6.3/conf/settings.xml

将以下内容写入文件中mirrors标签对中间。

<mirror>
  <id>alimaven</id>
  <name>aliyun maven</name>
  <url>https://maven.aliyun.com/nexus/content/groups/public/</url>
  <mirrorOf>central</mirrorOf>        
</mirror>

<mirror>
  <id>maven-default-http-blocker</id>
  <mirrorOf>external:http:*</mirrorOf>
  <name>Pseudo repository to mirror external repositories initially using HTTP.</name>
  <url>http://0.0.0.0/</url>
  <blocked>true</blocked>
</mirror>

我们的 Maven 项目会被部署到容器内的/var/jenkins_home/workspace/目录下。并且会自动执行构建脚本,最终部署成功日志如下:

1650648344021-733540b5-7762-4f3c-b8e7-b96be7446e62.png

最后在容器内访问你的工程接口验证服务是否部署成功。

bash-5.1$ curl 127.0.0.1:15340/test
Hello Jenkins!
bash-5.1$ 

如果你需要在外部访问部署的服务接口,那么需要将你服务的端口通过容器映射到宿主机中,即可以在启动 Jenkins 容器时进行端口映射,假设部署的服务端口为15340,如下:

# -d 后台方式启动
# -p映射端口,宿主机端口:容器内端口
# -v 挂载卷,将容器Jenkins工作目录/var/jenkins_home挂载到宿主机目录/usr/local/jenkins
# -name 给容器起个别名
docker run -d -p 8099:8080 -p 50099:50000 -p 15340:15340 -v /usr/local/jenkins:/var/jenkins_home --name myjenkins jenkinsci/blueocean

本次分享到此结束啦~~

如果觉得文章对你有帮助,点赞、收藏、关注、评论,您的支持就是我创作最大的动力!

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
30天前
|
关系型数据库 MySQL Linux
Docker安装Mysql5.7,解决无法访问DockerHub问题
当 Docker Hub 无法访问时,可以通过配置国内镜像加速来解决应用安装失败和镜像拉取超时的问题。本文介绍了如何在 CentOS 上一键配置国内镜像加速,并成功拉取 MySQL 5.7 镜像。
272 2
Docker安装Mysql5.7,解决无法访问DockerHub问题
|
17天前
|
Prometheus 监控 Cloud Native
基于Docker安装Grafana和Prometheus
Grafana 是一款用 Go 语言开发的开源数据可视化工具,支持数据监控和统计,并具备告警功能。通过 Docker 部署 Grafana 和 Prometheus,可实现系统数据的采集、展示和告警。默认登录用户名和密码均为 admin。配置 Prometheus 数据源后,可导入主机监控模板(ID 8919)进行数据展示。
51 2
|
19天前
|
消息中间件 Linux RocketMQ
在Red Hat Enterprise Linux 9上使用Docker快速安装并部署
通过以上步骤,你可以在Red Hat Enterprise Linux 9上使用Docker快速安装并部署RocketMQ。这种方法不仅简化了安装过程,还提供了一个灵活的环境来管理和扩展消息队列系统。RocketMQ作为一款高性能的分布式消息系统,通过Docker可以实现快速部署和高效管理。
46 2
|
20天前
|
消息中间件 Linux RocketMQ
在Red Hat Enterprise Linux 9上使用Docker快速安装并部署
通过以上步骤,你可以在Red Hat Enterprise Linux 9上使用Docker快速安装并部署RocketMQ。这种方法不仅简化了安装过程,还提供了一个灵活的环境来管理和扩展消息队列系统。RocketMQ作为一款高性能的分布式消息系统,通过Docker可以实现快速部署和高效管理。
29 3
|
24天前
|
运维 监控 jenkins
运维自动化实战:利用Jenkins构建高效CI/CD流程
【10月更文挑战第18天】运维自动化实战:利用Jenkins构建高效CI/CD流程
|
23天前
|
关系型数据库 MySQL Linux
基于阿里云服务器Linux系统安装Docker完整图文教程(附部署开源项目)
基于阿里云服务器Linux系统安装Docker完整图文教程(附部署开源项目)
187 2
|
24天前
|
监控 jenkins 持续交付
Docker和Jenkins有什么不同
【10月更文挑战第18天】Docker和Jenkins有什么不同
|
7天前
|
Docker 容器
【赵渝强老师】使用二进制包方式安装Docker
本文介绍了在企业生产环境中无法直接访问外网时,如何使用Docker官方提供的二进制包进行Docker的离线安装。文章详细列出了从安装wget、下载Docker安装包、解压、复制命令到启动Docker服务的具体步骤,并提供了相关命令和示例图片。最后,还介绍了如何设置Docker为开机自启模式。
|
7天前
|
缓存 Ubuntu Linux
如何安装Docker
如何安装Docker
63 0
|
24天前
|
运维 监控 jenkins
运维自动化实践:利用Jenkins实现高效CI/CD流程
【10月更文挑战第18天】运维自动化实践:利用Jenkins实现高效CI/CD流程