美文网首页
使用 Jenkins 部署 PHP Laravel 项目

使用 Jenkins 部署 PHP Laravel 项目

作者: charmingcheng | 来源:发表于2021-03-03 08:28 被阅读0次

目标:

  • 通过脚本手动部署项目到远程服务器
  • 使用 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】中:

image

点击 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

image image

手动执行构建

进入构建项目中,点击左侧【立即构建】按钮后,在【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。

image image

GitHub 项目配置 webhook

进入项目 GitHub 主页,【Settings】>【Webhooks】下进行配置:

  • Payload URL 填写:http://JENKINS_URL/github-webhook/

  • Secret 填写刚才 openssl 生成的 token


    image

    保存后 GitHub 会自动触发一次 Push。


    image

    第一次保存时,Jenkins 返回 403,报错:403 No valid crumb was included in the request,原因为 Jenkins 部署在 docker 上,需通过发布机代理。到【系统设置】>【全局安全配置】>【跨站请求伪造保护】中勾选【启用代理兼容】

    image

保存配置后点击 GitHub 下方【Redeliver】按钮触发 push,若返回 200 表示 webhook 设置成功。

image

Push 代码,自动构建

此时,Push 代码到 master 分支,可在 Jenkins 页面看到触发构建成功。

相关文章

网友评论

      本文标题:使用 Jenkins 部署 PHP Laravel 项目

      本文链接:https://www.haomeiwen.com/subject/fajipktx.html