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

相关推荐
Web极客码2 分钟前
WordPress 在哪里存储网站上的图片?
运维·服务器·wordpress
大佐不会说日语~4 分钟前
Docker Compose 部署 Spring Boot 应用 502 Bad Gateway 问题排查与解决
spring boot·docker·gateway·maven·故障排查
想逃离铁厂的老铁8 分钟前
Day60 >> 94、城市间货物运输1️⃣ + 95、城市间货物运输 2️⃣ + 96、城市间货物运输 3️⃣
java·服务器·前端
草莓熊Lotso9 分钟前
从零手搓实现 Linux 简易 Shell:内建命令 + 环境变量 + 程序替换全解析
linux·运维·服务器·数据库·c++·人工智能
小二·12 分钟前
Go 语言系统编程与云原生开发实战(第6篇)云原生部署实战:Docker 镜像瘦身 × K8s 部署 × Helm 一键发布
docker·云原生·golang
小二李11 小时前
第11章 nestjs服务端开发:登录鉴权
运维·服务器
i建模12 小时前
如何在Arch Linux中重设忘记的root密码
linux·运维·服务器
小陈phd14 小时前
混合知识库搭建:本地Docker部署Neo4j图数据库与Milvus向量库
数据库·docker·neo4j
Wpa.wk15 小时前
容器编排 - 了解K8s(pod, deployment,service,lable等概念)
经验分享·测试工具·docker·云原生·容器·kubernetes
何中应15 小时前
vmware的linux虚拟机如何设置以命令行方式启动
linux·运维·服务器