Created
May 10, 2017 23:49
-
-
Save keithpitt/6f13b3b2058c6ae62c7154308032fc90 to your computer and use it in GitHub Desktop.
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
require 'uri' | |
require 'net/http' | |
require 'net/https' | |
require 'json' | |
GRAPHQL_API_KEY = ENV.fetch("GRAPHQL_API_KEY") | |
def perform_graphql_query(query, variables) | |
# This is our Buildkite GraphQL Endpoint. | |
uri = URI.parse("https://graphql.buildkite.com/v1") | |
# Create an instance of the HTTP class so we can make a HTTP request. | |
https = Net::HTTP.new(uri.host, uri.port) | |
https.use_ssl = true | |
# Setup our actual request. Authentication is done via a Buildkite API key with | |
# the GraphQL scope enabled. | |
req = Net::HTTP::Post.new(uri.path, { 'Content-Type' => 'application/json', 'Authorization' => "Bearer #{GRAPHQL_API_KEY}" }) | |
req.body = JSON.generate(query: query, variables: variables) | |
# Perform the request and return the response. | |
https.request(req) | |
end | |
query = <<~GRAPHQL | |
query GetPipelines($organizationSlug: ID!, $after: String, $pageSize: Int) { | |
organization(slug: $organizationSlug) { | |
pipelines(first: $pageSize, after: $after) { | |
pageInfo { | |
hasNextPage | |
} | |
edges { | |
cursor | |
node { | |
name | |
builds(first: 1, branch:"%default") { | |
edges { | |
node { | |
state | |
} | |
} | |
} | |
} | |
} | |
} | |
} | |
} | |
GRAPHQL | |
# Get the organization slug from an environment variable | |
org_slug = ENV.fetch("ORGANIZATION_SLUG") | |
# Setup the first set of variables we'll send to GraphQL | |
variables = { organizationSlug: org_slug, pageSize: 5 } | |
# `has_next_page` will stay true as long as the `pageInfo.hasNextPage` variable is | |
# true in the GraphQL response | |
has_next_page = true | |
while has_next_page | |
response = perform_graphql_query(query, variables) | |
# Make sure the GraphQL response is all good | |
if response.code.to_i != 200 | |
raise "GraphQL query failed: #{response.code} #{response.message} #{response.body}" | |
end | |
# Parse the JSON from the GraphQL query | |
json = JSON.parse(response.body) | |
# Figure out if there's another page of info. If this is false, the | |
# `has_next_page` will become false and the loop will stop | |
has_next_page = json["data"]["organization"]["pipelines"]["pageInfo"]["hasNextPage"] | |
# If there's still another page, grab the last cursor in the list, and add it | |
# to the variables that we'll send in the next iteration | |
if has_next_page | |
variables[:after] = json["data"]["organization"]["pipelines"]["edges"].last["cursor"] | |
end | |
# Just show the output | |
puts response.body | |
puts "-------------------------" | |
end | |
puts "\nAll done! No more pipelines to paginate through!" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment