目标:
- 通过脚本手动部署项目到远程服务器
- 使用 GitHub webhook 在分支变更时自动部署
部署脚本
分析 PHP Laravel 项目包含如下部署步骤:
- 更新项目代码
- 安装扩展包
- 发布扩展包,更新静态文件
- 清除视图缓存
- 执行数据表迁移
- 更新 APP KEY
据此在项目根目录下新建部署文件 deploy.sh:
#!/bin/bash
whoami
git pull
/usr/local/bin/composer install --prefer-dist --optimize-autoloader -vvv
php artisan vendor:publish --force
php artisan view:clear
php artisan migrate
php artisan key:generate
安装 Jenkins
这里使用 docker 安装,也可以使用安装包安装,具体可参考 Jenkins 官方文档
运行 Jenkins 容器,如本地不存在 Jenkins 镜像,则 docker 会自动下载:
docker run \
--name jenkins\
-u root \
-d \
-p 8080:8080 \
-p 50000:50000 \
-v jenkins-data:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
jenkinsci/blueocean
参数说明:
-
--name
:指定容器名称,容器退出后可用该名称管理容器 -
-d
:后台运行 -
-p 8080:8080
:本机 8080 端口映射 Docker 容器中的 8080 端口 -
-v
:数据卷,容器删除后,数据仍然在本机
Jenkins 安装完成后访问 http://localhost:8080 即可查看 Jenkins 管理页面了。首先会让你输入密钥,拷贝输入:
cat /var/jenkins_home/secrets/initialAdminPassword
进入容器:
docker exec -it jenkins bash
拷贝页面中路径内的密钥输入即可。然后安装 Jenkins 建议的插件。安装完成后创建一个管理员账号。
image
安装 Jenkins 插件
点击左侧【Manage Jenkins】菜单,进入【插件管理】,点击【可选插件】 TAB,然后输入【Publish Over SSH】搜索并安装该插件。
image
安装好插件后,重启 docker 容器:
docker restart jenkins
Jenkins 配置服务器信息
假设你的 Jenkins 安装在本机或一台专门的部署机器(称为 发布机),服务部署在远程的另一台服务器(称为 服务机),则你需要使发布机能无密码连接服务机。
拷贝发布机上的公钥 /root/.ssh/id_rsa.pub,若公钥不存在,则先执行以下命令生成密钥:
ssh-keygen -t rsa
登录服务机,将拷贝的发布机公钥粘贴到服务机上管理服务用户的 ~/.ssh/authorized_keys 文件中。
在发布机上测试能否无密码连接服务机:
ssh user@server_ip
成功后,在 Jenkins 页面添加服务器信息。进入菜单【Manage Jenkins】>【系统配置】
image
找到【Publish over SSH】项,填写服务机信息:
- Hostname 填服务机的 IP 地址
- username 填执行部署的用户名(和刚才存放发布机公钥的用户一致)
-
Remote Directory 填该用户的家目录即可
填好后点击【Test Configuration】按钮,如成功下方会显示「Success」,失败会提示。最后点击【保存】
image
配置 GitHub 信息
这里我们是从 GitHub 拉取源代码的,先配置 GitHub 账号。
将 Jenkins 机器的 /root/id_rsa.pub 复制到 GitHub 项目【Settings】>【Deploy Keys】中:
点击 Jenkins 左侧【凭据】-【系统】菜单,点击【全局凭据】
image
点击【添加凭据】
image
填写内容:Private Key 填刚才添加到 GitHub 的 Jenkins 机器公钥,Passphrase 不用填
image
新建部署项目
点击 Jenkins 左侧菜单中【新建 Item】,填入项目名称,选择【Freestyle Project】
image
接着填写仓库地址、部署机器、构建脚本等相关信息。
- 【General】下 GitHub 项目填入项目 URL
- 【构建】TAB 下选择服务机,填入构建脚本,脚本内容如下:
cd /home/ubuntu/git/blog
whoami
git pull
/usr/local/bin/composer install --prefer-dist --optimize-autoloader -vvv
php artisan vendor:publish --force
php artisan view:clear
php artisan migrate
php artisan key:generate
你也可以将此脚本添加到项目 Git 仓库中,并在【Exec command】中执行该脚本:./deploy.sh
。
手动执行构建
进入构建项目中,点击左侧【立即构建】按钮后,在【Build History】将显示构建状态,点击可进入查看构建输出,构建完成后,若成功,则显示蓝色小球,失败,显示黄色小球。
image
也可以点击左侧【打开 Blue Ocean】后点击【运行】进行构建:
image
通过 GitHub webhook 触发构建
安装相关插件
Jenkins 上先安装以下插件:
- Build Authorization Token Root
- Build Token Trigger
- GitHub Integration
安装完成后重启
创建 GitHub access_token
GitHub 需要通过 access_token 访问钩子 API,需先在 GitHub 上创建。
进入 GitHub,点击【头像】>【Settings】>【Developer settings】>【Personal access tokens】>【Generate new token】
image image
勾选【repo】和【admin:repo_hook】,然后点击【Generate token】按钮
image
创建完成后将 token 拷贝保存。
image
修改 Jenkins 项目 Git 配置
进入项目配置,【源码管理】中添加【Git】配置:
image
运行以下命令生成令牌并复制:
openssl rand -hex 16
【构建触发器】TAB 下勾选【触发远程构建】,将令牌粘贴到【身份验证令牌】输入框中,并勾选【GitHub hook trigger for GITScm polling】
image
点击【保存】。
Jenkins 配置 Git plugin
【系统管理】 –> 【系统设置】 –> 【GitHub】 –> 【Add GitHub Sever】
API URL 填入:https://api.github.com
凭据添加刚才 GitHub 中创建的 access_token,类型选【Secret text】,【Secret】填入 token。
GitHub 项目配置 webhook
进入项目 GitHub 主页,【Settings】>【Webhooks】下进行配置:
-
Payload URL 填写:
http://JENKINS_URL/github-webhook/
-
Secret 填写刚才 openssl 生成的 token
image保存后 GitHub 会自动触发一次 Push。
image第一次保存时,Jenkins 返回 403,报错:
image403 No valid crumb was included in the request
,原因为 Jenkins 部署在 docker 上,需通过发布机代理。到【系统设置】>【全局安全配置】>【跨站请求伪造保护】中勾选【启用代理兼容】
保存配置后点击 GitHub 下方【Redeliver】按钮触发 push,若返回 200 表示 webhook 设置成功。
imagePush 代码,自动构建
此时,Push 代码到 master 分支,可在 Jenkins 页面看到触发构建成功。
网友评论