场景
原本的博客后端系统是通过 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
镜像 - 。。。