使用 Jenkins 部署 PHP Laravel 项目 作者: truesnow 发布于: 6个月前 收录于: 个人网站开发 660 0 摘要:当推送代码到 GitHub 时,通过 GitHub 的 webhook 机制,使 Jenkins 自动部署博客服务,提高开发效率,解放生产力。 [TOC] 目标: - 通过脚本手动部署项目到远程服务器 - 使用 GitHub webhook 在分支变更时自动部署 # 部署脚本 分析 PHP Laravel 项目包含如下部署步骤: - 更新项目代码 - 安装扩展包 - 发布扩展包,更新静态文件 - 清除视图缓存 - 执行数据表迁移 - 更新 APP KEY 据此在项目根目录下新建部署文件 *deploy.sh*: ```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 官方文档](https://www.jenkins.io/zh/doc/book/installing/) 运行 Jenkins 容器,如本地不存在 Jenkins 镜像,则 docker 会自动下载: ```sh 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 管理页面了。首先会让你输入密钥,拷贝输入: ```sh cat /var/jenkins_home/secrets/initialAdminPassword ``` 进入容器: ```sh docker exec -it jenkins bash ``` 拷贝页面中路径内的密钥输入即可。然后安装 Jenkins 建议的插件。安装完成后创建一个管理员账号。  # 安装 Jenkins 插件 点击左侧【Manage Jenkins】菜单,进入【插件管理】,点击【可选插件】 TAB,然后输入【Publish Over SSH】搜索并安装该插件。  安装好插件后,重启 docker 容器: ```sh docker restart jenkins ``` # Jenkins 配置服务器信息 假设你的 Jenkins 安装在本机或一台专门的部署机器(称为 **发布机**),服务部署在远程的另一台服务器(称为 **服务机**),则你需要使发布机能无密码连接服务机。 拷贝发布机上的公钥 */root/.ssh/id_rsa.pub*,若公钥不存在,则先执行以下命令生成密钥: ```sh ssh-keygen -t rsa ``` 登录服务机,将拷贝的发布机公钥粘贴到服务机上管理服务用户的 *~/.ssh/authorized_keys* 文件中。 在发布机上测试能否无密码连接服务机: ```sh ssh user@server_ip ``` 成功后,在 Jenkins 页面添加服务器信息。进入菜单【Manage Jenkins】>【系统配置】  找到【Publish over SSH】项,填写服务机信息: - Hostname 填服务机的 IP 地址 - username 填执行部署的用户名(和刚才存放发布机公钥的用户一致) - Remote Directory 填该用户的家目录即可 填好后点击【Test Configuration】按钮,如成功下方会显示「Success」,失败会提示。最后点击【保存】  # 配置 GitHub 信息 这里我们是从 GitHub 拉取源代码的,先配置 GitHub 账号。 将 Jenkins 机器的 */root/id_rsa.pub* 复制到 GitHub 项目【Settings】>【Deploy Keys】中:  点击 Jenkins 左侧【凭据】-【系统】菜单,点击【全局凭据】  点击【添加凭据】  填写内容:Private Key 填刚才添加到 GitHub 的 Jenkins 机器公钥,Passphrase 不用填  # 新建部署项目 点击 Jenkins 左侧菜单中【新建 Item】,填入项目名称,选择【Freestyle Project】  接着填写仓库地址、部署机器、构建脚本等相关信息。 - 【General】下 GitHub 项目填入项目 URL - 【构建】TAB 下选择服务机,填入构建脚本,脚本内容如下: ```sh 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】将显示构建状态,点击可进入查看构建输出,构建完成后,若成功,则显示蓝色小球,失败,显示黄色小球。  也可以点击左侧【打开 Blue Ocean】后点击【运行】进行构建:  # 通过 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】   勾选【repo】和【admin:repo_hook】,然后点击【Generate token】按钮  创建完成后将 token 拷贝保存。  ## 修改 Jenkins 项目 Git 配置 进入项目配置,【源码管理】中添加【Git】配置:  运行以下命令生成令牌并复制: ```sh openssl rand -hex 16 ``` 【构建触发器】TAB 下勾选【触发远程构建】,将令牌粘贴到【身份验证令牌】输入框中,并勾选【GitHub hook trigger for GITScm polling】  点击【保存】。 ## 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  保存后 GitHub 会自动触发一次 Push。  第一次保存时,Jenkins 返回 403,报错:`403 No valid crumb was included in the request`,原因为 Jenkins 部署在 docker 上,需通过发布机代理。到【系统设置】>【全局安全配置】>【跨站请求伪造保护】中勾选【启用代理兼容】  保存配置后点击 GitHub 下方【Redeliver】按钮触发 push,若返回 200 表示 webhook 设置成功。  ## Push 代码,自动构建 此时,Push 代码到 master 分支,可在 Jenkins 页面看到触发构建成功。 # 参考 - [PHP+Jenkins 持续集成](https://juejin.im/entry/58f1c27644d904006cf0d276) - [Deploy keys | GitHub](https://developer.github.com/v3/guides/managing-deploy-keys/#deploy-keys) - [使用jenkins对Laravel项目进行持续集成](http://jialeicui.github.io/blog/laravel_project_ci_using_jenkins.html) - [使用Jenkins配合Github hook持续集成](http://callmedadaxin.github.io/2018/07/20/jenkins-github-hook/) - [Webhooks | GitHub](https://developer.github.com/webhooks/)
所有评论(0)
暂无评论~_~