Skip to content

Instantly share code, notes, and snippets.

@shinmiy
Last active August 11, 2021 04:34
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save shinmiy/fc7fc0d20c40936f453e9ca2eccc298d to your computer and use it in GitHub Desktop.
Save shinmiy/fc7fc0d20c40936f453e9ca2eccc298d to your computer and use it in GitHub Desktop.
Bitriseの状況をBitbarで表示するスクリプト | Script to show Bitrise build statuses in Bitbar
#!/usr/bin/ruby
require 'httpclient'
require 'json'
require 'time'
# Bitrise情報 / Bitrise Info
TOKEN = 'YOUR_TOKEN_HERE'
APPS = { 'Your App Name' => 'App Slug', 'Another App Name' => 'Another App Slug' }
# BitriseのアイコンをBase64に変換しやつ / Base64 of Bitrise Icon
ICON_BITRISE = 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAAlwSFlzAAAOJgAADiYBou8l/AAAActpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDUuNC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx4bXA6Q3JlYXRvclRvb2w+d3d3Lmlua3NjYXBlLm9yZzwveG1wOkNyZWF0b3JUb29sPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KGMtVWAAAAl5JREFUOBF1U7+PUkEQnn0/IAZ4cIEzBDHEXGNyF73q0JaGYGltYS6x0tKY6B8gsTZqYaQytDQmeDkhZyOJ1BYUZ6NcwUGAAIHHe7x1voU1p8ZJPubHzs5+M/Mw6V8xOCSz2ewdJxqpOk7sQcyJjyeTyTeOq7OLV6yNI1hfROC68x3TMBMcnwcr7/omz9xoKAmgIgROwFgxfAYdHNz6ktpOLVKpbfvG/n4TMRaPgTwAd/4QzQBFYUOeM14riwiv6xx9vk5MJhJ3M1evPEkktiYUrFlJIZYr39+RJC3LsjtSyrAhREBC0Hg8inR//Hw1GA7fqxkMRqP020olXygUyHVdzhFkGAb5vk98kWzbvhYEgbLD4TC1Wi0qlUofwEwPMZ5MJikej7sc0y2gRz00zAa01aw4N8z2JQYZN/f2Dlk/nk6n8O3VamXxyygM2wD4dZuZWJ7nIR6azWbIfXQ7nz80Ft7yPjvHTA2vGEdHH6lWq8n5fE6maep2ZKfToUqlIrvdrohGo0vO/TqZTe9Z3C5op9Ajv0a7u3vQAjYEM2AIx3GoWCxSJBJRc+KjLSGpb8Vi8RfsvONR84NmkMvldK9qVWAByWQy6B+xgHNDrNOX0+lnVrvd/sROuX9+/qbf78vFYoEkXoS6z+ZawIItiS30ej0EXzYajWO9BdFsNql7dqaogzZE1VibavwoyozE99NTHOuvGDY9rNfrfE8uWTyG/x94nON9PjlB2ae4qBlYoRDaIpv7g1bTV8bmR7OCq3Nh6wLDcrk8qFarY2yA439N4Pc/R2KovMoY5/RR4Beqzhqkr7rq2gAAAABJRU5ErkJggg=='
class Job
attr_accessor :id, :platform, :workflow, :branch, :start_at, :status
def initialize(id, platform, workflow, branch, start_at, status)
self.id = id
self.platform = platform
self.workflow = workflow
self.branch = branch
self.start_at = Time.parse(start_at)
self.status = status
end
def status_emoji
case status
when 'success'
return ':ok:'
when 'error'
return ':rotating_light:'
when 'aborted'
return ':hand:'
end
end
end
class Stats
attr_accessor :count, :jobs
def initialize
@jobs = []
end
def add_job(id, platform, workflow, branch, start_at, status)
@jobs << Job.new(id, platform, workflow, branch, start_at, status)
end
end
class BitriseApi
def self.get_jobs(appId)
url = "https://api.bitrise.io/v0.1/apps/#{appId}/builds"
client = HTTPClient.new
query = {'after' => (Time.now - (7*24*60*60)).to_i}
header = {'Authorization' => "token #{TOKEN}" }
result = client.get(url, query, header)
JSON.parse(result.body)['data']
end
end
stats = {}
history = Stats.new
APPS.each { |prj, slug|
jobs = BitriseApi.get_jobs(slug)
stats[prj] = Stats.new
jobs.each {|job|
stats[prj].add_job(
job['slug'],
prj,
job['triggered_workflow'],
job['branch'],
job['triggered_at'],
job['status_text']) if job['status'] == 0
history.add_job(
job['slug'],
prj,
job['triggered_workflow'],
job['branch'],
job['triggered_at'],
job['status_text']) unless job['status'] == 0
}
}
# ジョブ履歴は降順で表示したい / Show new jobs first
history.jobs.sort_by! {|job| job.start_at.to_i * -1}
# 出力 / Output
current_total = stats.map{|k, v| v.jobs.size }.reduce{|m,i| m + i }
puts "#{current_total} | image=#{ICON_BITRISE}"
puts '---'
stats.each {|k, v|
puts "#{k}: #{v.jobs.size} jobs"
v.jobs.each {|job|
start_at = job.start_at.getlocal.strftime('%m/%d %H:%M')
link = "https://app.bitrise.io/build/#{job.id}"
puts "[#{job.workflow}]#{job.branch} : #{job.status} | href=#{link}"
}
puts '---'
}
puts "Past week: #{history.jobs.size} jobs"
history.jobs.each {|job|
start_at = job.start_at.getlocal.strftime('%m/%d(%a) %H:%M')
link = "https://app.bitrise.io/build/#{job.id}"
puts "#{job.status_emoji} #{start_at} [#{job.platform}/#{job.workflow}]#{job.branch} | href=#{link}"
}
@shinmiy
Copy link
Author

shinmiy commented Dec 4, 2018

設定方法

BitbarのPluginフォルダに設置

スクリプトをBitbarのプラグインフォルダに設置します。
ファイルに実行権限を付与しておきます

chmod +x bitrise_status.1m.rb

トークンを発行する

ユーザー設定 よりPersonal access tokensを発行します。
以下の部分をGenerate newで発行したトークンに差し替えます。

TOKEN = 'YOUR_TOKEN_HERE'

App Slugを確認する

ビルド画面のURLからApp Slug(IDみたいなやつ)を確認して、以下の部分を差し替えます。

https://app.bitrise.io/app/[これがSlug]#/builds
APPS = { 'Your App Name' => 'App Slug', 'Another App Name' => 'Another App Slug' }

@viktorbenei
Copy link

This is super useful, thanks for sharing @shinmiy ! ;)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment