场景
原本的博客后端系统是通过 composer 安装依赖后使用 docker-compose 构建镜像容器运行的,这种情况下,每次迭代都需要重复进行以下流程:
- 开发完毕后通过 git 提交代码
- 登录服务器
git pull拉取代码 - 安装依赖
composer install|update(可选) - 构建镜像并启动容器
docker-compose up -d --build(可选)
当一天内频繁更新时,就会产生大量的重复性工作,且比较容易犯错(人总会有犯错的时候)
故此,我选择做出一些改变,让机器做这件频繁重复的事情(主要还是懒~)
Jenkins
Jenkins 是一个开源的 CI&CD 软件,简单、灵活、可扩展。提供1000+插件来支持构建、部署、自动化, 满足任何项目的需要。
安装
这里通过 docker jenkinsci/blueocean 镜像搭建:
# docker run -d -u root --name jenkins -p 8089:8080 -v /usr/local/jenkins-data:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock -v "$home":/home jenkinsci/blueocean
容器启动后可通过 http://IP:8089 端口访问 Jenkins 等待系统初始化完成后出现 输入秘钥解锁 解锁页面。
从 docker 容器日志中获取秘钥并输入页面即可解锁系统
# docker logs --tail 30 -f jenkins
秘钥位于日志中两行***号之间
系统解锁后就可以安装想要的插件并开始使用啦(也可以直接安装系统推荐的插件)
目标
通过配置 Pipeline 来自动实现以下流程。
- 自动同步git仓库最新代码版本至
Jenkins - 通过
composer install安装依赖 - 拷贝代码至项目运行目录(因为需要nginx搭建站点,所以目录固定)
- 通过
docker-compose重启容器
创建流水线
首先打开 Blue Ocean 点击 创建流水线

选择应用所在的代码仓库,这里我选的是 GitHub

选择完毕后,如果是第一次使用 GitHub 作为工作流代码仓库的话,需要在 GitHub 生成一个 access token 并绑定至 Jenkins

接下来跟着步骤一步一步的绑定 GitHub 组织、选择工作流绑定的项目仓库后,点击 创建流水线 即可。

此时如果项目仓库中没有 Jenkinsfile 的话会出现一个页面让我们可视化的配置,这里直接取消掉该步骤即可。
在项目根目录中创建 Jenkinsfile 文件,并写入以下内容
pipeline {
agent {
label 'my-blog' // 使用 label 为 my-blog 的节点运行该流水线的构建任务
}
stages {
stage('build') {
steps {
sh 'composer install'
}
}
stage('deploy') {
steps {
input message: 'Begin deployment? (Click "Proceed" to continue)'
sh './restart.sh'
}
}
}
}
PS:这里的
my-blog是我创建的子节点,节点标签为my-blog因为我有一台服务器已经装好了php composer环境,所以直接使用这台服务器来构建应用(如何创建子节点参照 Jenkins创建子节点)
这里主要是定义与描述该流水线的工作方式以及内容:
- 执行shell命令
composer install构建代码,处理依赖 - 运行
restart.sh进行代码部署
restart.sh
rsync -avzP --delete ./ /data/website/blog/ --exclude "temp"
cd /data/website/blog
docker-compose restart
因为很早之前我已经将 docker 镜像以及容器构建完成,所以这里就直接重启应用的容器好了,不再重新构建镜像和容器(也可以节省很多构建时间)
将改动提交至代码仓库后,进入 Jenkins 后台,打开 Blue Ocean

在分支页面选中要进行构建的分支,点击 运行 图标

点击右下角的 打开 构建按钮可以查看当前的构建任务

这里加了一个手动确认部署的过程(配置项为 Jenkinsfile 中的 input message)
点击继续后,将进行最后的部署工作。
当页面主题色变为 绿色 时代表构建任务成功完成,红色 为构建失败,可以展开最后进行的构建步骤查看详细输出信息。

总结
至此,就已经通过 Jenkins + Blue Ocean 创建了一个简单的 php 应用构建、部署工作流啦~ 不过这里还有一些更好的东西可以实现:
- 配置
WebHook自动拉起构建任务 - 基于分支进行多环境构建
- 自动构建新的
docker镜像 - 。。。
