Last active
December 12, 2020 22:08
-
-
Save donaldguy/3fa7017bf57bb314b04525d184a0165a to your computer and use it in GitHub Desktop.
bitbar CircleCI workflow plugin: updated for modern-ish API/setup, dynamic reordering by last run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
""":" | |
exec /usr/bin/env python3 $0 | |
":""" | |
# -*- coding: utf-8 -*- | |
# <bitbar.title>CircleCI My Worfklows Check</bitbar.title> | |
# <bitbar.version>v2.0</bitbar.version> | |
# <bitbar.author>Donald Guy</bitbar.author> | |
# <bitbar.author.github>donaldguy</bitbar.author.github> | |
# <bitbar.desc>This plugin displays the build status of latest runs of workflows for branches you pushed within an org and links to the latest run</bitbar.desc> | |
# <bitbar.image>http://i.imgur.com/Qvdgb39.png</bitbar.image> | |
# <bitbar.dependencies>python</bitbar.dependencies> | |
# Based (loosely) on CirclecCI Check by Florent Segouin | |
# github.com/fsegouin | |
# version history | |
# 1.0 & 1.1 - the other script | |
# 2.0 - this one | |
from urllib.parse import unquote | |
import requests | |
import os | |
# You need to set your CIRCLECI_API_TOKEN with an API Token from CircleCI. | |
CIRCLECI_API_TOKEN = '' | |
ORG_SLUG = 'gh/' | |
CIRCLECI_API_ENDPOINT = 'https://circleci.com/api/v2/' | |
# ====================================== | |
SYMBOLS = { | |
'running': u' ▶', | |
'success': u' ✓', | |
'failed': u' ✗', | |
'failing': u' ✗', | |
'timedout': u' ⚠', | |
'canceled': u' ⊝', | |
'scheduled': u' ⋯', | |
'no_tests': u' ', | |
} | |
NO_SYMBOL = u' ❂' | |
IMAGES = { | |
'success': 'image=iVBORw0KGgoAAAANSUhEUgAAACMAAAAkCAYAAAAD3IPhAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAB3RJTUUH5AkSFDc1a5ph6gAABsRJREFUWMO9mHuMVVcVxn/fPufeO3cYh0cttTSKmtIY+6ChFEQDBGgrpCE2io2VSDAxTbSVNpSBYNX6iilQabHGNKna2lhCLNCqkTctKSrDlKRqrRJrbEhDLe10eA3zuPec/fnHGQIlzNxJLX4n55+Tvdf69tp7r7W+IwbB3I419EUIAmxCCKUY4xXAdOBTwFXAOKAVCEAv0An8G+gAPS84EB27ggRJAo5UyhW2XLvkvD517ocFf/85R08eRYIYDVIFx08CtwGzgQ8CZYZGBI4BfwE2CT1j54cVEmwTyoFdk5YNTebTB9aRZf2AyPKMNE2vsX0XcAswhneHHHgReFhBm2xOPTt1LTd2LGXnlLbzk5l34EH6swwBkkrR8QvAN4Er3iWJc9ELbED6PvaraZISbXZNueedZG46sIY8MyAkVaPjPUAbxXl4r/G8pLtijH8upSUcc3ZOLSIUALIckJCoRMeVAxG5EEQAZth+NIQwMcszjvbUmPPij4rI3NDxAMaQpnKtfiewCqheICJnYw/SYuxDQqhaItH8K2ltboEY5wAPAqP/D0QAPgw0K2g3kJGZdPwl4xBcbPsbwAeGaSgDDgEHgcNA/8AiLgc+Bowapp2Fjn4OvCEJFVLHHBQ+D8wYxmQDB4BfCHYhHZbUV6om1HqzQPRIwzXAF4EFw4jyCGCJFJ7LXT8SgpLLgEVA2mBiP/BTSZ+zecTwL6DXtms9mTE50AXsSRTuAL4MvDyMBU62fbNjJBjPAyY2mFAH1ipoOfBaqSSCoLXaxO6pbeye2saYHnOqLHorAeM65jdCXxkGoRKwIITQmgKfBZoaTNgk6X7snmKvArumnsmeC/60iqzXXHrMYANQqyT0pG4PsNLwOENn8OtsXxuA6xsQeQ3pAdsnYoQQEnZOPlNXFrSvIu8FBIIRoEXAjHisl0oEpWErsKGBj4uA6ZrdvvrrwIcGGSTQvhDC03aMI09FQNgRqQiCABc1pEr0vRSZ+zDwtZjn27pbS1iahv1b4P1DEPpdavxwTj4IE5GQYEeaakX4gxRyuAzoRPQCSFQdvRJYRlHRPwJ8NU1Le8o5fbWUlw0vAbOGIHN5CARKgzwpKZKQoakOidIQY34bZrvNdwUtEhVHVgxEpDJg+IjQ+rGtF/clFqNaR50A/tFgq8aKYeBL+39Gd3cnQtONf02RHOvAT4AeYClnSsibQkvLVNbXqfnt94FykLgP+M4Qbvoa5RYAKoZuAJwNkIDiSi6hSISn7bwFLKPM+lqt3wCJA5FYbObQcDp7/+rC3GCQeNVdjJZoKaX7jtfqdwM/pjg3yVkjO4XaVNKvXLct48SIhOZKVb21vksakDkVHM8xeTaPpmYUDQr0lMXJesbxWm2z4G7g9bOGvi20PKTpE86KROPE9DWXMKav3t8KfLwBmSOpxL3kjD9v3Pp6hLQ3oCf7SyFvquWMrlT425vdG68cOyLYPASUhVaEJP1lLDo0COKZmSuZ1b76dOc4Ebi6AZlXUopVDnH/fbOd/9PQ3tUEF/XB1WNbaColT/XUsk5DWWJnjFkEIAlsntnGnP2rGegcyzHGRQxdNHOgPQD7GjC+1LBC0pgkCXRVhQV9WW7Ds8A24xxMQs7mmW3M3r8GEDGaGOMtFBV8KLwl2BsQGymu51CYb/tbQKsEx0ckHGsORQ6SsCFJAkdbqsxqv7+IZ4xImgX8ABjZwH4H0l+D0A4KKTEUEuAO2+uEJmRZRrQ5PiJwrFkcb0noahJ2hghIqiItBD8KTGhgu4b0lO3u1NFvIB4HplDkjsFQAhYbTw4hPAFsAw4h9RQ5mhQ8RmKSY1wIzAdaaIx9gm1IaM7+NQCjbT8JzBvGZCgy03+AV4A3KBqvkcBHB94Rw7RzQrA4wtPN5RJpFuskSo9K+qHtqyjkayOIQmePG6bTwfCYgrYEQ3+WE0pJhRACu6Ys+wPwPeDk/+hguNgqaVWM9INJ8gFFeUPHmqJBk0qOcSnwbaD5AhLZK3S78cE8RprKZbZPXlooytBfLcqTXQ/oIQpF2XWBiGwDbo+OB6tNFUpJyvbJS4GzhP/c/Wupu2iypCSJzj8Dvo9CerwXOAk8JmmVzeuVckqeR3Zcf47wP40bX1hNzItPJiLCBOM7gVsZvsA7FzWgHWmdpN87uj/GSBLE7k8sf8fA8/YYc9rXIInoiBKljr4OcytwE8XVbXSeMoq/WC8AG5G2YHdKKpqfJGHHwNY0JAMwt2MtNWcIYZuSQsjs8cbTgGkD23f6N1pCUVI6KcRdh8QfjV6yY7cUCEmC80i5ZLZOajuvz/8C/N3Rg9jBCEIAAAAldEVYdGRhdGU6Y3JlYXRlADIwMjAtMDktMThUMjA6NTU6NTMrMDA6MDApchhxAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDIwLTA5LTE4VDIwOjU1OjUzKzAwOjAwWC+gzQAAAABJRU5ErkJggg==', | |
'failed': 'image=iVBORw0KGgoAAAANSUhEUgAAACMAAAAkCAYAAAAD3IPhAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAB3RJTUUH5AkSFDcK3fxM1wAABmZJREFUWMO9mH2MVVcVxX/rnHvfMAzMMLTUprUl0dIYA9bYqqmmqDVp0mBjYxujMjMMxNDEEm00RakfNdUYiNVYW/8wBCV0GjHSoDG2xMRSSw2EEi02aFtaDCFYUAo4DPP17j3LP+4boGTmvSkWV3KTd887e+91z9kfZx8xBU729lICArAhhNz2tcBN2B8GFgJXAJ1AAEaAY8ABYLekZwx7XJbHFQIxRlJKqFaje8OGSW3q/IHx1asZOnIEAckmQJvtDxk+C9wMXAXUaI4EnAT2Ao8Lfp3swyEEnBJZntO1cWNzMidXrKAcH0cSRb1OzPNF2PcAtwNzuTCUwF+AhyU9bvv0HQMDbO3ro3vTpsnJDPX0MD7xEkLulD4DfAO49gJJnI8RYLPgO4Z/hBhJNpecQ0gAJ/v7KYsCVQPtCb4C3EvlD281ngG+hP18yDJIie5HH63WAKgcSwKpLcHXGityMYgALAbWE8J1qSw5PTzM4LJl1cqc6O3FElmeqz42tgpYC8y8SETOxdOCfsNBgFpnJ+HQ0BBOifr4+M3Aff8nIgAfNdwnqV0SxalTZFd2dCDpUttrgMunqaig+qIXgcPAGNANXAO8C5gzTT1LDdud0uY8y8gaueTTwEemIWxgD7AB6Q/A4RjjaC3PGRsdDba7DO8BPgfc2SDYDB3YXwwhbC9SOhpiCFcCfUDWQnAU+ImkO2z/FPsVYCSVpUdHR+0qnxwHnlaMdyMtB/ZN4wNvsL3EKRFs3wpc10KgDvxQIawGDmW1GsRQRWAQVJGIJ36nVHdKv0H6/DQI5cCdIYTOAHwKmNFCYIukddgjAKksICXsBAaTqh20AZPaTYwZTmmXYE1jxZrhetvvDcD7W0w8JOlB24PgRprUTKReoY93zp43kcYvA1YiFmlYpJgIIaAQngQ2t7BxCXBThvQA9tVTTBLSTsX4PKnx9WiG7XvBawz/Ghw8ugppt+3vA0sxzyGvpGBvPD1KMXNGAQxQBcmlU9iJwAczUnqYspyCimCi9J8Z9ALwXUAbcJXhx9gHqKJRwAeAnnq92KtZ7cgA7LP9AvCxJqtzTSAEyPPJnyxDEi5LatmZYDsA/ILKqQHmN4yExvvfEFvzPFbUQyDOmzcI/L3FVl0m3gSO9/U0Pl6z7PQgcNd5Uw4iltn+YxaqqmwDKYF0P/DtJupHA28GFjZYrgHtk8yIgnYn43PFGpveSnv2em9v0xkCbKMYsROCTievBXommf52m0diCCtTmZ5SFMHQXqvpdL3+thZkTmdKCS9cCPV65bBneJr2xYsZWb8ehcDZaOJqYAlnfeQlqhq1hCqLv9NwS5HKp3JFjBguik7g3S3IHM0sfZ19++ZP9u/Iyy8L6VlJA4ZSE8btH1Dt/2uSvgD82fZaYAWwQ/CzLMaGqxiqDL+oBZn9GXAPU8c/wCec0kuGXQAKqocQHkn2fsHRoj62O8vbkLTG9naJPSnx6tBgnc6uGoJasvtoXjRLYFcAdrZgfLnhq5LmImEb2+PYv7W9O2+bWY3BCeCXwKtlaTq7aiSbZN9OVcGb4d9IOwKwBRhuMfk229+U3VlVBKEEIQTskpgFQlSVk4pEnlUtSajyz3eBrhb6d0v6a0D6PVUr0QwRuNvwELCgKAoscDIkSEXjAGEgBIB2pKWG9cCCFrrHJf0qpTSUkdIRpI1UaTxvIpQD/cANIYRNgm3AQaRhVTQyYK6k99leCtwGzKI1dgLbgoSO9/SA1G37MeDWaQjTWIPXgP3AEapjZxfwjsbTMU09g0j92FuzGMkYG8NtbSckfc/2Qqr2tRVE1WdfMU2jU+Hnkp4AKFMi0NGBYqR706ZnkR4ATv2PBqaLJyWtsz1mwDNmVPXi9b4+ZCPIk/1l4Ftc3JZlB9JK7BdTSuQhMGdgoErps2dWdm3XJf2IqqNsdVS8UGybIFLLc7IYmTMwAJxTSU/095OKAklEKZYpfdJwP1Xr8VbgFJWPrLP9zyzPSWX5hpuIN5T148uWNQoipLIkxLjA9iqqI+N0G7zzMQ7sEjwk6XeGsZSq8/HcRsM/KZkzpPr6CCGQioIQQpZSut4VoVuoQreVPxVUt1jPCbYgPWH7mCSwkXTm5qElGYD/LF9OWa8jiWSTxRjKlOYbbsS+sbF9E9dokaqkHANeoUrvfwJesD0kicDZzDh7EiIA/wXvOsyzPO7POAAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyMC0wOS0xOFQyMDo1NToxMCswMDowMJzQDBYAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjAtMDktMThUMjA6NTU6MTArMDA6MDDtjbSqAAAAAElFTkSuQmCC' | |
} | |
imageTemplate='templateImage=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' | |
DEFAULT_COLOR = 'white' if os.getenv('BitBarDarkMode') else 'black' | |
MAIN_COLORS = { | |
'running': '#F7C443', | |
'timedout': '#F3BA61', | |
'canceled': '#898989', | |
'scheduled': '#AC7DD3' | |
} | |
DROPDOWN_COLORS = { | |
**MAIN_COLORS, | |
'success': '#39C988', | |
'failed': '#EF5B58', | |
'failing': '#EF5B58' | |
} | |
def request(uri): | |
url = CIRCLECI_API_ENDPOINT + uri | |
headers = {'Accept': 'application/json', 'Circle-Token': CIRCLECI_API_TOKEN} | |
r = requests.get(url, headers=headers) | |
return r.json() | |
def getResource(resource_name): | |
return request(resource_name) | |
def render_pipelines(pairs): | |
latest = pairs[0][1][0] | |
latest_status = latest['workflows'][0]['status'] | |
print(u' {} | trim=false color={} {}'.format( | |
latest['vcs']['branch'], | |
MAIN_COLORS.get(latest_status, DEFAULT_COLOR), | |
IMAGES.get(latest_status, imageTemplate) | |
)) | |
print('---') | |
for (project, pipelines) in pairs: | |
#print(u'{} | href={}'.format(project, pipelines[0]['vcs']['origin_repository_url'])) | |
print(u'{} | href=https://app.circleci.com/pipelines/{}'.format(project, pipelines[0]['project_slug'])) | |
for p in pipelines: | |
wf = p['workflows'][0] | |
branch = p['vcs']['branch'] | |
status = wf['status'] | |
if status == 'not_run': | |
continue | |
color = 'color={}'.format(DROPDOWN_COLORS[status]) if DROPDOWN_COLORS[status] else '' | |
symbol = SYMBOLS.get(status, NO_SYMBOL) | |
branch_href = 'href=https://app.circleci.com/pipelines/{}/{}/workflows/{}'.format(wf['project_slug'], wf['pipeline_number'], wf['id']) | |
print(u'{} {} | {} {}'.format(symbol, branch, branch_href, color)) | |
if __name__ == '__main__': | |
if len(CIRCLECI_API_TOKEN) == 0: | |
raise ValueError("token can not be empty") | |
active_projects = set() | |
ps = [p for p in getResource('pipeline?org-slug={}&mine=true'.format(ORG_SLUG))['items'] if p['state'] == 'created'] | |
for p in ps: | |
p['project'] = p['project_slug'][(len(ORG_SLUG) + 1):] | |
active_projects.add(p['project']) | |
newest_pipelines_by_project_and_branch = {project:{} for project in active_projects} | |
for p in ps: | |
by_branch = newest_pipelines_by_project_and_branch[p['project']] | |
branch = p['vcs']['branch'] | |
if not branch in by_branch or p['updated_at'] > by_branch[branch]['updated_at']: | |
by_branch[branch] = p | |
time_sorted_pipelines_by_project = { | |
project: | |
sorted(pipelines_by_branch.values(), key=lambda p:p['updated_at'], reverse=True) | |
for | |
project, pipelines_by_branch in newest_pipelines_by_project_and_branch.items() | |
} | |
for sorted_pipelines in time_sorted_pipelines_by_project.values(): | |
for pipeline in sorted_pipelines: | |
pipeline['workflows'] = getResource('pipeline/{}/workflow'.format(pipeline['id']))['items'] | |
to_render = [ | |
(project, time_sorted_pipelines_by_project[project]) | |
for project in sorted( | |
time_sorted_pipelines_by_project.keys(), | |
key=lambda project: time_sorted_pipelines_by_project[project][0]['updated_at'], | |
reverse=True | |
) | |
] | |
render_pipelines(to_render) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment