iT邦幫忙

2025 iThome 鐵人賽

DAY 10
0
自我挑戰組

用 Discord Bot 玩轉 DevOps系列 第 10

用BOT查詢最近一次 build 狀態

  • 分享至 

  • xImage
  •  

目前我們已經成功Discord Bot 與 GitHub Actions 間的單向通知系統,而要完善DevOps的理念就絕對不可能停留在這樣被動接收的狀態,接下來我將嘗試實現透過簡單的指令讓BOT即時查詢最近的建置狀態

為了實現這個功能,我們需要:

  1. GitHub Personal Access Token - 用於呼叫 GitHub API
  2. GitHub Actions API 端點 - 獲取 workflow 執行資訊
  3. Discord Bot 指令處理 - 解析用戶指令並回應

Step 1:首先要取得 GitHub Personal Access Token

Settings → Developer settings → Personal access tokens → Generate new token (classic)

https://ithelp.ithome.com.tw/upload/images/20250923/20169329I2HVrklG9P.png

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:接著用終端測試程式碼是否可以正常運作
https://ithelp.ithome.com.tw/upload/images/20250923/20169329anKMOkoBiz.png

成功後至discord中實際操作看看
https://ithelp.ithome.com.tw/upload/images/20250923/20169329Xid8XRtyTw.png


上一篇
切換Bot模式
下一篇
用BOT查詢最近一次 commit 訊息
系列文
用 Discord Bot 玩轉 DevOps13
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言