Jenkins 是一款流行的开源自动化服务器,广泛用于持续集成(CI)和持续交付(CD)流程的自动化。通过 Docker 部署 Jenkins 可以简化安装和配置过程,同时保证在不同环境下的一致性。本篇文章将介绍如何使用 Docker 部署 Jenkins。
1. 环境准备
在开始之前,请确保你的机器上已经安装了 Docker。如果尚未安装,可以参考 Docker 官方文档进行安装:Docker安装指南
2. 拉取 Jenkins 官方 Docker 镜像
Jenkins 官方提供了适用于 Docker 的镜像,我们可以直接从 Docker Hub 拉取该镜像。打开终端并执行以下命令:
这里的 jenkins/jenkins:lts
是 Jenkins 的长期支持(LTS)版本,通常是最稳定的版本。
摘取镜像
bash
docker pull jenkinsci/blueocean
建议使用的Docker映像是jenkinsci/blueoceanimage(来自 the Docker Hub repository)。 该镜像包含当前的长期支持 (LTS) 的Jenkins版本 (可以投入使用) ,捆绑了所有Blue Ocean插件和功能。这意味着你不需要单独安装Blue Ocean插件。
或者
bash
docker pull jenkins/jenkins:latest
查看镜像
docker images

安装jenkins
创建工作目录
bash
cd /var/lib
bash
mkdir -p /var/lib/jenkins
配置权限
查看jenkins当前权限
bash
ls -nd jenkins/
配置jenkins权限
bash
chmod 777 jenkins/
创建Jenkins容器
cd 到根目录
bash
cd ~
安装并启动 jenkins 容器
bash
docker run -itd -p 8081:8080 -p 10241:50000 --name jenkins --privileged=true -v /var/lib/jenkins:/var/jenkins_home --restart=always jenkinsci/blueocean:latest
-it:开启输入功能并连接伪终端
-d:后台运行容器
--name:为容器指定一个名称
-p:端口映射,格式为主机(宿主)端口:容器端口,可在application.yaml配置。
-p 8081:8080 将镜像的8080 端口映射到服务器的8081端口。
-p 10241:50000 将镜像的50000端口映射到服务器的10241端口
-v:工作目录映射。形式为:-v 宿主机路径,后者不能修改。
--restart:建议设置为always,在 Docker 启动的时候自动启动 Halo 容器。
端口映射
csharp
# 查看防火墙状态
systemctl status firewalld
# 启动防火墙
systemctl start firewalld
# 开启8081端口
firewall-cmd --zone=public --add-port=8081/tcp --permanent
# 开启10241端口
firewall-cmd --zone=public --add-port=10241/tcp --permanent
# 重启防火墙才能生效
systemctl restart firewalld
# 或者重新启动防火墙
firewall-cmd --reload
# 查看已经开放的端口
firewall-cmd --list-ports
# 关闭防火墙命令:
systemctl stop firewalld
bash
# 查看防火墙状态
sudo ufw status
# 安装防火墙
sudo sudo apt-get install ufw
# 启动防火墙
sudo ufw enable
# 开启8081端口
sudo ufw allow 8081
# 开启10241端口
sudo ufw allow 10241
# 开启完成,需要重启防火墙生效
sudo ufw reload
# 查看端口信息
sudo ufw status
# 关闭防火墙命令:
sudo ufw disable
查看jenkins是否启动
jenkins 进程
perl
ps -ef | grep jenkins
查看启动日志
docker logs jenkins
配置镜像加速
bash
cd /var/lib/jenkins/
修改hudson.model.UpdateCenter.xml里的内容
vim hudson.model.UpdateCenter.xml
修改前
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 修改为 清华大学官方镜像:mirrors.tuna.tsinghua.edu.cn/jenkins/upd...
修改后
xml
<?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>
查看登录密码
bash
cat /var/lib/jenkins/secrets/initialAdminPassword
请从本地复制查看到的密码出来,在浏览器打开登录页面时,粘贴到密码输入框
浏览器访问jenkins
jenkins宿主机的ip+端口号(8081)

实例配置

修改时区
方式一

输入下面命令,出现Result则运行正常
arduino
System.setProperty('org.apache.commons.jelly.tags.fmt.timeZone', 'Asia/Shanghai')

方式二
bash
docker exec -it 81 /bin/bash
执行下面命令
bash
tzselect
4
9
1
1
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
##查看时间
date -R
管理Jenkins->系统配置-->插件管理-->

分别搜索Git Parameter/Git/Pipeline/docker/Config File Provider/Gitlab Hook /Gitlab/Push Over SSH,选中点击安装。
- Git:拉取代码
- Git Parameter:Git参数化构建
- Pipeline:流水线
- GitLab:
- Config File Provider:存储配置文件
- Extended Choice Parameter:扩展选择框参数,支持多选
- CloudBees Docker Build and Publish plugin: docker插件
待所有插件安装完成后重启Jenkins(在你访问Jenkins页面地址上加/restart)

添加凭据
管理你的服务器登录名密码,gti的登录名密码等信息




Jenkins配置
API Token

插件管理
管理Jenkins->系统配置-->插件管理-->

分别搜索Git Parameter/Git/Pipeline/docker/Config File Provider/Gitlab Hook /Gitlab/Push Over SSH,选中点击安装。

- Git:拉取代码
- Git Parameter:Git参数化构建
- Pipeline:流水线
- GitLab:
- Config File Provider:存储配置文件
- Extended Choice Parameter:扩展选择框参数,支持多选
- CloudBees Docker Build and Publish plugin: docker插件
如果无法顺利安装则到plugins.jenkins.io/下载插件手动上传。
修改时区
bash
docker exec -it 81 /bin/bash
执行下面命令
bash
tzselect
4
9
1
1
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
##查看时间
date -R
gitlab配置
需要到jenkins配置以下信息
Connection name为gitlab的登录账号

生成 SSH Key
生成key
bash
cd /var/lib/jenkins
ssh-keygen -t rsa
输入文件名为jenkins_rsa,输入密码(为空)

会在目录/root/.ssh生成id_rsa私钥、id_rsa.pub公钥,将公钥的内容写入到同目录下的authorized_keys文件(jenkins连接多台服务器,将公钥写入到相应服务器的authorized_keys文件即可)
公钥文件
将公钥写入authorized_keys文件
bash
cd /root/.ssh/
bash
cat /var/lib/jenkins/jenkins_rsa.pub >> authorized_keys
bash
chmod 600 authorized_keys
验证SSH Key
css
ssh -p 8081 root@192.168.234.133
配置私钥凭证
在jenkins的linux虚拟机上执行如下命令查看私钥
bash
cd /var/lib/jenkins
bash
mv jenkins_rsa /root/.ssh/
bash
cat /root/.ssh/jenkins_rsa
登录jenkins配置凭据,系统管理-->


类型选择:SSH Username with private key
Username: 一般是linux虚拟机上配置的用户


将私钥 复制到key处,然后点击确定即可。
在jenkins系统配置中,配置SSH remote hosts,如果提示不能连接,请检查服务器sshd文件配置
配置SSH remote hosts
系统管理-->系统管理--下拉菜单选择"SSH remote hosts",


按以下截图配置,Credentials选择刚刚配置的jenkins ssh

如果提示不能连接,请检查服务器sshd文件配置。
配置Publish over SSH
在把SSH配置好后,点击系统管理-->系统管理--下拉菜单选择Publish over SSH;
在【SSH Servers】模块把服务器地址、账号密码填进去保存,因为后续会使用到。



点击新增Service按钮,输入Jenkins所在服务器的IP,及账号,远程目录

接着点击Test configuration测试下连接是否成功,如下:

如果测试配置不是Success,则按以下操作继续


在Passphrase / Password维护输入Jenkins所在服务器的UserName(root)用户名对应的密码,如下:

新建任务
到首页面板点击【新建任务】-选择【构建一个自由风格的软件项目】(FreeStyle Project)。
自由风格的项目更多是使用shell脚本结合相应平台的指令实现自动化,因此建议大家对shell脚本有个初步的认识与学习,虽然Jenkins也提供了对应平台语言的一些插件,但是只要您熟悉了shell就会发现它的灵活性与便捷性。

接下来我们只要关注3个模块,源码管理、构建触发器、构建
源码构建
源码构建,填写您要自动发布的项目的源码地址,并输入账号密码。

无法连接仓库:Command "git ls-remote -h -- http://192.168.234.133:48080/net/WebApp1.git HEAD" returned status code 128:
stdout:
stderr: remote: HTTP Basic: Access denied
fatal: Authentication failed for 'http://192.168.234.133:48080/net/WebApp1.git/'


构建触发器
构建触发器,这里勾选Build when a chenge ......,把URL 复制记录下来,等下在Gitlab需要使用到。这里就是与Gitlab webhook做了联动,可以理解成Jenkins开放了一个接口,让Gitlab被push代码后会主动告诉Jenkins做一次自动化构建。

构建
这里其实就是执行shell脚本完成发布。这里得注意下我是用ssh,因为我的Jenkins是使用了docker安装的,如果我使用了【构建】模块里的【执行shell】就会在Jenkins环境里进行编译、打包,同时也需要安装相应的环境 例如dotnet sdk等。值得注意的是,我的环境与Jenkins挂载的都是在了Server这个宿主环境,因此通过Jenkins的SSH Publishers连到Jenkins的宿主服务器(Server),执行相应的shell脚本从Jenkins挂载的目录进行构建镜像。当然有同学想在Jenkins环境先打包然后通过SSH的Transfers模块进行文件传也是可以的。

构建步骤选择"Send files or execute commands over SSH"


bash
mkdir -p /root/jenkins/jenkins_home/workspace/WebApp1
bash
#!/bin/bash
echo '脚本开始执行'
/root/jenkins/jenkins_home/workspace/WebApp1/
project_name=webapp1
project_path=$base_path/WebApp1
publish_path=$project_path/bin/Release/netcoreapp6.0/publish
cd $project_path
rm -rf $project_path/bin
dotnet publish -c Release && (
cd $publish_path &&
docker stop $project_name
docker rm $project_name
docker image rm $project_name
docker build -t $project_name . &&
docker run -d -p 5000:80 -e ASPNETCORE_ENVIRONMENT="Development" --name $project_name $project_name &&
echo '发布成功:'$project_path'' ||
echo '发布失败:'$project_path''
) || echo '发布失败:'$project_path''
echo '脚本执行结束'
将build.sh保存到/root/jenkins/jenkins_home/workspace/WebApp1目录下。
构建脚本
全局工具配置
需要安装JDK,maven,git,docker。打开系统管理-全局工具配置下
JDK
Git


Docker

待所有的配置都完成后重启Jenkins。
总结
通过 Docker 部署 Jenkins,可以大大简化安装和配置过程,确保环境的一致性,并能快速启动和管理 Jenkins 实例。Docker 提供了良好的隔离性和扩展性,使得 Jenkins 更加灵活和高效。通过持久化数据和备份恢复,你可以轻松管理 Jenkins 环境。
希望这篇文章能帮助你更好地理解如何在 Docker 中部署 Jenkins!