Jenkins+docker 微服务实现自动化部署安装和部署过程

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)

实例配置

http://192.168.234.133: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

创建build.sh

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!


相关推荐
胡gh1 小时前
页面卡成PPT?重排重绘惹的祸!依旧性能优化
前端·javascript·面试
ningqw1 小时前
SpringBoot 常用跨域处理方案
java·后端·springboot
你的人类朋友1 小时前
vi编辑器命令常用操作整理(持续更新)
后端
胡gh1 小时前
简单又复杂,难道只能说一个有箭头一个没箭头?这种问题该怎么回答?
javascript·后端·面试
言兴1 小时前
# 深度解析 ECharts:从零到一构建企业级数据可视化看板
前端·javascript·面试
一只叫煤球的猫2 小时前
看到同事设计的表结构我人麻了!聊聊怎么更好去设计数据库表
后端·mysql·面试
uzong2 小时前
技术人如何对客做好沟通(上篇)
后端
颜如玉3 小时前
Redis scan高位进位加法机制浅析
redis·后端·开源
Moment3 小时前
毕业一年了,分享一下我的四个开源项目!😊😊😊
前端·后端·开源
why技术4 小时前
在我眼里,这就是天才般的算法!
后端·面试