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

相关推荐
kfepiza23 分钟前
Debian的`/etc/network/interfaces`的`allow-hotplug`和`auto`对比讲解 笔记250704
linux·服务器·网络·笔记·debian
无妄-202434 分钟前
软件架构升级中的“隐形地雷”:版本选型与依赖链风险
java·服务器·网络·经验分享
艾伦_耶格宇1 小时前
【docker】-1 docker简介
运维·docker·容器
R.X. NLOS1 小时前
VS Code远程开发新方案:使用SFTP扩展解决Remote-SSH连接不稳定问题
运维·服务器·ssh·debug·vs code
IvanCodes2 小时前
二、Docker安装部署教程
docker·容器
轩情吖5 小时前
Qt的第一个程序(2)
服务器·数据库·qt·qt creator·qlineedit·hello world·编辑框
世事如云有卷舒5 小时前
Ubunt20.04搭建GitLab服务器,并借助cpolar实现公网访问
linux·服务器·gitlab
Little-Hu6 小时前
QML TextEdit组件
java·服务器·数据库
riverz12276 小时前
TCP backlog工作机制
服务器·网络·tcp/ip
2401_858286116 小时前
OS15.【Linux】gdb调试器的简单使用
linux·运维·服务器·开发语言·gdb