Last active
November 12, 2021 00:22
-
-
Save donnoman/700495e39fcc11f42861293422dcfeb1 to your computer and use it in GitHub Desktop.
Buildkite GraphQL Cron Scheduler
This file contains 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
#!/usr/bin/env ruby | |
require "bundler" | |
Bundler.setup | |
require "httparty" | |
require "byebug" | |
unless ENV["BUILDKITE_KEY"] | |
puts "you need to set your BUILDKITE_KEY" | |
exit 1 | |
end | |
def buildkite_key | |
ENV["BUILDKITE_KEY"] | |
end | |
def variant | |
if ARGV[0] | |
ARGV[0] | |
else | |
puts "Must pass variant ie: devops-1" | |
exit 1 | |
end | |
end | |
def headers | |
{ "Authorization" => "Bearer #{buildkite_key}" } | |
end | |
def request(body) | |
HTTParty.post( | |
"https://graphql.buildkite.com/v1", | |
headers: headers, | |
body: body.to_json | |
) | |
end | |
def response(body) | |
request(body).parsed_response | |
end | |
def pipeline_id | |
response( | |
query: %Q{ | |
query($slug:ID!) { | |
pipeline(slug: $slug) { | |
id | |
} | |
} | |
}, | |
variables: { | |
slug: "lendinghome/tasks" | |
} | |
)["data"]["pipeline"]["id"] | |
end | |
def create_schedule | |
response( | |
query: %Q{ | |
mutation($schedule:PipelineScheduleCreateInput!) { | |
pipelineScheduleCreate(input:$schedule) { | |
pipelineScheduleEdge { | |
node { | |
id | |
label | |
message | |
cronline | |
nextBuildAt | |
env | |
} | |
} | |
} | |
} | |
}, | |
variables: { | |
schedule: { | |
pipelineID: pipeline_id, | |
cronline: "5 9 * * *", | |
label: "Morning build 2:05am PST", | |
message: "Scheduled :robot_face: db-prod-to-staging for #{variant}", | |
env: [ | |
"TASK=db-prod-to-staging", | |
"VARIANT=#{variant}" | |
].join("\n") | |
} | |
} | |
) | |
end | |
def delete_schedule(id) | |
response( | |
query: %Q{ | |
mutation DeleteSchedule($schedule:PipelineScheduleDeleteInput!) { | |
pipelineScheduleDelete(input:$schedule) { | |
deletedPipelineScheduleID | |
} | |
} | |
}, | |
variables: { | |
schedule: { | |
id: id | |
} | |
} | |
) | |
end | |
def schedules | |
response( | |
query: %Q{ | |
query FindSchedules($slug:ID!) { | |
pipeline(slug:$slug) { | |
schedules { | |
edges { | |
node { | |
id | |
label | |
message | |
cronline | |
nextBuildAt | |
env | |
} | |
} | |
} | |
} | |
} | |
}, | |
variables: { | |
slug: "lendinghome/tasks" | |
} | |
)["data"]["pipeline"]["schedules"]["edges"].map{ |n| n["node"]} | |
end | |
if ARGV.include?("--all") | |
puts schedules.to_yaml | |
exit 0 | |
end | |
if ARGV[0]=="--delete" | |
if ARGV[1] | |
puts delete_schedule(ARGV[1]).to_yaml | |
exit 0 | |
else | |
puts "Must pass ID of schedule to delete" | |
exit 1 | |
end | |
end | |
if schedule = schedules.find { |s| s["env"].include?("TASK=db-prod-to-staging") && s["env"].include?("VARIANT=#{variant}") } | |
puts "Schedule Already Exists for #{variant}:" | |
puts schedule.to_yaml | |
else | |
puts create_schedule.to_yaml | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment