Skip to content

Instantly share code, notes, and snippets.

@donnoman
Last active November 12, 2021 00:22
Show Gist options
  • Save donnoman/700495e39fcc11f42861293422dcfeb1 to your computer and use it in GitHub Desktop.
Save donnoman/700495e39fcc11f42861293422dcfeb1 to your computer and use it in GitHub Desktop.
Buildkite GraphQL Cron Scheduler
#!/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