Jenkins+Docker+Gitee自动化项目部署上线

当我们使用传统的开发方式开发后台系统时,每完成一个功能点就需要上传代码然后需要手动打包然后进行构建,这种开发方式流程是比较麻烦的。基于此,我们使用Docker+Jenkins配合Gitee搭建一个自动化部署平台,一个功能点开发完成测试通过验证之后只需要上传代码到Gitee上面就能够自动的进行打包构建部署,极大的解决了之前功能需要手动重新打包部署构建的问题,也解放了部署的流程。


前言

 jenkins+Docker+Gitee自动化项目部署上线 ,本次通过docker环境中安装jenkins实现代码的自动化部署上线。

一、docker介绍

Docker 是一个开源的应用容器引擎,它让应用程序及其整个运行时环境(如依赖库、配置文件等)打包到一个轻量级的容器中,使得应用可以在任何安装了 Docker 的主机上运行。这种容器化技术基于 Linux 内核的特性,如命名空间(namespaces)和控制组(cgroups),提供了隔离性和资源限制的能力。

Docker 的主要特点包括:

  1. 轻量化:Docker 容器共享主机操作系统的内核,不需要为每个容器单独加载操作系统,因此相较于虚拟机更加轻量,启动速度更快。

  2. 一致性:开发人员可以在本地使用 Docker 容器进行开发测试,然后将相同的容器部署到生产环境中,确保应用在不同环境中表现一致。

  3. 可移植性:容器可以跨操作系统、云平台甚至硬件设备运行,使得应用可以轻松地从一台机器迁移至另一台机器。

  4. 隔离性:容器之间以及与宿主机之间是相互隔离的,这有助于提高安全性,并防止不同应用间的干扰。

  5. 易于管理:Docker 提供了命令行工具和其他图形界面工具来帮助用户构建、打包、发布、运行和管理容器。

  6. 镜像概念:Docker 使用镜像来创建容器。镜像是只读模板,包含了运行应用所需的所有依赖项,可以通过简单的命令来创建或更新镜像。

  7. Docker Hub:这是一个公共的镜像仓库,用户可以从中下载别人已经创建好的镜像,也可以上传自己创建的镜像供他人使用。

  8. 编排工具:除了基本的容器管理外,还有如 Docker Compose 和 Docker Swarm 这样的工具用于管理多容器应用和服务集群。

Docker 主要由三部分组成:Docker 客户端用来编写指令;Docker 守护进程负责执行客户端发送过来的指令;Docker 镜像则是用来创建容器的基础。

自 2013 年发布以来,Docker 已经成为容器化技术中最流行的选择之一,广泛应用于开发、测试、部署和运维等场景

二、jenkins介绍

Jenkins 是一款开源的持续集成(Continuous Integration, CI)和持续交付(Continuous Delivery, CD)服务器软件,支持自动化部署和扩展。它允许开发者以一种可靠且可重复的方式构建、测试和部署代码。Jenkins 可以运行在 Linux、Windows 和 macOS 等多种操作系统上,并且可以通过插件机制来支持各种工具和服务的集成。

Jenkins 的主要特点包括:

  1. 持续集成:Jenkins 支持自动构建和测试项目代码,每当代码库发生变化时,可以触发构建过程,这样可以快速发现并修复错误。

  2. 持续交付/部署:通过自动化部署流程,Jenkins 可以帮助团队快速而安全地将代码推送到生产环境中。

  3. 插件系统:Jenkins 拥有一个庞大的插件生态系统,支持各种构建工具、测试框架、版本控制系统等,可以灵活地集成到现有的开发流程中。

  4. 易用的 Web 界面:Jenkins 提供了一个直观的 Web 界面,方便用户管理和监控构建任务,同时也可以通过 API 进行脚本化管理。

  5. 工作流支持:Jenkins 具有内置的支持来定义复杂的构建步骤和条件逻辑,比如通过 Pipeline as Code 的方式,允许使用 Groovy 脚本来描述构建过程。

  6. 安全性:Jenkins 支持认证和授权机制,保护构建任务和敏感信息的安全。

  7. 可扩展性:Jenkins 可以通过主从架构来管理多个节点,实现分布式构建,从而提高构建速度和处理能力。

  8. 通知机制:支持通过邮件、即时消息等方式通知团队成员构建结果。

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
  1. -u root:

    设置容器内的用户为 root。这意味着容器将以超级用户权限运行。
  2. -d:

    以后台模式(即作为后台进程)启动容器。
  3. --restart=always:

    设置容器在宿主机重启后总是重新启动。
  4. --privileged=true:

    以特权模式运行容器,这给予了容器更多的权限,比如可以直接访问 Docker API。特权模式绕过了某些安全限制,因此只应在必要时使用。
  5. -p 10240:8080:

    映射容器的端口 8080 到宿主机的端口 10240。这意味着你可以通过访问宿主机的 10240 端口来连接到容器内的 Jenkins 服务。
  6. -p 10241:50000:

    类似地,映射容器的端口 50000 到宿主机的端口 10241。这通常是用于 Jenkins 的代理或者其他需要监听外部端口的服务。
  7. -v /home/jenkins/workspace/:/var/jenkins_x:

    将宿主机上的 /home/jenkins/workspace/ 目录挂载到容器内的 /var/jenkins_x 目录。这使得 Jenkins 可以在宿主机上存储工作空间数据。
  8. -v /var/run/docker.sock:/var/run/docker.sock:

    将 Docker 的 Unix socket 文件从宿主机挂载到容器内,使得容器内的 Jenkins 可以管理宿主机上的 Docker 服务。
  9. -v /usr/bin/docker:/usr/bin/docker:

    将宿主机上的 /usr/bin/docker 文件挂载到容器内的相同位置。虽然在特权模式下,容器内的 Docker 客户端可以连接到宿主机的 Docker 引擎,但这个选项可能是为了确保 Jenkins 能够直接访问 Docker 客户端。
  10. -v /opt/develop_resource/apache-maven-3.6.3:/usr/local/maven:

    将宿主机上的 Maven 安装目录挂载到容器内的 /usr/local/maven 目录,这样容器内的 Jenkins 可以使用宿主机上的 Maven 版本。
  11. -v "$HOME":/home:

    将宿主机用户的主目录挂载到容器内的 /home 目录。这使得 Jenkins 可以访问宿主机用户的主目录下的文件。
  12. --name jenkins:

    给容器命名,便于后续管理。
  13. jenkins/jenkins:lts:

    指定要运行的 Jenkins 镜像版本,这里使用的是长期支持版(LTS)。

总结来说,这个命令是用来启动一个 Jenkins 容器,并且确保它能够访问宿主机上的某些目录和服务,以便于 Jenkins 的正常运作和持续集成任务的执行。

执行完成后效果

通过docker ps指令可以查看容器是否启动

阿里云ecs服务器安全组中添加安全策略 放行10240端口

浏览器进行访问,插件安装

密码获取:

  • 进入Jenkins容器:docker exec -it {Jenkins容器名} bash
  • 例如docker exec -it jenkins bash

在日期了内通过浏览器界面上提示的路径去找密码 命令

cat  提示路径

输入上一步获取的密码

进入之后

选择第一个:安装推荐的插件 单击就可以

然后会自动进行依赖安装

安装过程中可能会不成功,可以点击重试进行刷新,如果有继续的按钮的话先点击继续,到时候后面可能切换国内源之后再重新安装

更改jenkins插件地址为国内源地址

  1. 如果是安装完成进去之后:

设置为: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提交

  1. 如果界面没有出现继续按钮

进入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脚本的方式对项目进行打包部署构建更新。以上就是我的一点分享如有错误或者遗漏之处欢迎大佬指点指点,有任何疑问可以随时后台私信我,能够解答上的 一定知无不言。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值