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

相关推荐
杨云龙UP10 小时前
MySQL 数据库常用备份工具对比:mysqldump、mydumper 与 XtraBackup
linux·运维·服务器·数据库·mysql·dba·备份恢复
PC2005-cloud11 小时前
从零上手 openGauss:Docker 部署 + 全场景连接教程
运维·docker·容器
happymagic12 小时前
java spring boot做的jar包程序,如何实现自动运行启动
java·运维·服务器·spring boot·jar
Dr.kangder12 小时前
嵌入式处理器仿真技术——Hypervisor 原理与实践
服务器·嵌入式硬件·架构·嵌入式
AlfredZhao14 小时前
Docker 查看容器日志:别只记 `docker logs -f`
docker
星蓝_starblue14 小时前
零服务器、零数据库!开源growth-board,利用GitHub自动管理刷题/学习/求职全流程
服务器·数据库·程序人生·系统架构·node.js·github·改行学it
云飞云共享云桌面17 小时前
广东精密机械设备工厂8-10人共享一台SolidWorks设计服务器
运维·服务器·3d·自动化·汽车·制造
jieyucx17 小时前
【高级利用】条件竞争与逻辑漏洞:与服务器赛跑的艺术
android·运维·服务器·web安全·文件上传
tianyuanwo17 小时前
服务器OS组件研发效能度量可视系统——顶层方案设计与阶段性规划
运维·服务器·度量系统
初级炼丹师(爱说实话版)17 小时前
Ubuntu服务器配置docker
服务器·ubuntu·docker