- Overview
- Installation
- Available Actions
- Return Values
- Authentication
- Example Usage
- Development
- Troubleshooting
This project is a fastlane plugin. To get started with fastlane-plugin-github_api
, add it to your project by running:
fastlane add_plugin github_api
- Ruby 2.5.0 or higher
- Fastlane 2.170.0 or higher
A comprehensive Fastlane plugin for interacting with GitHub's REST APIs. This plugin enables automation of GitHub-related tasks directly from your Fastlane workflows, including managing issues, pull requests, repositories, labels, milestones, and more.
- Full coverage of GitHub REST API endpoints for common operations
- Consistent Ruby-style interface for all GitHub interactions
- Detailed error handling and response parsing
- Shared lane context values for chaining multiple actions
- Comprehensive documentation and examples
github_add_assignees
: Add assignees to an issue.github_add_labels
: Add labels to an issue.github_create_issue
: Create a new issue.github_create_issue_comment_reaction
: Create a reaction for an issue comment.github_create_issue_reaction
: Create a reaction for an issue.github_delete_issue_comment
: Delete an issue comment.github_delete_issue_comment_reaction
: Delete a reaction from an issue comment.github_delete_issue_reaction
: Delete a reaction from an issue.github_get_issue
: Get a single issue.github_get_issue_comment
: Get a single issue comment.github_get_issue_event
: Get a single issue event.github_get_issue_timeline
: List events for an issue timeline.github_list_issue_comment_reactions
: List reactions for an issue comment.github_list_issue_comments
: List comments on an issue.github_list_issue_labels
: List labels on an issue.github_list_issue_reactions
: List reactions for an issue.github_list_issues
: List issues in a repository.github_lock_issue
: Lock an issue.github_remove_all_labels
: Remove all labels from an issue.github_remove_assignees
: Remove assignees from an issue.github_remove_label
: Remove a label from an issue.github_set_labels
: Set labels for an issue.github_unlock_issue
: Unlock an issue.github_update_issue
: Update an issue.github_update_issue_comment
: Update an issue comment.
github_check_pull_merged
: Check if a pull request has been merged.github_create_pull
: Create a pull request.github_create_pull_comment
: Create a review comment for a pull request.github_create_pull_comment_reaction
: Create a reaction for a pull request review comment.github_create_pull_review
: Create a review for a pull request.github_delete_pull_comment
: Delete a pull request review comment.github_delete_pull_comment_reaction
: Delete a reaction from a pull request review comment.github_dismiss_pull_review
: Dismiss a pull request review.github_get_pull
: Get a single pull request.github_get_pull_comment
: Get a single pull request review comment.github_get_pull_review
: Get a single pull request review.github_get_pull_review_comments
: List comments for a pull request review.github_list_all_pull_comments
: List all pull request review comments in a repository.github_list_pull_comment_reactions
: List reactions for a pull request review comment.github_list_pull_comments
: List review comments on a pull request.github_list_pull_commits
: List commits on a pull request.github_list_pull_files
: List files on a pull request.github_list_pull_reviewers
: List requested reviewers for a pull request.github_list_pull_reviews
: List reviews on a pull request.github_list_pulls
: List pull requests in a repository.github_merge_pull
: Merge a pull request.github_request_pull_review
: Request reviewers for a pull request.github_remove_pull_reviewers
: Remove requested reviewers from a pull request.github_submit_pull_review
: Submit a review for a pull request.github_update_pull
: Update a pull request.github_update_pull_branch
: Update a pull request branch.github_update_pull_comment
: Update a pull request review comment.github_update_pull_review
: Update a pull request review.
github_create_repository
: Create a new repository.github_delete_repository
: Delete a repository.github_list_repo_labels
: List labels for a repository.github_list_repo_issue_events
: List issue events for a repository.github_list_milestones
: List milestones for a repository.github_create_label
: Create a label.github_update_label
: Update a label.github_delete_label
: Delete a label.github_create_milestone
: Create a milestone.github_update_milestone
: Update a milestone.github_delete_milestone
: Delete a milestone.
github_create_commit_comment_reaction
: Create a reaction for a commit comment.github_delete_commit_comment_reaction
: Delete a reaction from a commit comment.github_list_commit_comment_reactions
: List reactions for a commit comment.
All actions return a hash with the following keys:
:status
- The HTTP status code:body
- The raw response body:json
- Parsed JSON response (if applicable)
Most actions also set shared lane context values that can be accessed in subsequent steps:
result = github_create_issue(...)
puts "Issue number: #{Actions.lane_context[SharedValues::GITHUB_CREATE_ISSUE_JSON]['number']}"
All actions require GitHub authentication via a Personal Access Token:
ENV["GITHUB_API_TOKEN"] = "your-token-here" # Set in your environment
# Or pass directly to actions
github_create_issue(
api_token: "your-token-token",
# other parameters...
)
You can create a GitHub Personal Access Token at https://github.com/settings/tokens.
For most operations, your token will need the following scopes:
repo
- Full control of private repositoriesadmin:org
- For organization-related operationsuser
- For user-related operations
For specific operations, refer to GitHub's documentation on token scopes.
Check out the example Fastfile
to see how to use this plugin. Try it by cloning the repo, running fastlane install_plugins
and bundle exec fastlane test
.
# In your Fastfile
lane :create_release_issue do
github_create_issue(
repo_owner: "your-username",
repo_name: "your-repo",
title: "Release version #{lane_context[SharedValues::VERSION_NUMBER]}",
body: "Please review the following changes for this release...",
labels: ["release", "needs-review"]
)
end
lane :submit_pr_review do
github_submit_pull_review(
repo_owner: "your-username",
repo_name: "your-repo",
pull_number: 42,
event: "APPROVE",
body: "LGTM! :rocket:"
)
end
To run both the tests, and code style validation, run:
rake
To automatically fix many of the styling issues, use:
rubocop -a
For any other issues and feedback about this plugin, please submit it to this repository.
If you have trouble using plugins, check out the Plugins Troubleshooting guide.
- Make sure your GitHub token has the correct permissions
- Check that your token is valid and not expired
- Verify the token is correctly set as an environment variable or passed to the action
- GitHub API has rate limits that might affect high-frequency usage
- Consider implementing retry logic or rate limit handling
For more information about how the fastlane
plugin system works, check out the Plugins documentation.
fastlane is the easiest way to automate beta deployments and releases for your iOS and Android apps. To learn more, check out fastlane.tools.
This comprehensive reference guide provides detailed usage examples, required parameters, and expected outputs for all actions available in the GitHub API plugin. Use these examples as templates for your own Fastlane workflows.
Add one or more assignees to a GitHub issue.
github_add_assignees(
api_token: "<your_github_token>",
repo_owner: "octocat",
repo_name: "Hello-World",
issue_number: 42,
assignees: ["octocat", "hubot"]
)
Add one or more labels to a GitHub issue.
github_add_labels(
api_token: "<your_github_token>",
repo_owner: "octocat",
repo_name: "Hello-World",
issue_number: 42,
labels: ["bug", "help wanted"]
)
Create a new GitHub issue.
github_create_issue(
api_token: "<your_github_token>",
repo_owner: "octocat",
repo_name: "Hello-World",
title: "Found a bug",
body: "This is a description of the bug.",
labels: ["bug"],
assignees: ["octocat"],
milestone: 1
)
Get a single GitHub issue.
issue = github_get_issue(
api_token: "<your_github_token>",
repo_owner: "octocat",
repo_name: "Hello-World",
issue_number: 42
)
puts "Issue title: #{issue[:json]['title']}"
puts "Issue state: #{issue[:json]['state']}"
Update an existing issue.
github_update_issue(
api_token: "<your_github_token>",
repo_owner: "octocat",
repo_name: "Hello-World",
issue_number: 42,
title: "Updated issue title",
body: "Updated description",
state: "closed", # "open" or "closed"
labels: ["bug", "wontfix"],
assignees: ["octocat"],
milestone: 2
)
List issues in a repository.
issues = github_list_issues(
api_token: "<your_github_token>",
repo_owner: "octocat",
repo_name: "Hello-World",
state: "open", # "open", "closed", or "all"
sort: "created", # "created", "updated", "comments"
direction: "desc", # "asc" or "desc"
since: "2023-01-01T00:00:00Z", # Optional
labels: "bug,enhancement", # Optional
assignee: "octocat", # Optional
creator: "octocat", # Optional
mentioned: "octocat", # Optional
milestone: 1 # Optional
)
issues[:json].each do |issue|
puts "##{issue['number']} - #{issue['title']} (#{issue['state']})"
end
Add a comment to a GitHub issue.
github_add_issue_comment(
api_token: "<your_github_token>",
repo_owner: "octocat",
repo_name: "Hello-World",
issue_number: 42,
body: "This is a comment on the issue."
)
List comments on an issue.
comments = github_list_issue_comments(
api_token: "<your_github_token>",
repo_owner: "octocat",
repo_name: "Hello-World",
issue_number: 42,
since: "2023-01-01T00:00:00Z" # Optional
)
comments[:json].each do |comment|
puts "Comment by #{comment['user']['login']}: #{comment['body']}"
end
Create a new pull request.
pull = github_create_pull(
api_token: "<your_github_token>",
repo_owner: "octocat",
repo_name: "Hello-World",
title: "Amazing new feature",
body: "Please pull these awesome changes in!",
head: "octocat:feature-branch",
base: "main",
draft: false,
maintainer_can_modify: true
)
puts "Created PR ##{pull[:json]['number']}"
Get a single pull request.
pull = github_get_pull(
api_token: "<your_github_token>",
repo_owner: "octocat",
repo_name: "Hello-World",
pull_number: 42
)
puts "PR Title: #{pull[:json]['title']}"
puts "Branch: #{pull[:json]['head']['ref']} -> #{pull[:json]['base']['ref']}"
puts "State: #{pull[:json]['state']}"
Update a pull request.
github_update_pull(
api_token: "<your_github_token>",
repo_owner: "octocat",
repo_name: "Hello-World",
pull_number: 42,
title: "Updated pull request title",
body: "Updated description",
state: "closed", # "open" or "closed"
base: "main", # Branch to merge changes into
maintainer_can_modify: true
)
List pull requests in a repository.
pulls = github_list_pulls(
api_token: "<your_github_token>",
repo_owner: "octocat",
repo_name: "Hello-World",
state: "open", # "open", "closed", "all"
head: "octocat:feature", # Optional filter by head branch
base: "main", # Optional filter by base branch
sort: "created", # "created", "updated", "popularity", "long-running"
direction: "desc" # "asc" or "desc"
)
pulls[:json].each do |pull|
puts "PR ##{pull['number']}: #{pull['title']}"
end
Merge a pull request.
github_merge_pull(
api_token: "<your_github_token>",
repo_owner: "octocat",
repo_name: "Hello-World",
pull_number: 42,
commit_title: "Merge pull request #42", # Optional
commit_message: "Merge pull request #42 from octocat/feature", # Optional
merge_method: "merge" # "merge", "squash", or "rebase"
)
Check if a pull request has been merged.
result = github_check_pull_merged(
api_token: "<your_github_token>",
repo_owner: "octocat",
repo_name: "Hello-World",
pull_number: 42
)
if result[:status] == 204
UI.success "Pull request has been merged!"
else
UI.message "Pull request has not been merged."
end
List commits on a pull request.
commits = github_list_pull_commits(
api_token: "<your_github_token>",
repo_owner: "octocat",
repo_name: "Hello-World",
pull_number: 42
)
commits[:json].each do |commit|
puts "Commit SHA: #{commit['sha']}"
puts "Author: #{commit['commit']['author']['name']}"
puts "Message: #{commit['commit']['message']}"
end
List files on a pull request.
files = github_list_pull_files(
api_token: "<your_github_token>",
repo_owner: "octocat",
repo_name: "Hello-World",
pull_number: 42
)
files[:json].each do |file|
puts "File: #{file['filename']}"
puts "Status: #{file['status']}"
puts "Additions: #{file['additions']}, Deletions: #{file['deletions']}, Changes: #{file['changes']}"
end
Create a new repository.
github_create_repository(
api_token: "<your_github_token>",
name: "new-repo",
description: "This is a new repository",
private: false,
has_issues: true,
has_projects: true,
has_wiki: true,
auto_init: true,
gitignore_template: "Ruby",
license_template: "mit",
organization: "octo-org" # Optional, create in organization instead of user account
)
Delete a repository.
github_delete_repository(
api_token: "<your_github_token>",
repo_owner: "octocat",
repo_name: "Hello-World"
)
List labels for a repository.
labels = github_list_repo_labels(
api_token: "<your_github_token>",
repo_owner: "octocat",
repo_name: "Hello-World"
)
labels[:json].each do |label|
puts "Label: #{label['name']} (#{label['color']})"
end
Create a label in a repository.
github_create_label(
api_token: "<your_github_token>",
repo_owner: "octocat",
repo_name: "Hello-World",
name: "bug",
color: "f29513",
description: "Something isn't working" # Optional
)
Update a label in a repository.
github_update_label(
api_token: "<your_github_token>",
repo_owner: "octocat",
repo_name: "Hello-World",
name: "bug",
new_name: "confirmed-bug", # Optional, only if changing the name
color: "b60205",
description: "Confirmed bugs that need to be fixed"
)
Delete a label from a repository.
github_delete_label(
api_token: "<your_github_token>",
repo_owner: "octocat",
repo_name: "Hello-World",
name: "wontfix"
)
List milestones for a repository.
milestones = github_list_milestones(
api_token: "<your_github_token>",
repo_owner: "octocat",
repo_name: "Hello-World",
state: "open", # "open", "closed", "all"
sort: "due_on", # "due_on" or "completeness"
direction: "asc" # "asc" or "desc"
)
milestones[:json].each do |milestone|
puts "Milestone: #{milestone['title']} (#{milestone['state']})"
puts "Due on: #{milestone['due_on']}"
end
Create a milestone in a repository.
github_create_milestone(
api_token: "<your_github_token>",
repo_owner: "octocat",
repo_name: "Hello-World",
title: "v1.0",
state: "open", # "open" or "closed"
description: "Tracking milestone for version 1.0",
due_on: "2023-12-31T23:59:59Z" # Optional due date
)
Update a milestone in a repository.
github_update_milestone(
api_token: "<your_github_token>",
repo_owner: "octocat",
repo_name: "Hello-World",
milestone_number: 1,
title: "Updated title", # Optional
state: "closed", # Optional, "open" or "closed"
description: "Updated description", # Optional
due_on: "2024-01-31T23:59:59Z" # Optional due date
)
Delete a milestone from a repository.
github_delete_milestone(
api_token: "<your_github_token>",
repo_owner: "octocat",
repo_name: "Hello-World",
milestone_number: 1
)
Create a reaction for an issue.
github_create_issue_reaction(
api_token: "<your_github_token>",
repo_owner: "octocat",
repo_name: "Hello-World",
issue_number: 42,
content: "+1" # Available reactions: +1, -1, laugh, confused, heart, hooray, rocket, eyes
)
List reactions for an issue.
reactions = github_list_issue_reactions(
api_token: "<your_github_token>",
repo_owner: "octocat",
repo_name: "Hello-World",
issue_number: 42,
content: "+1" # Optional filter by reaction type
)
puts "Total reactions: #{reactions[:json].count}"
Delete a reaction from an issue.
github_delete_issue_reaction(
api_token: "<your_github_token>",
repo_owner: "octocat",
repo_name: "Hello-World",
issue_number: 42,
reaction_id: 12345
)
Create a reaction for an issue comment.
github_create_issue_comment_reaction(
api_token: "<your_github_token>",
repo_owner: "octocat",
repo_name: "Hello-World",
comment_id: 123456,
content: "heart" # Available reactions: +1, -1, laugh, confused, heart, hooray, rocket, eyes
)
List reactions for an issue comment.
reactions = github_list_issue_comment_reactions(
api_token: "<your_github_token>",
repo_owner: "octocat",
repo_name: "Hello-World",
comment_id: 123456,
content: "heart" # Optional filter by reaction type
)
puts "Total reactions: #{reactions[:json].count}"
Delete a reaction from an issue comment.
github_delete_issue_comment_reaction(
api_token: "<your_github_token>",
repo_owner: "octocat",
repo_name: "Hello-World",
comment_id: 123456,
reaction_id: 12345
)
Create a reaction for a pull request review comment.
github_create_pull_comment_reaction(
api_token: "<your_github_token>",
repo_owner: "octocat",
repo_name: "Hello-World",
comment_id: 123456,
content: "heart" # Available reactions: +1, -1, laugh, confused, heart, hooray, rocket, eyes
)
List reactions for a pull request review comment.
reactions = github_list_pull_comment_reactions(
api_token: "<your_github_token>",
repo_owner: "octocat",
repo_name: "Hello-World",
comment_id: 123456,
content: "heart" # Optional filter by reaction type
)
puts "Total reactions: #{reactions[:json].count}"
Delete a reaction from a pull request review comment.
github_delete_pull_comment_reaction(
api_token: "<your_github_token>",
repo_owner: "octocat",
repo_name: "Hello-World",
comment_id: 123456,
reaction_id: 12345
)
Create a reaction for a commit comment.
github_create_commit_comment_reaction(
api_token: "<your_github_token>",
repo_owner: "octocat",
repo_name: "Hello-World",
comment_id: 123456,
content: "heart" # Available reactions: +1, -1, laugh, confused, heart, hooray, rocket, eyes
)
List reactions for a commit comment.
reactions = github_list_commit_comment_reactions(
api_token: "<your_github_token>",
repo_owner: "octocat",
repo_name: "Hello-World",
comment_id: 123456,
content: "heart" # Optional filter by reaction type
)
puts "Total reactions: #{reactions[:json].count}"
Delete a reaction from a commit comment.
github_delete_commit_comment_reaction(
api_token: "<your_github_token>",
repo_owner: "octocat",
repo_name: "Hello-World",
comment_id: 123456,
reaction_id: 12345
)