目前我們已經成功Discord Bot 與 GitHub Actions 間的單向通知系統,而要完善DevOps的理念就絕對不可能停留在這樣被動接收的狀態,接下來我將嘗試實現透過簡單的指令讓BOT即時查詢最近的建置狀態
為了實現這個功能,我們需要:
Step 1:首先要取得 GitHub Personal Access Token
Settings → Developer settings → Personal access tokens → Generate new token (classic)
Step 2:設定一些基本資訊後就會產生token,點擊複製並在secret中新增一個變數儲存這串代碼
Step 3:修改bot.py的程式碼實現查詢build狀態的功能確保可以正確調用token
def get_latest_build_status():
"""獲取最近一次的建置狀態"""
try:
if not GH_TOKEN:
return "❌ GitHub Token 未設定,請檢查 .env 檔案"
# 設定 API 請求
headers = {
'Authorization': f'token {GH_TOKEN}',
'Accept': 'application/vnd.github.v3+json'
}
url = f'https://api.github.com/repos/{GITHUB_OWNER}/{GITHUB_REPO}/actions/runs'
print(f"正在請求 GitHub API: {url}")
# 發送請求
response = requests.get(url, headers=headers)
response.raise_for_status() # 如果失敗會拋出異常
data = response.json()
if not data['workflow_runs']:
return "📭 尚未有任何建置記錄"
# 解析最新一筆執行
latest_run = data['workflow_runs'][0]
status = latest_run['conclusion'] # success, failure, cancelled
created_at = latest_run['created_at']
html_url = latest_run['html_url']
workflow_name = latest_run['name']
# 轉換為中文狀態
status_map = {
'success': '✅ 成功',
'failure': '❌ 失敗',
'cancelled': '⏹️ 已取消',
None: '🔄 執行中'
}
status_text = status_map.get(status, '❓ 未知狀態')
# 格式化時間
from datetime import datetime
dt = datetime.fromisoformat(created_at.replace('Z', '+00:00'))
formatted_time = dt.strftime("%Y-%m-%d %H:%M:%S")
return (f"📊 **最近一次建置狀態**\n"
f"**工作流程**: {workflow_name}\n"
f"**狀態**: {status_text}\n"
f"**時間**: {formatted_time}\n"
f"**詳細資訊**: [查看詳情]({html_url})")
except requests.exceptions.HTTPError as e:
if e.response.status_code == 404:
return "❌ 找不到倉庫,請檢查 GITHUB_OWNER 和 GITHUB_REPO 設定"
elif e.response.status_code == 403:
return "❌ 權限不足,請檢查 GitHub Token 權限"
else:
return f"❌ HTTP 錯誤: {e.response.status_code}"
except Exception as e:
return f"❌ 獲取狀態時出錯: {str(e)}"
Step 4:在workflow中需要在env中加入GH_TOKEN: ${{ secrets.GH_TOKEN }}
env:
DISCORD_TOKEN: ${{ secrets.DISCORD_TOKEN }}
GH_TOKEN: ${{ secrets.GH_TOKEN }}
Step 5:接著用終端測試程式碼是否可以正常運作
成功後至discord中實際操作看看