使用 jenkins 完成自动部署

使用 jenkins 完成自动部署

本文记录了使用 jenkins 配合 github/gitee 的 webhook 完成自动化部署, 以及在部署过程中遇到的问题.

要求提前安装好 docker, 安装 docker 可以参考我的前一篇文章.

环境说明

  • centos 7.9
  • docker 24.0.2
  • jenkins/jenkins 2.401.2

web 服务配置

我的 web 项目是一个 vue2 的项目, Dockerfile如下:

bash 复制代码
# 构建阶段
# 使用Node.js作为基础镜像
FROM node:14 as build-stage
# 设置工作目录
RUN mkdir -p /home/project
# 设置容器的工作目录为该目录
WORKDIR /home/project
# 复制 package.json 和 package-lock.json 到工作目录
COPY / /home/project
# 安装依赖
RUN npm install
# 构建项目
RUN npm run build:prod

# 生产阶段
# 使用Nginx作为基础镜像
FROM nginx:latest as production-stage
# 将构建阶段的静态资源复制到Nginx的默认静态文件目录
COPY --from=build-stage /home/project/dist /usr/share/nginx/html
# 暴露容器的端口(默认为80)
EXPOSE 80
# 启动Nginx服务器
CMD ["nginx", "-g", "daemon off;"]

安装/启动 jenkins

bash 复制代码
# jenkins已经被废弃, 最新的是jenkins/jenkins
docker pull jenkins/jenkins
# 启动jenkins容器
docker run -d -u 0 --privileged --name jenkins-container -p 40020:8080 -e JAVA_OPTS="-Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true" -v /home/jenkins_home:/var/jenkins_home jenkins/jenkins

上述参数说明:

  • -d 以守护进程模式运行
  • -u 0 --privileged 以 root 用户权限运行, 使容器内进程拥有最高权限
  • --name jenkins-container 设置容器名称
  • -p 40020:8080 容器的 8080 端口映射到宿主机的 40020 端口
  • -e JAVA_OPTS="-Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true" 关闭 jenkins 的禁用 CSRF 配置(如果需要使用 webhook 自动化部署需要这个配置)
  • -v /home/jenkins_home:/var/jenkins_home jenkins/jenkins 将容器的/var/jenkins_home目录映射到宿主的/home/jenkins_home
  • jenkins/jenkins 使用jenkins/jenkins镜像

等待 docker 启动 jenkins 后进入[host]:40020

jenkins 配置

  1. 登录 jenkins

进入 jenkins 登录页面, 提示从/var/jenkins_home/secrets/initialAdminPassword可以找到初始密码, 因为已经做过映射了, 直接从宿主主机的/home/jenkins_home/secrets/initialAdminPassword中查找初始密码

bash 复制代码
cat /home/jenkins_home/secrets/initialAdminPassword
  1. 安装推荐插件

选择Install suggetsed plugins, 等待安装完成, 如果有安装失败的尝试重新安装

  1. 创建管理员账号
  1. 安装插件

进入首页后, 点击Manage Jenkins, 然后选择plugins进入插件管理页面

选择Available plugins, 搜索publish over ssh, 安装插件, 等待安装完成

  1. 配置publish over ssh

回到首页, 点击Manage Jenkins, 选择System设置

拉到最下面找到Publish over SSH的配置, 新增一个服务器, 输入服务器名称, 主机地址, 用户名和密码, 然后点击Test Configuration看是否能正常连接

  1. 创建项目

回到首页点击New Item新建项目

选择Freestyle project, 输入项目名称

往下拉找到Source Code Management, 然后点击Add, 新增用户, 可以通过账号密码或者秘钥创建. 创建完成用户后, 输入你的仓库地址, 选择刚才创建的用户.

继续往下拉找到Build Environment, 选择Send files or execute commands over SSH before the build starts输入你的构建脚本, 然后保存

bash 复制代码
sudo docker stop web-project || true \
 && sudo docker rm web-project || true \
 && cd /home/jenkins_home/workspace/web-project \
 && sudo docker rmi web-project-images || true \
 && sudo docker build --rm --no-cache=true -t web-project-images . \
 && mkdir /home/jenkins_workspace/web-project || true \
 && sudo docker run -d --privileged=true --name web-project -p 42000:80 \
 web-project-images

保存完成后, 点击立即构建即可部署.

jenkins + webhooks 实现自动部署

  1. 回到首页, 点击People, 选择用户
  1. 新增API Token

选择Configure, 在API Token中点击Add new Token, 输入名称后点击Generate生成, 将生成的值复制一下.

  1. 设置触发器

返回首页, 选择刚才的项目, 进入设置Configure, 下拉找到Build Triggers, 勾选Trigger builds remotely (e.g., from scripts)

将刚才复制的值复制到Authentication Token中.

  1. webhook 配置

打开项目主页面, 我这边以gitee为例, github基本相同, 选择项目中的管理, 找到 webhook, 新增 webhook.

根据上一步的提示, 将Token拼好, 然后把Authentication Token复制到 URL 中.

  1. Security 配置

回到首页, 选择Manage Jenkins, 找到 Security, 勾选Allow anonymous read access, 还有下面的CSRF Protection, 在启动jenkins时已经设置过. 如果启动时没有设置配置项, 需要在控制台中输入hudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true来关闭CSRF Protection.

注意点

需要注意为了能使jenkins能够下载到远程服务器的代码, 需要在启动jenkins服务器的时候加上配置项JAVA_OPTS="-Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true", 否则会每次重启jenkins服务的时候需要在控制台手动输入命令hudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true来关闭CSRF Protection.

相关推荐
云飞云共享云桌面3 小时前
智能装备工厂研发部门多设计师共享一台SolidWorks服务器做设备装配建模
运维·服务器·网络·人工智能·3d·自动化·制造
简简单单就是我_hehe3 小时前
一次 ClickHouse 服务器磁盘告警的排查与修复实录
java·服务器·前端
自由彩虹3 小时前
靶场通关16--victim1
linux·服务器·网络·安全·web安全·网络安全
Jack N3 小时前
【Strapi 系列之八】二次开发 + 生产部署,Docker + PostgreSQL + Nginx 一把梭
nginx·docker·postgresql·strapi
路由侠内网穿透.3 小时前
本地部署开源 WSGI HTTP 服务器 Gunicorn 并实现外部访问
运维·服务器·网络·网络协议·http·开源
刚入门的大一新生3 小时前
Linux-线程控制
linux·运维·服务器
咖丨喱3 小时前
【P2P 邀请后 5G 单信道扫描 dwell 加长】
服务器·5g·asp.net
广州灵眸科技有限公司12 小时前
4G 模组开机自连 systemd 服务方案:基于灵眸科技EAI1106--Core-T
运维·服务器·科技
qq_4017004113 小时前
Linux设备树详解
linux·运维·服务器
岁月宁静13 小时前
一个 AI 项目从本地到上线,要经过哪些步骤?全流程讲清楚
python·docker·agent