作為強迫癥患者,一直對自動化部署非常癡迷,個人認為全自動部署最重要的就是穩定可靠,經過研究測驗,最終使用 GitHub 和騰訊云兩大平臺,成功完成了全自動部署網站的實踐,
本文來自 Serverless 社區用戶「Stille」投稿
方案簡介
業務需求
博主有一個簡單的純靜態檔案站點 docs.ioiox.com,使用的的是 docsify 專案的 Markdown 渲染程式,平時通過本地 VSCode 編輯檔案,并提交到 GitHub,早前是直接使用 GitHub Pages 系結域名來訪問,但由于網路問題,體驗并不好,
尋求方案
騰訊云物件存盤 COS 服務能夠提供靜態網頁服務,并可以配置 CDN 域名進行訪問,那么就需要解決以下兩個問題:
- 如何使 GitHub 自動同步檔案到騰訊云 COS
- 騰訊云 COS 對應的 CDN 如何自動重繪
解決方案
- GitHub Action - 配置每次 Push 代碼后自動上傳到 COS
- 騰訊云云函式 SCF - 檢測到 COS 內檔案變動后自動重繪對應的 CDN 鏈接
方案流程圖

第一階段 - GitHub Actions

2019 年 11 月,GitHub 正式開放了 GitHub Actions 這個功能,不再需要申請就能自由使用,目前是按照 workflow 的使用時長來收費,個人用戶每月 2000 分鐘的免費額度也基本夠用了,
獲取騰訊云 API 密鑰
登錄騰訊云控制面板 - 訪問控制 - 訪問密鑰 - API 密鑰管理
新建密鑰

此密鑰擁有所有權限,為保證安全,也可以添加子用戶,配置 COS,CDN 對應的權限
配置騰訊云 COS
登錄騰訊云控制面板 - 物件存盤 - 存盤桶串列
創建存盤桶
選擇適合你的區域,設定權限為 公有讀私有寫.


獲取存盤桶相關資訊

配置 GitHub Actions
GitHub倉庫 - Settings - Secrets
添加 SecretId 和 SecretKey 分別為剛才獲取的騰訊云 API 密鑰

GitHub倉庫 - Actions
默認會有很多推薦的 workflows,這里選擇 Set up a workflow yourself 自己來配置,

系統會創建一個 workflow 的 yml 組態檔,洗掉預設代碼,復制以下樣本代碼,
圖上標紅兩處需修改為剛才創建存盤桶獲取的名稱和區域
然后右上角提交即可,

yml 組態檔樣本
name: Upload to COS
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: Install coscmd
run: sudo pip install coscmd
- name: Configure coscmd
env:
SECRET_ID: ${{ secrets.SecretId }}
SECRET_KEY: ${{ secrets.SecretKey }}
BUCKET: docs-1300533487
REGION: ap-shanghai
run: coscmd config -a $SECRET_ID -s $SECRET_KEY -b $BUCKET -r $REGION
- name: Upload
run: coscmd upload -rs --delete -f ./ / --ignore "./.git/*"
測驗 GitHub Actions
提交 yml 后系統檢測到 main.yml 的 push,便會開始運行這個 workflow,根據 yml 組態檔,可以看出整個作業流簡單理解為安裝了騰訊云的 coscmd 工具,并根據配置的 SecretId、SecretKey、BUCKET、REGION 上傳整個倉庫到騰訊云 COS,同時忽略掉 .git 檔案夾,其中 upload -rs 命令會使用 md5 比對存盤桶中已存在的檔案,相同檔案將會跳過上傳,


第二階段 - 騰訊云函式 SCF

配置騰訊云 CDN 域名
登錄騰訊云控制面板 - 物件存盤
進入創建的存盤桶 - 基礎配置 - 開啟靜態網站

域名管理
添加自定義加速域名,并設定域名指向生成的CNAME地址,源站型別改為靜態網站源站,

控制面板 - 內容分發網路 - 域名管理
點擊添加的域名 - 高級配置
開啟 HTTPS,設定強制跳轉 HTTPS,并更改跳轉方式為 301,在點擊前往配置申請免費證書,

配置云函式 SCF
登錄騰訊云控制面板 - 云函式
首次使用云函式可能會跳出 服務授權 框,需要前往訪問添加并同意授權即可,該角色對本次添加的云函式沒有影響,


選擇和你存盤桶相同區域并新建
填寫函式名,運行環境選擇 Php 5.6,創建方式選擇 空白函式 下一步,


函式配置
上部分保持默認即可
洗掉默認代碼,復制以下樣本代碼至此.
圖上標紅兩處需修改為之前獲取的 API 密鑰,注意此處的 ID 和 KEY 順序和之前配置 GitHub Actions 時是相反的,并把 CDN 鏈接改為你的域名,如果域名已配置過 HTTPS 和證書,確保此處為 https,
完成即可


函式代碼樣本
<?php
$gl = 1;
function main_handler($event, $context) {
$eve = json_decode(json_encode($event,JSON_FORCE_OBJECT),true);
$usr_url=strval($eve["Records"][0]["cos"]["cosObject"]["url"]);
//截取object部分
$object=substr($usr_url,strpos($usr_url,"/",8));
/*需要填寫您的密鑰,可從 https://console.cloud.tencent.com/capi 獲取 SecretId 及 $secretKey*/
$secretKey='XXXXXXXXXXXXXX';
$secretId='XXXXXXXXXXXXXX';
$action='RefreshCdnUrl';
$HttpUrl="cdn.api.qcloud.com";
/*除非有特殊說明,如MultipartUploadVodFile,其它介面都支持GET及POST*/
$HttpMethod="GET";
/*是否https協議,大部分介面都必須為https,只有少部分介面除外(如MultipartUploadVodFile)*/
$isHttps =true;
$nurl="https://XXXX.XXXX.com".$object; // 示例:$nurl="http://abc.com".$object;
//print_r($nurl);
/*下面這五個引數為所有介面的 公共引數;對于某些介面沒有地域概念,則不用傳遞Region(如DescribeDeals)*/
$COMMON_PARAMS = array(
'Nonce' => rand(),
'Timestamp' =>time(NULL),
'Action' =>$action,
'SecretId' => $secretId,
'SignatureMethod' => 'HmacSHA256',
'urls.0' => $nurl
);
$PRIVATE_PARAMS = array();
//**********執行CDN重繪URL操作**********/
CreateRequest($HttpUrl,$HttpMethod,$COMMON_PARAMS,$secretKey, $PRIVATE_PARAMS, $isHttps);
return "RefreshCdnUrl OK";
}
/***************CDN API呼叫方法***************/
function CreateRequest($HttpUrl,$HttpMethod,$COMMON_PARAMS,$secretKey, $PRIVATE_PARAMS, $isHttps)
{
$FullHttpUrl = $HttpUrl."/v2/index.php";
/***************對請求引數 按引數名 做字典序升序排列,注意此排序區分大小寫*************/
$ReqParaArray = array_merge($COMMON_PARAMS, $PRIVATE_PARAMS);
ksort($ReqParaArray);
/**********************************生成簽名原文**********************************
* 將 請求方法, URI地址,及排序好的請求引數 按照下面格式 拼接在一起, 生成簽名原文,此請求中的原文為
* GETcvm.api.qcloud.com/v2/index.php?Action=DescribeInstances&Nonce=345122&Region=gz
* &SecretId=AKIDz8krbsJ5yKBZQ ·1pn74WFkmLPx3gnPhESA&Timestamp=1408704141
* &instanceIds.0=qcvm12345&instanceIds.1=qcvm56789
* ****************************************************************************/
$SigTxt = $HttpMethod.$FullHttpUrl."?";
$isFirst = true;
foreach ($ReqParaArray as $key => $value)
{
if (!$isFirst)
{
$SigTxt = $SigTxt."&";
}
$isFirst= false;
/*拼接簽名原文時,如果引數名稱中攜帶_,需要替換成.*/
if(strpos($key, '_'))
{
$key = str_replace('_', '.', $key);
}
$SigTxt=$SigTxt.$key."=".$value;
}
/*********************根據簽名原文字串 $SigTxt,生成簽名 Signature******************/
$Signature = base64_encode(hash_hmac('sha256', $SigTxt, $secretKey, true));
/***************拼接請求串,對于請求引數及簽名,需要進行urlencode編碼********************/
$Req = "Signature=".urlencode($Signature);
foreach ($ReqParaArray as $key => $value)
{
$Req=$Req."&".$key."=".urlencode($value);
}
/*********************************發送請求********************************/
if($HttpMethod === 'GET')
{
if($isHttps === true)
{
$Req="https://".$FullHttpUrl."?".$Req;
}
else
{
$Req="http://".$FullHttpUrl."?".$Req;
}
$Rsp = file_get_contents($Req);
}
else
{
if($isHttps === true)
{
$Rsp= SendPost("https://".$FullHttpUrl,$Req,$isHttps);
}
else
{
$Rsp= SendPost("http://".$FullHttpUrl,$Req,$isHttps);
}
}
var_export(json_decode($Rsp,true));
}
function SendPost($FullHttpUrl, $Req, $isHttps)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $Req);
curl_setopt($ch, CURLOPT_URL, $FullHttpUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
if ($isHttps === true) {
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
}
$result = curl_exec($ch);
return $result;
}
?>
測驗函式代碼
確認 API 及 CDN 配置正確,點擊測驗,回傳成功,

添加觸發方式
此處需要分別添加 全部創建 和 全部洗掉 兩個觸發方式
觸發方式:COS 觸發
COS Bucket:選擇你的存盤桶 (請再次確保存盤桶和云函式的區域相同)
事件型別:全部創建和全部洗掉

測驗配置
騰訊云控制臺 - 內容分發網路
左側重繪預熱 - 操作記錄 - 查詢
可以看到剛才測驗成功的一條記錄,現在可以嘗試在 Push 代碼到 GitHub 來完整的測驗整個流程了,

Serverless Framework 30 天試用計劃
我們誠邀您來體驗最便捷的 Serverless 開發和部署方式,在試用期內,相關聯的產品及服務均提供免費資源和專業的技術支持,幫助您的業務快速、便捷地實作 Serverless!
詳情可查閱:Serverless Framework 試用計劃
One More Thing
3 秒你能做什么?喝一口水,看一封郵件,還是 —— 部署一個完整的 Serverless 應用?
復制鏈接至 PC 瀏覽器訪問:https://serverless.cloud.tencent.com/deploy/express
3 秒極速部署,立即體驗史上最快的 Serverless HTTP 實戰開發!
傳送門:
- GitHub: github.com/serverless
- 官網:serverless.com
歡迎訪問:Serverless 中文網,您可以在 最佳實踐 里體驗更多關于 Serverless 應用的開發!
推薦閱讀:《Serverless 架構:從原理、設計到專案實戰》
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/3909.html
標籤:其他
下一篇:跨云廠商部署 k3s 集群
