使用 jenkins 完成自动部署
使用 jenkins 完成自动部署
本文记录了使用 jenkins 配合 github/gitee 的 webhook 完成自动化部署, 以及在部署过程中遇到的问题.
环境说明
- centos 7.9
- docker 24.0.2
- jenkins/jenkins 2.401.2
web 服务配置
我的 web 项目是一个 vue2 的项目, Dockerfile
如下:
# 构建阶段
# 使用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
# 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 配置
- 登录 jenkins
进入 jenkins 登录页面, 提示从/var/jenkins_home/secrets/initialAdminPassword
可以找到初始密码, 因为已经做过映射了, 直接从宿主主机的/home/jenkins_home/secrets/initialAdminPassword
中查找初始密码
cat /home/jenkins_home/secrets/initialAdminPassword
- 安装推荐插件
选择Install suggetsed plugins
, 等待安装完成, 如果有安装失败的尝试重新安装
- 创建管理员账号
- 安装插件
进入首页后, 点击Manage Jenkins
, 然后选择plugins
进入插件管理页面
选择Available plugins
, 搜索publish over ssh
, 安装插件, 等待安装完成
- 配置
publish over ssh
回到首页, 点击Manage Jenkins
, 选择System
设置
拉到最下面找到Publish over SSH
的配置, 新增一个服务器, 输入服务器名称, 主机地址, 用户名和密码, 然后点击Test Configuration
看是否能正常连接
- 创建项目
回到首页点击New Item
新建项目
选择Freestyle project
, 输入项目名称
往下拉找到Source Code Management
, 然后点击Add
, 新增用户, 可以通过账号密码或者秘钥创建. 创建完成用户后, 输入你的仓库地址, 选择刚才创建的用户.
继续往下拉找到Build Environment
, 选择Send files or execute commands over SSH before the build starts
输入你的构建脚本, 然后保存
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 实现自动部署
- 回到首页, 点击
People
, 选择用户
- 新增
API Token
选择Configure
, 在API Token
中点击Add new Token
, 输入名称后点击Generate
生成, 将生成的值复制一下.
- 设置触发器
返回首页, 选择刚才的项目, 进入设置Configure
, 下拉找到Build Triggers
, 勾选Trigger builds remotely (e.g., from scripts)
将刚才复制的值复制到Authentication Token
中.
- webhook 配置
打开项目主页面, 我这边以gitee
为例, github
基本相同, 选择项目中的管理, 找到 webhook, 新增 webhook.
根据上一步的提示, 将Token
拼好, 然后把Authentication Token
复制到 URL 中.
- 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
.
转载自:https://juejin.cn/post/7299800370489491494