使用 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.

相关推荐
lswzw4 小时前
K8s容器网络排查实战:从宿主机穿透命名空间定位端口监听问题
开发语言·docker·容器
小张同学a.4 小时前
OpenStack 私有云实战 2—— Glance 镜像与 Nova 计算服务搭建
linux·运维·服务器·openstack
xiaoye-duck4 小时前
《Linux网络编程》TCP 网络编程(下):基于 TCP 多线程通用字典服务 + 远程命令执行实战
linux·服务器·tcp/ip
2401_894915537 小时前
GEO 优化源码全解析:从搜索引擎到 AI 引擎的底层改写逻辑
java·服务器·前端·数据库·人工智能·分布式·搜索引擎
huainingning12 小时前
R4930-G7服务器(RAID-LSI-9560-LP-8i-4GB)网页方式做Raid方法
服务器
小杨不想秃头14 小时前
信息安全工程师教程第二章密码学
运维·服务器·密码学
I'mChloe14 小时前
WGCLOUD怎么监控多台服务器?从Server、Agent 部署到监控面板实战
运维·服务器
Android系统攻城狮15 小时前
Linux PipeWire深度解析之pw_init调用流程与实战(八十三)
linux·运维·服务器·音频进阶·pipewire音频进阶
zbyyd16 小时前
Linux 进程管理详解:从概念到实战
linux·运维·服务器
云飞云共享云桌面18 小时前
智能装备工厂研发团队如何利用单台服务器承载 10 路 SolidWorks 并发?
运维·服务器·3d·自动化·制造