Github webhooks 自動部署博客文章,使用總結【含視頻】
作者:小傅哥
博客://bugstack.cn
原文://mp.weixin.qq.com/s/VtTHUfyiITNSoGy052jkXQ
沉澱、分享、成長,讓自己和他人都能有所收穫!😄
一、前言
小傅哥,我搞了三台服務器,維護學校遊戲社站點,我麻了!
📧女粉來信:傅哥,我大二了,就編程學的還可以的那種大二女生😄。最近我不是天天看見一大堆人宣傳服務器白皮襖嗎,我就在11.1日也買了,還讓宿舍的兩個同學一起跟着買了,都買了三年。想着這樣我們三個人就可以搭建和維護我們學校遊戲社團的站點了,日常維護着學校的遊戲比賽、宣傳、通知,還能順便就把我學的編程技術用上,一舉多得嘛。本來還想,可以趕在 EDG VS DK 的時候上線秀一下呢,但是域名要備案好多天,只能鴿了。而且隨着我們三個熬夜的折騰服務器、做站點網站、備案域名,真是遇到太多問題了,以前感覺課本學了就能起飛呢,現在全拉胯了。只能一遍學習傅哥的雲服務器操作視頻,一遍部署驗證,真的學到了好多好多!再次感謝傅哥!那麼現在問題來了,就是傅哥你的B站視頻只有6節,我看完也跟着做了,但這回我遇到了新的問題,就是就是,我三個服務器,按照視頻配置完 Nginx 負載以後,每次都要通過 FTP 把網站文件傳到三個服務器上去,有時候還忘記一個。這咋弄呀,傅哥給想想辦法嘛。
📨傅哥回信:辦法是有的,可以把你的網站代碼設置私有倉庫傳到 Github 或者 Gitee,這兩個代碼庫都支持 webhook 簡單說就是當你把代碼 push 到代碼庫以後,代碼庫會調用你預先配置好的一個或者多個回調鉤子,其實也就是調用你三個負載均衡的站點提供的 URL,來通知你現在這個代碼庫有最新更新的代碼,你可以在收到 URL 的調用通知以後,通過 git pull
命令把最新上傳的網站代碼,拉取到服務器上。那麼現在的效果就是,你把代碼維護在 GitHub 以後,上傳最新的網站內容以後,三個站點就可以自動部署了,簡要流程如下:
方案流程:
- 在自己的網站站點中,提供 webhooks URL 訪問地址,配置到
Github/Gitee
代碼庫的 Settings -> Webhooks在下文中會有詳細介紹
- 例如圖中 webhooks.php 開發的內容就是在接收到調用的時候,獲取入參以後開始執行 git pull 操作
shell_exec("git pull origin main 2>&1");
- webhooks 配置完成以後,當我們再通過 git push 把本地代碼推送到倉庫(Github/Gitee)的時候,倉庫就會調用全部的 webhooks.php,把倉庫(Github/Gitee)中的代碼拉取到站點中,這樣就完成了整個站點內容的更新。
🤔 傅哥,你說的我悟了,但需要你再手把手,操作下!
二、環境說明
- 【必須】使用 Github、Gitee、Codechina 維護網站代碼,因為這些代碼庫可以支持配置 webhooks
- 【必須】Linux 雲服務器(公網IP);安裝Git、安裝Nginx、安裝PHP、安裝FTP
- 【可選】使用寶塔運維面板,部署站點博客,操作起來會比較方便
三、站點配置
首先,我們使用 Linux 寶塔運維面板,添加一個博客站點,在添加之前需要在寶塔中安裝 Nginx、FTP、PHP模塊,如果你對這裡的操作比較陌生,可以先看小傅哥在B站錄製好的雲服務器學習視頻,地址://space.bilibili.com/15637440/channel/seriesdetail?sid=479958 PS:當然你也可以不使用寶塔,通過命令安裝 Nginx 或者 Apache 服務器等所需要的軟件也是可以的。
1. 環境安裝
安裝 Git
- 需求:在站點接收到 webhooks 回調時,使用 git pull 拉取網站代碼,所以需要安裝 git
- 命令:
yum -y install git
- 驗證:
[root@CodeGuide ~]# git version
git version 2.27.0
安裝 Nginx、FTP
- 需求:部署博客站點時會需要到Nginx服務器、FTP上傳
- 操作:可以直接在寶塔中使用
軟件商店
進行安裝
配置 PHP,允許 exec 腳本指令
-
需求:由於我們使用的是 PHP 開發的 webhook 回調操作,所以這裡需要安裝 PHP 模塊
-
安裝:直接在寶塔的軟件商店中進行安裝即可
-
配置:安裝完 PHP 模塊以後,還需要對 PHP 的
php.ini
進行更改,刪除 disable_functions 下的 exec、shell_exec,這樣才能在 webhooks.php 文件中,執行腳本命令。如圖:
2. 站點配置
- 環境安裝完畢後,就可以添加一個網站的站點了,你的網站運行代碼都需要上傳到這個站點中,它提供了 FTP 操作以及寶塔運維面板中還有一個
文件
,可以在線修改站點內容。
3. 訪問站點
- 地址://39.96.73.167 – 你換成自己的訪問IP即可
- 描述:默認創建完站點,會在
/www/wwwroot/39.96.73.167
目錄下有一個 index.html 此時你可以進行在線修改
四、創建公鑰
SSH 是 Linux 系統的登錄工具,現在廣泛用於服務器登錄和各種加密通信。
1. 查看運行用戶
一般php運行使用的是 www
用戶,我們可以通過 ftp 上傳一個 index.php 到站點根目錄下,之後進行訪問站點,查看項目路徑和用戶目錄。
index.php 中的代碼如下
<?php
header('Content-type: text/html; charset=utf-8');
ini_set("error_reporting", "E_ALL & ~E_NOTICE");
echo "Hi,Webhooks!By 小傅哥<br/>";
echo '<br/>測試:輸出項目路徑和用戶目錄:<br/>';
exec("cd ~ && cd - && cd -", $output);
echo '<pre>';
echo print_r($output);
echo '</pre>';
- 如果你未對
php.ini
中的disable_functions = {exec、shell_exec}
刪掉,那麼執行這個 php 文件的中腳本指令會報錯。
訪問站點
- 項目路徑:
[0] => /www/wwwroot/39.96.73.167
- 用戶目錄:
[1] => /home/www
– www 就是這個用戶目錄,也就是我們需要為其創建 ssh 公鑰的用戶
2. 生成和配置公鑰
2.1 開啟 www 用戶
-
命令:
vim /etc/passwd
-
配置:把
sbin/nologin
為bin/bash
2.2 生成公鑰
因為我們已經開始了 www 登錄權限,那麼在生成公鑰之前,需要切換到 www 賬戶下,命令:su www
-
切換用戶:
su www
-
生成公鑰:
ssh-keygen -t rsa -C "[email protected]"
– 默認回車即可 -
查看公鑰:
cat ~/.ssh/id_rsa.pub
– 其他賬戶下不可見,只有切換到 www 可見
2.3 配置公鑰(Github)
-
配置:把你通過
cat ~/.ssh/id_rsa.pub
查看到的公鑰,配置到這裡即可,如下:- 有了這個公鑰的配置,我們通過 webhooks.php 中的腳本指令就可以自動的拉取代碼了。
五、webhooks 更新博客
1. 克隆我的代碼
- 源碼:關注公眾號:bugstack蟲洞棧 – 回復:
guide-webhooks
即可獲得 - 使用:你可以把我的源碼先fork到自己的Github,然後部署到你的站點中。在學習完成搞清楚原理後,再處理你自己的站點
2. 部署到站點
- 這裡我們需要先在站點使用
git clone 」你的網站代碼git地址「
,把Github代碼克隆到自己的博客中,其實也就是啟動了部署做的作用。而這步操作,其實就是日常使用 Git 的方式,先克隆代碼,在不斷 git pull 更新。 - 命令:
[www@CodeGuide 39.96.73.167]$ git clone [email protected]:fuzhengwei/guide-webhooks.git
– 注意,你需要切換為自己的代碼庫地址,否則 webhooks 不能生效
3. 更改網站運行目錄
- 因為我們已經在博客站點中,從 Github 克隆下來我們的博客運行代碼,那麼這裡需要把網站的運行目錄切換到這個文件夾下,這樣就能正常訪問到我們的博客代碼了。
4. 配置 webhooks
webhooks.php
回調腳本
<?php
/**
* Git webhooks 自動部署腳本
* 地址://github.com/fuzhengwei/guide-webhooks/settings/hooks
*/
// 接收post參數
$requestBody = file_get_contents("php://input");
if (empty($requestBody)) {
exit('data null!');
}
// Content type = application/json
$content = json_decode($requestBody, true);
// 驗證 Webhooks 配置的 Secret,也可以不驗證
/*if (empty($content['password']) || $content['password'] != '123456') {
exit('password error');
}*/
// 項目存放物理路徑,也就是站點的訪問地址
$path = "/www/wwwroot/39.96.73.167/guide-webhooks/";
// 判斷需要下拉的分支上是否有提交,我們這裡的分支名稱為 main
if ($content['ref'] == 'refs/heads/main') {
// 執行腳本 git pull,拉取分支最新代碼
$res = shell_exec("cd {$path} && git pull origin main 2>&1"); // 當前為www用戶
// 記錄日誌 ($content 返回的是一整個對象,可以按需獲取裏面的內容,寫入日誌)
$res_log = '------------------------->' . PHP_EOL;
$res_log .= '用戶 ' . $content['pusher']['name'] . ' 於 ' . date('Y-m-d H:i:s') . ' 向項目【' . $content['repository']['name'] . '】分支【' . $content['ref'] . '】PUSH ' . $content['commits'][0]['message'] . PHP_EOL;
$res_log .= $res . PHP_EOL;
// 追加方式,寫入日誌文件
file_put_contents("git_webhook_log.txt", $res_log, FILE_APPEND);
}
echo 'done';
-
在我們從 Github 克隆下來的代碼文件中,有一個名為
webhooks.php
的文件,它是用於處理 Github 回調時拉取 Github 對應博客代碼庫的腳本文件。 -
現在 //39.96.73.167/webhooks.php 就可以配置到 Github 的 webhooks 下了,如圖:
- 配置,URL、Content type、Secret、trigger,配置完成後確認即可,另外你可以把多個服務器實例都配置上 webhooks,這樣就可以在推送代碼到 Github 倉庫時一起部署了。
六、部署驗證
目前,訪問博客是這樣,如下:接下來我們開始修改博客文件並提交,驗證自動部署更新站點
1. index.php 新增代碼
- 你可以在 index.php 文件中修改任意內容,或者添加新的內容。
2. push 代碼到 Github
- 推送新修改的內容,到代碼庫中,等待 Github webhooks 回調腳本
3. 驗證博客更新
-
效果:
- 通過訪問博客地址,已經可以看到我們新加入的內容,已經自動部署更新到站點了!✌🏻
4. 查看腳本執行日誌
在我們的 webhooks.php 中,執行 git pull 腳本的時候,還有一段日誌記錄,便於知曉誰對網站對了什麼!
git_webhook_log.txt
- git_webhook_log.txt 是在 webhooks.php 中記錄的日誌文件,你可以自行擴展其他需要輸出的內容。
5. 查看webhooks推送日誌
- 每一次 webhooks 執行時,都會有對應的記錄,來告訴你本次代碼推送是否被回調成功。並且在日誌中,你還可以看到 webhooks 向你推送的內容 JSON 文件內容,你可以從中獲取需要的信息,比如這是誰推送的、在哪個分支推送的、推送的文件有哪些等等。
- 這裡也截取了一段推送的 JSON,其餘信息你可以在推送記錄中自己查看了。
七、總結
- 本章節我們帶着大家徹底的把 webhooks 的使用走了一遍,也讓需要此技術的小夥伴可以讓自己的站點部署變更的更加
聰明一些
。當然自己做記錄也幫助了一些師弟和小姐姐! - 那麼現在如果你手裡有服務器正在吃灰不知道怎麼用起來,現在可以折騰起來了,因為傅哥給你錄好了入門視頻、寫好了操作文章,那麼不要等待了,上吧!年輕人!課程鏈接://space.bilibili.com/15637440/channel/seriesdetail?sid=479958
八、系列推薦
- 《Netty+JavaFx實戰:仿桌面版微信聊天》代碼開源、上雲部署、視頻講解,只為讓你給點個Star!
- Cloudreve 自建雲盤實踐,我說了沒人能限得了我的容量和速度!
- 一天建4個,小傅哥教你搭博客!
- 小傅哥,一個有「副業」的碼農!
- 講道理,只要你是一個愛折騰的程序員,畢業找工作真的不需要再花錢培訓!