当我们使用传统的开发方式开发后台系统时,每完成一个功能点就需要上传代码然后需要手动打包然后进行构建,这种开发方式流程是比较麻烦的。基于此,我们使用Docker+Jenkins配合Gitee搭建一个自动化部署平台,一个功能点开发完成测试通过验证之后只需要上传代码到Gitee上面就能够自动的进行打包构建部署,极大的解决了之前功能需要手动重新打包部署构建的问题,也解放了部署的流程。
前言
jenkins+Docker+Gitee自动化项目部署上线 ,本次通过docker环境中安装jenkins实现代码的自动化部署上线。
一、docker介绍
Docker 是一个开源的应用容器引擎,它让应用程序及其整个运行时环境(如依赖库、配置文件等)打包到一个轻量级的容器中,使得应用可以在任何安装了 Docker 的主机上运行。这种容器化技术基于 Linux 内核的特性,如命名空间(namespaces)和控制组(cgroups),提供了隔离性和资源限制的能力。
Docker 的主要特点包括:
-
轻量化:Docker 容器共享主机操作系统的内核,不需要为每个容器单独加载操作系统,因此相较于虚拟机更加轻量,启动速度更快。
-
一致性:开发人员可以在本地使用 Docker 容器进行开发测试,然后将相同的容器部署到生产环境中,确保应用在不同环境中表现一致。
-
可移植性:容器可以跨操作系统、云平台甚至硬件设备运行,使得应用可以轻松地从一台机器迁移至另一台机器。
-
隔离性:容器之间以及与宿主机之间是相互隔离的,这有助于提高安全性,并防止不同应用间的干扰。
-
易于管理:Docker 提供了命令行工具和其他图形界面工具来帮助用户构建、打包、发布、运行和管理容器。
-
镜像概念:Docker 使用镜像来创建容器。镜像是只读模板,包含了运行应用所需的所有依赖项,可以通过简单的命令来创建或更新镜像。
-
Docker Hub:这是一个公共的镜像仓库,用户可以从中下载别人已经创建好的镜像,也可以上传自己创建的镜像供他人使用。
-
编排工具:除了基本的容器管理外,还有如 Docker Compose 和 Docker Swarm 这样的工具用于管理多容器应用和服务集群。
Docker 主要由三部分组成:Docker 客户端用来编写指令;Docker 守护进程负责执行客户端发送过来的指令;Docker 镜像则是用来创建容器的基础。
自 2013 年发布以来,Docker 已经成为容器化技术中最流行的选择之一,广泛应用于开发、测试、部署和运维等场景
二、jenkins介绍
Jenkins 是一款开源的持续集成(Continuous Integration, CI)和持续交付(Continuous Delivery, CD)服务器软件,支持自动化部署和扩展。它允许开发者以一种可靠且可重复的方式构建、测试和部署代码。Jenkins 可以运行在 Linux、Windows 和 macOS 等多种操作系统上,并且可以通过插件机制来支持各种工具和服务的集成。
Jenkins 的主要特点包括:
-
持续集成:Jenkins 支持自动构建和测试项目代码,每当代码库发生变化时,可以触发构建过程,这样可以快速发现并修复错误。
-
持续交付/部署:通过自动化部署流程,Jenkins 可以帮助团队快速而安全地将代码推送到生产环境中。
-
插件系统:Jenkins 拥有一个庞大的插件生态系统,支持各种构建工具、测试框架、版本控制系统等,可以灵活地集成到现有的开发流程中。
-
易用的 Web 界面:Jenkins 提供了一个直观的 Web 界面,方便用户管理和监控构建任务,同时也可以通过 API 进行脚本化管理。
-
工作流支持:Jenkins 具有内置的支持来定义复杂的构建步骤和条件逻辑,比如通过 Pipeline as Code 的方式,允许使用 Groovy 脚本来描述构建过程。
-
安全性:Jenkins 支持认证和授权机制,保护构建任务和敏感信息的安全。
-
可扩展性:Jenkins 可以通过主从架构来管理多个节点,实现分布式构建,从而提高构建速度和处理能力。
-
通知机制:支持通过邮件、即时消息等方式通知团队成员构建结果。
Jenkins 的使用场景:
- 自动化构建:每次代码提交后自动编译和打包。
- 自动化测试:运行单元测试、集成测试等,确保代码质量。
- 自动化部署:将构建好的应用部署到测试或生产环境。
- 代码质量检查:集成静态代码分析工具,提高代码质量。
- 文档生成:自动生成项目文档。
- 监控外部资源的变化:例如,监控 Git 或 SVN 仓库中的更改,以便触发构建。
Jenkins 在 DevOps 流程中扮演着重要的角色,帮助团队实现自动化和加速软件交付周期。随着 DevOps 实践的发展,Jenkins 也在不断地演进,以适应新的需求和技术。
三、案例使用
1.使用docker+jenkins+gitee部署构建后端SpringBootMaven管理的项目
参考资料链接:
基于Docker+Jenkins实现自动部署SpringBoot+Maven项目_gitee+jetkins+docker自动部署构建springboot+vue项目-CSDN博客
https://zhuanlan.zhihu.com/p/473792338
前置条件
docker安装成功
按照下面配置加速
报错解决:
报错 :Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
解决方法
配置加速地址
vim /etc/docker/daemon.json
添加一下内容
{
"registry-mirrors": ["https://docker.1panel.live"]
}
保存
:wq
重启docker
重启docker
systemctl restart docker
jenkins安装步骤如下:
搜索镜像
docker search jenkins
deprecated 是弃用的意思,第一条搜索记录就是告诉我们 jenkins 镜像已经弃用,让我们使用 jenkins/jenkins:lts 镜像名进行拉取
拉取镜像
docker pull jenkins/jenkins:lts
docker images #查看镜像
处理maven安装问题
因为我们要部署的是SpringBoot,所以需要准备JDK和Maven环境,不过该Jenkins镜像自带了JDK环境,只需准备一下Maven即可,首先,下载Maven压缩包
直接输入命令下载:
wget http://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
然后使用命令进行解压
tar -zxvf apache-maven-3.6.3-bin.tar.gz
解压需要解压到这个目录下面 /opt/develop_resource/apache-maven-3.6.3,因为后面再启动jenkins的时候需要挂载在他容器的目录里面
- 宿主机上的
/opt/develop_resource/apache-maven-3.6.3
目录将会被挂载到 Docker 容器内的/usr/local/maven
目录上。 - 如果
/usr/local/maven
在容器内部不存在,Docker 会自动创建这个目录。 - 在容器运行期间,对
/usr/local/maven
内部所做的任何更改都会反映到宿主机的/opt/develop_resource/apache-maven-3.6.3
目录中,反之亦然
运行启动Jenkins
先在宿主机创建Jenkins的挂载目录
mkdir -p /home/jenkins/workspace
运行启动jenkins命令如下:
docker run -uroot -d --restart=always --privileged=true -p 10240:8080 -p10241:50000 \
-v /home/jenkins/workspace/:/var/jenkins_x \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/bin/docker:/usr/bin/docker \
-v /opt/develop_resource/apache-maven-3.6.3:/usr/local/maven \
-v "$HOME":/home \
--name jenkins jenkins/jenkins:lts
-
设置容器内的用户为-u root
:root
。这意味着容器将以超级用户权限运行。 -
以后台模式(即作为后台进程)启动容器。-d
: -
设置容器在宿主机重启后总是重新启动。--restart=always
: -
以特权模式运行容器,这给予了容器更多的权限,比如可以直接访问 Docker API。特权模式绕过了某些安全限制,因此只应在必要时使用。--privileged=true
: -
映射容器的端口 8080 到宿主机的端口 10240。这意味着你可以通过访问宿主机的 10240 端口来连接到容器内的 Jenkins 服务。-p 10240:8080
: -
类似地,映射容器的端口 50000 到宿主机的端口 10241。这通常是用于 Jenkins 的代理或者其他需要监听外部端口的服务。-p 10241:50000
: -
将宿主机上的-v /home/jenkins/workspace/:/var/jenkins_x
:/home/jenkins/workspace/
目录挂载到容器内的/var/jenkins_x
目录。这使得 Jenkins 可以在宿主机上存储工作空间数据。 -
将 Docker 的 Unix socket 文件从宿主机挂载到容器内,使得容器内的 Jenkins 可以管理宿主机上的 Docker 服务。-v /var/run/docker.sock:/var/run/docker.sock
: -
将宿主机上的-v /usr/bin/docker:/usr/bin/docker
:/usr/bin/docker
文件挂载到容器内的相同位置。虽然在特权模式下,容器内的 Docker 客户端可以连接到宿主机的 Docker 引擎,但这个选项可能是为了确保 Jenkins 能够直接访问 Docker 客户端。 -
将宿主机上的 Maven 安装目录挂载到容器内的-v /opt/develop_resource/apache-maven-3.6.3:/usr/local/maven
:/usr/local/maven
目录,这样容器内的 Jenkins 可以使用宿主机上的 Maven 版本。 -
将宿主机用户的主目录挂载到容器内的-v "$HOME":/home
:/home
目录。这使得 Jenkins 可以访问宿主机用户的主目录下的文件。 -
给容器命名,便于后续管理。--name jenkins
: -
指定要运行的 Jenkins 镜像版本,这里使用的是长期支持版(LTS)。jenkins/jenkins:lts
:
总结来说,这个命令是用来启动一个 Jenkins 容器,并且确保它能够访问宿主机上的某些目录和服务,以便于 Jenkins 的正常运作和持续集成任务的执行。
执行完成后效果
通过docker ps
指令可以查看容器是否启动
阿里云ecs服务器安全组中添加安全策略 放行10240端口
浏览器进行访问,插件安装
密码获取:
- 进入Jenkins容器:
docker exec -it {Jenkins容器名} bash
- 例如
docker exec -it jenkins bash
在日期了内通过浏览器界面上提示的路径去找密码 命令
cat 提示路径
输入上一步获取的密码
进入之后
选择第一个:安装推荐的插件 单击就可以
然后会自动进行依赖安装
安装过程中可能会不成功,可以点击重试进行刷新,如果有继续的按钮的话先点击继续,到时候后面可能切换国内源之后再重新安装
更改jenkins插件地址为国内源地址
-
如果是安装完成进去之后:
设置为:https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json 或者
http://mirror.xmission.com/jenkins/updates/update-center.json
在Jenkins中的路径:进入Manage Jenkins——Manage Plugins——Advanced——滚动到最下面的Update Site并替换上面的地址 点击submit提交
-
如果界面没有出现继续按钮
进入jenkins安装目录下的/updates/default.json,将其中的
updates.jenkins-ci.org/download替换为mirrors.tuna.tsinghua.edu.cn/jenkins ,
有些jenkins 版本当中,是将
updates.jenkins.io/download替换为mirrors.tuna.tsinghua.edu.cn/jenkins然后,
把www.google.com修改为www.baidu.com
安装完成后点击继续
出来创建用户的界面
到这里就已经安装完成
安装过程遇到的小问题
通过docker ps 后没有访问到发现没有成功
Jenkins容器docker run之后状态总是Exited
通过 docker ps -a 命令发现状态为
通过日志排查
docker logs jenkins
发现
说明是权限问题
因为/var/jenkins_home 目录是root权限
解决
chown -R 1000:1000 /var/jenkins_home //用户组改变
然后进行重启
docker restart 容器id
Jenkins平台配置
1.首先是配置maven
系统管理 》 系统配置 找到全局属性
勾选环境变量 然后进行配置
挂载到Jenkins容器中的目录就是/usr/local/maven PATH+EXTRA的作用是让原来PATH变量中的环境不丢失,最后点击保存
M2_HOME /usr/local/maven/apache-maven-3.6.3
PATH+EXTRA $M2_HOME/bin
通过 docker exec -it jenkins容器id bash 进入容器内
找到我们刚刚配置的maven的路径启动的时候进行挂载的
容器里面是不能修改的 只能复制出来进行修改在传回去
找到setting.xml文件配置阿里云加速
加入代码
<mirrors>
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
</mirror>
</mirrors>
2.安装必要的插件
依次安装下面的几个插件
gitee使用:Gitee
maven 插件:Maven Integration plugin
SSH远程连接插件:Publish Over SSH
3.配置环境
系统管理 》 系统配置 找到gitee配置
添加获取凭证
提交后就会有
gitee私人令牌 xxxxxxxxxxxxxxxxxxxxxxx
获取完成之后进行添加
最后记得点击保存
配置ssh
就是刚刚maven挂载的那个目录
构建任务
新建自动化部署任务
继续进行配置
输入自己gitee的仓库地址,这里就是随便一个springboot的项目然后上传到了gitee仓库里面
这里选勾选这一个 webhook触发构建
一直滑到最下面然后点击生成按钮 输入框中就会出现密码,将这个密码复制到gitee仓库
来到自己的gitee仓库点击管理
然后点击webhooks进入之后点击添加
下面信息中url就是之前构建触发器那个标题那里的url 并且这个url要求必须是公网 如果不是公网的话就是需要进行内网穿透,而密码就是我们刚刚的生成的密码 填写完成后点击添加
出现这个截图代表完成
然后下面的配置中勾选轮询时间
输入 * * * * * 一直轮询
下一步在添加构建步骤这里选择执行shell
#!/bin/bash
# 退出脚本如果任何一个命令失败
set -e
# 删除旧的Docker容器
echo "Removing old container..."
docker rm -f app_docker || true # 忽略错误,以防容器不存在
# 删除旧的Docker镜像
echo "Removing old image..."
docker rmi -f app_docker:1.0 || true # 忽略错误,以防镜像不存在
# 构建Java应用程序
# echo "Building Java application..."
mvn clean install -Dmaven.test.skip=true
# 构建新的Docker镜像
echo "Building new Docker image..."
docker build -t app_docker:1.0 -f ./src/main/docker/Dockerfile .
# 运行新的Docker容器
echo "Running new Docker container..."
docker run -d -p 8081:8081 --name app_docker app_docker:1.0
echo "Application is now running."
然后最后点击保存
shell命令中有构建新的Docker镜像
docker build -t app_docker:1.0 -f ./src/main/docker/Dockerfile .
所以需要去我们springboot项目下面添加Dockerfile文件
# 指定是基于哪个基础镜像
FROM java:8
# 作者信息
MAINTAINER wq
# 挂载点声明
VOLUME /tmp
# 将本地的一个文件或目录,拷贝到容器的文件或目录里
ADD /target/demo-0.0.1-SNAPSHOT.jar springboot.jar
#shell脚本
RUN bash -c 'touch /springboot.jar'
# 将容器的8081端口暴露,给外部访问。
EXPOSE 8081
# 当容器运行起来时执行使用运行jar的指令
#ENTRYPOINT ["java", "-jar", "springboot.jar"]
ENTRYPOINT ["java", "-jar", "/springboot.jar", "--spring.profiles.active=prod"]
改完之后通过git命令上传到gitee上面后,jenkins会自动的进行构建
启动测试
最后成功了
需要注意的是我暴露的端口是8081
这里shell命令中挂载的端口和dockerfile中暴露端口要一致才能进行
docker ps 查看会有一个新启用的java springboot的容器
通过docker logs 容器id 就能够查看他的日志信息
新写一个暴露的test接口进行上传
代码通过git上传后 服务器会自动构建代码然后进行打包更新
浏览器中进行访问
至此后端springboot项目就部署完毕了
2.使用docker+jenkins+gitee部署构建前端Vue项目
构建前端配置
参考链接
jenkins+docker+nginx+nodejs持续集成部署vue前端项目_docker 运行nodejs打包编译前端-CSDN博客
安装 node.js插件
系统管理 》 插件管理
然后再全局工具配置中配置nodejs的安装 勾选自动安装可能不成功所以我是手动下载好然后复制到jenkins容器中的目录下然后再这里配置这个目录
通过迅雷先进行下载
https://nodejs.org/dist/v16.16.0/node-v16.16.0-linux-x64.tar.gz
下载完成后
通过ftp传到服务器上面,然后通过命令进行解压
tar -xzf node-v16.16.0-linux-x64.tar.gz
然后将这个文件通过docker cp的方式 复制到jenkins容器中去
进入容器内进行查看
项目构建
全局工具配置中找到maven然后进行配置路径
新建一个任务 自由风格的软件项目
然后进行配置
这里则是前端vue项目的地址
构建触发器跟之前后端项目步骤一致 需要生成密码 然后去gitee去添加webhook
配置轮询
构建环境这里选择node 其他参数会自动带出来
steps这里选择执行shell
npm cache clear --force
npm config set registry https://registry.npmmirror.com
echo npm config get registry
npm install --force
npm run build
echo "打包完成"
docker build -t nginx-agent:latest .
#部署和构建是一台
docker images
docker stop nginx-agent
docker rm nginx-agent
docker run --name nginx-agent -p 8001:80 -d nginx-agent:latest
echo "启动完成"
最后点击保存
在前端项目的根目录中新建三个文件
nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 65535;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
default.conf
server {
listen 80;
server_name xxxxxx; #如果有需要监听的域名,这里也需要修改
location / {
root /app;
try_files $uri $uri/ /index.html;
index index.html index.htm;
add_header Cache-Control no-cache;
}
location /api/ {
if ($request_method = 'OPTIONS') {
return 204;
}
rewrite ^/api/(.*)$ /$1 break;
#后端接口域名,这里需要根据你自己的具体后端来填写
proxy_pass http://xx.xxx.xx.xx:8081/;
}}
dockerfile
FROM nginx
RUN ls -la
COPY ./dist/index.html /app/
COPY ./dist/js /app/js
COPY ./dist/css /app/css
COPY ./dist/fonts /app/fonts
COPY ./dist/img /app/img
COPY ./nginx.conf /etc/nginx/conf/nginx.conf
COPY ./default.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
然后通过git提交代码后会自动进行构建
总结
主要介绍了docker、jenkins的主要用途,然后结合springboot和vue的前后端项目进行自动化部署案例,通过docker安装jenkins 验证gitee的地址代码地址进行容器化结合shell脚本的方式对项目进行打包部署构建更新。以上就是我的一点分享如有错误或者遗漏之处欢迎大佬指点指点,有任何疑问可以随时后台私信我,能够解答上的 一定知无不言。