iT邦幫忙

2025 iThome 鐵人賽

DAY 13
0
自我挑戰組

用 Discord Bot 玩轉 DevOps系列 第 13

用BOT查看指定 workflow 的狀態

  • 分享至 

  • xImage
  •  

在實際開發專案的過程中通常會有很多個不同的 workflow,例如測試、建置、部署或是資料排程。但在一般情況下,我們通常只需要關注某一個特定的 workflow,例如『部署到 production』的流程之類的,但如果每次都要打開 GitHub 網頁,手動篩選那個 workflow,過程會很繁瑣。為了更精準、更高效率,我們可以利用 BOT,直接查詢 指定 workflow 的執行情況


新增程式碼

def format_workflow_runs(workflow_runs, workflow_filter=None):
    """格式化 workflow 運行資訊"""
    if not workflow_runs:
        return "📭 沒有找到 workflow 運行記錄"
    
    message = "🚀 **GitHub Actions Pipeline 狀態**\n\n"
    
    for i, run in enumerate(workflow_runs[:3]):
        status_emoji = {
            'completed': '✅' if run['conclusion'] == 'success' else '❌',
            'in_progress': '🔄',
            'queued': '⏳',
            'pending': '⏳',
            'action_required': '⚠️',
            'cancelled': '⏹️'
        }
        
        conclusion_map = {
            'success': '成功',
            'failure': '失敗',
            'cancelled': '已取消',
            'skipped': '已跳過',
            'timed_out': '超時',
            None: '進行中'
        }
        
        emoji = status_emoji.get(run['status'], '❓')
        conclusion = conclusion_map.get(run['conclusion'], '未知')
        
        created_at = datetime.fromisoformat(run['created_at'].replace('Z', '+00:00'))
        formatted_time = created_at.strftime("%m/%d %H:%M")
        
        run_duration = ""
        if run['status'] == 'completed' and run['updated_at']:
            updated_at = datetime.fromisoformat(run['updated_at'].replace('Z', '+00:00'))
            duration = updated_at - created_at
            run_duration = f"⏱️ {duration.total_seconds():.0f}秒"
        
        message += (
            f"{emoji} **{run['name']}**\n"
            f"   📋 狀態: {conclusion}\n"
            f"   🕒 時間: {formatted_time}\n"
            f"   🔢 運行ID: #{run['run_number']}\n"
            f"   🎯 分支: {run['head_branch']}\n"
            f"   📁 檔案: `{run['path'].split('/')[-1]}`\n"
            f"   {run_duration}\n"
            f"   🔗 [查看詳情]({run['html_url']})\n\n"
        )
    
    return message
def get_workflow_id_by_name(workflow_name):
    """根據顯示名稱獲取 workflow ID"""
    try:
        headers = {
            'Authorization': f'token {GH_TOKEN}',
            'Accept': 'application/vnd.github.v3+json'
        }
        
        url = f'https://api.github.com/repos/{GITHUB_OWNER}/{GITHUB_REPO}/actions/workflows'
        response = requests.get(url, headers=headers)
        response.raise_for_status()
        
        data = response.json()
        
        for workflow in data.get('workflows', []):
            if workflow['name'].lower() == workflow_name.lower():
                return workflow['id']
        
        return None
    except:
        return None

返回discord看成果
https://ithelp.ithome.com.tw/upload/images/20250926/20169329DuLecy0Z4d.png


上一篇
用BOT查看所有 pipeline 狀態
系列文
用 Discord Bot 玩轉 DevOps13
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言