:fishing_pole_and_fish: Webhook receiver for GitHub, Bitbucket, GitLab, Gogs

Library webhooks

Project status Build Status Coverage Status Go Report Card GoDoc License

Library webhooks allows for easy receiving and parsing of GitHub, Bitbucket and GitLab Webhook Events

Features:

  • Parses the entire payload, not just a few fields.
  • Fields + Schema directly lines up with webhook posted json

Notes:

  • Currently only accepting json payloads.

Installation

Use go get.

go get -u gopkg.in/go-playground/webhooks.v5

Then import the package into your own code.

import "gopkg.in/go-playground/webhooks.v5"

Usage and Documentation

Please see http://godoc.org/gopkg.in/go-playground/webhooks.v5 for detailed usage docs.

Examples:
package main

import (
	"fmt"

	"net/http"

	"gopkg.in/go-playground/webhooks.v5/github"
)

const (
	path = "/webhooks"
)

func main() {
	hook, _ := github.New(github.Options.Secret("MyGitHubSuperSecretSecrect...?"))

	http.HandleFunc(path, func(w http.ResponseWriter, r *http.Request) {
		payload, err := hook.Parse(r, github.ReleaseEvent, github.PullRequestEvent)
		if err != nil {
			if err == github.ErrEventNotFound {
				// ok event wasn;t one of the ones asked to be parsed
			}
		}
		switch payload.(type) {

		case github.ReleasePayload:
			release := payload.(github.ReleasePayload)
			// Do whatever you want from here...
			fmt.Printf("%+v", release)

		case github.PullRequestPayload:
			pullRequest := payload.(github.PullRequestPayload)
			// Do whatever you want from here...
			fmt.Printf("%+v", pullRequest)
		}
	})
	http.ListenAndServe(":3000", nil)
}

Contributing

Pull requests for other services are welcome!

If the changes being proposed or requested are breaking changes, please create an issue for discussion.

License

Distributed under MIT License, please see license file in code for more details.

Owner
Go Playgound
multiple packages, libraries and programs to further the advancement of Go!
Go Playgound
Comments
  • String fields are not populated

    String fields are not populated

    It seems like no values that are mapped to string is available.

    I am using the following:

    case github.PushPayload:
    		push := payload.(github.PushPayload)
    
    		fmt.Print(push.Repository.URL) // Nothing
    		fmt.Print(push.Before) // Actual value False
    

    I checked my payload. The values I'm looking for actually does exist.

    Let me know if you need more details.

  • GitLab 12.3 incompatibility with pipeline event

    GitLab 12.3 incompatibility with pipeline event

    GitLab 12.3 added "source" field to "object_attributes". But it's not as other source fields - it's a simple string. https://gitlab.com/gitlab-org/gitlab-foss/merge_requests/32373 So, webhook now can't unmarshal pipeline event structure.

    json: cannot unmarshal string into Go struct field ObjectAttributes.object_attributes.source of type gitlab.Source

    Looks like it's not trivial changes, because ObjectAttributes structure uses everywhere... That's why I can't simply create PR. May be the only way is to create separate ObjectAtrributesPipeline structure, but looks like it should be maintainer decision.

  • Add installation and ping

    Add installation and ping

    This PR adds support for a few events that are important for people building GitHub Apps, namely, ping, installation and integration_installation.

    ping:

    {
        "zen": "Keep it logically awesome.",
        "hook_id": 20081052,
        "hook": {
            "type": "App",
            "id": 20081052,
            "name": "web",
            "active": true,
            "events": [
                "pull_request"
            ],
            "config": {
                "content_type": "json",
                "insecure_ssl": "0",
                "secret": "********",
                "url": "https://5e63b0ab.ngrok.io/webhook"
            },
            "updated_at": "2018-01-15T10:48:54Z",
            "created_at": "2018-01-15T10:48:54Z",
            "app_id": 8157
        }
    }
    

    installation:

    {
        "action": "created",
        "installation": {
            "id": 80429,
            "account": {
                "login": "PombeirP",
                "id": 138074,
                "avatar_url": "https://avatars1.githubusercontent.com/u/138074?v=4",
                "gravatar_id": "",
                "url": "https://api.github.com/users/PombeirP",
                "html_url": "https://github.com/PombeirP",
                "followers_url": "https://api.github.com/users/PombeirP/followers",
                "following_url": "https://api.github.com/users/PombeirP/following{/other_user}",
                "gists_url": "https://api.github.com/users/PombeirP/gists{/gist_id}",
                "starred_url": "https://api.github.com/users/PombeirP/starred{/owner}{/repo}",
                "subscriptions_url": "https://api.github.com/users/PombeirP/subscriptions",
                "organizations_url": "https://api.github.com/users/PombeirP/orgs",
                "repos_url": "https://api.github.com/users/PombeirP/repos",
                "events_url": "https://api.github.com/users/PombeirP/events{/privacy}",
                "received_events_url": "https://api.github.com/users/PombeirP/received_events",
                "type": "User",
                "site_admin": false
            },
            "repository_selection": "selected",
            "access_tokens_url": "https://api.github.com/installations/80429/access_tokens",
            "repositories_url": "https://api.github.com/installation/repositories",
            "html_url": "https://github.com/settings/installations/80429",
            "app_id": 8157,
            "target_id": 138074,
            "target_type": "User",
            "permissions": {
                "repository_projects": "write",
                "issues": "read",
                "metadata": "read",
                "pull_requests": "read"
            },
            "events": [
                "pull_request"
            ],
            "created_at": 1516025475,
            "updated_at": 1516025475,
            "single_file_name": null
        },
        "repositories": [
            {
                "id": 117381220,
                "name": "status-github-bot",
                "full_name": "PombeirP/status-github-bot"
            }
        ],
        "sender": {
            "login": "PombeirP",
            "id": 138074,
            "avatar_url": "https://avatars1.githubusercontent.com/u/138074?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/PombeirP",
            "html_url": "https://github.com/PombeirP",
            "followers_url": "https://api.github.com/users/PombeirP/followers",
            "following_url": "https://api.github.com/users/PombeirP/following{/other_user}",
            "gists_url": "https://api.github.com/users/PombeirP/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/PombeirP/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/PombeirP/subscriptions",
            "organizations_url": "https://api.github.com/users/PombeirP/orgs",
            "repos_url": "https://api.github.com/users/PombeirP/repos",
            "events_url": "https://api.github.com/users/PombeirP/events{/privacy}",
            "received_events_url": "https://api.github.com/users/PombeirP/received_events",
            "type": "User",
            "site_admin": false
        }
    }
    

    integration_installation:

    {
        "action": "deleted",
        "installation": {
            "id": 80407,
            "account": {
                "login": "PombeirP",
                "id": 138074,
                "avatar_url": "https://avatars1.githubusercontent.com/u/138074?v=4",
                "gravatar_id": "",
                "url": "https://api.github.com/users/PombeirP",
                "html_url": "https://github.com/PombeirP",
                "followers_url": "https://api.github.com/users/PombeirP/followers",
                "following_url": "https://api.github.com/users/PombeirP/following{/other_user}",
                "gists_url": "https://api.github.com/users/PombeirP/gists{/gist_id}",
                "starred_url": "https://api.github.com/users/PombeirP/starred{/owner}{/repo}",
                "subscriptions_url": "https://api.github.com/users/PombeirP/subscriptions",
                "organizations_url": "https://api.github.com/users/PombeirP/orgs",
                "repos_url": "https://api.github.com/users/PombeirP/repos",
                "events_url": "https://api.github.com/users/PombeirP/events{/privacy}",
                "received_events_url": "https://api.github.com/users/PombeirP/received_events",
                "type": "User",
                "site_admin": false
            },
            "repository_selection": "all",
            "access_tokens_url": "https://api.github.com/installations/80407/access_tokens",
            "repositories_url": "https://api.github.com/installation/repositories",
            "html_url": "https://github.com/settings/installations/80407",
            "app_id": 8157,
            "target_id": 138074,
            "target_type": "User",
            "permissions": {
                "repository_projects": "write",
                "issues": "read",
                "metadata": "read",
                "pull_requests": "read"
            },
            "events": [
                "pull_request"
            ],
            "created_at": "2018-01-15T14:08:37+01:00",
            "updated_at": "2018-01-15T14:08:37+01:00",
            "single_file_name": null
        },
        "sender": {
            "login": "PombeirP",
            "id": 138074,
            "avatar_url": "https://avatars1.githubusercontent.com/u/138074?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/PombeirP",
            "html_url": "https://github.com/PombeirP",
            "followers_url": "https://api.github.com/users/PombeirP/followers",
            "following_url": "https://api.github.com/users/PombeirP/following{/other_user}",
            "gists_url": "https://api.github.com/users/PombeirP/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/PombeirP/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/PombeirP/subscriptions",
            "organizations_url": "https://api.github.com/users/PombeirP/orgs",
            "repos_url": "https://api.github.com/users/PombeirP/repos",
            "events_url": "https://api.github.com/users/PombeirP/events{/privacy}",
            "received_events_url": "https://api.github.com/users/PombeirP/received_events",
            "type": "User",
            "site_admin": false
        }
    }
    ```
    
  • Implement github workflow events (Dispatch, Job, Run)

    Implement github workflow events (Dispatch, Job, Run)

    This PR implements event processing for GitHub workflow_dispatch: https://docs.github.com/en/developers/webhooks-and-events/webhooks/webhook-events-and-payloads#workflow_dispatch

    workflow_job: https://docs.github.com/en/developers/webhooks-and-events/webhooks/webhook-events-and-payloads#workflow_job

    and workflow_run: https://docs.github.com/en/developers/webhooks-and-events/webhooks/webhook-events-and-payloads#workflow_run

    This implementation has been verified in a production environment (https://github.com/vmware-tanzu/community-edition) and details on its use can be found in this PR: https://github.com/vmware-tanzu/community-edition/pull/2300

  • [Gitlab] - Add partial system hook parsing

    [Gitlab] - Add partial system hook parsing

    In Gitlab it is possible to setup system hooks for specific events like push, tag push, merge request unfortunately the current implementation uses the X-Gitlab-Event rather the object_kind property from the payload itself so the webhook won't listen on them.

    I have added the 3 mainly used system hook calls by parsing the payload and use the object_kind property to overwrite the gitLabEvent variable and parse the payload as what it really is.

    I'd rather see this as an MVP to be able to use those 3 events for custom integration of the webhook, but i think it would be better to omit the check of X-Gitlab-Event and use the object_kind of the payload itself, If this is okay for you i will try to offer you a new PR in the future with those changes.

    Also feedback on the code is highly appreciated as i am "relatively" new in writing production ready go.

  • Payload Not Populating

    Payload Not Populating

    Seems to be similar #8. My payload does not seem to be populating properly. I'm using the PullRequestEvent, specifically the review_requested Action. I also noticed that the payload was missing the attribute requested_reviewers (https://developer.github.com/v3/activity/events/types/#pullrequestevent)

    Hook

    func main() {
    	hook := github.New(&github.Config{Secret: os.Getenv("GITHUB_SECRET")})
    	hook.RegisterEvents(HandlePullRequestEvent, github.PullRequestEvent)
    	port := os.Getenv("PORT")
    
    	err := webhooks.Run(hook, ":"+port, path)
    	if err != nil {
    		fmt.Println(err)
    	}
    }
    

    Handling the Event

    pullRequestPayload := payload.(github.PullRequestPayload)
    fmt.Printf("%+v", pullRequestPayload)            // Seen below
    fmt.Println(pullRequestPayload.Action)           // Empty
    

    Payload

    {Action: Number:0 PullRequest:{URL: ID:0 HTMLURL: DiffURL: PatchURL: IssueURL: Number:0 State: Locked:false Title: User:{Login: ID:0 AvatarURL: GravatarID: URL: HTMLURL: FollowersURL: FollowingURL: GistsURL: StarredURL: SubscriptionsURL: OrganizationsURL: ReposURL: EventsURL: ReceivedEventsURL: Type: SiteAdmin:false} Body: CreatedAt:0001-01-01 00:00:00 +0000 UTC UpdatedAt:0001-01-01 00:00:00 +0000 UTC ClosedAt:<nil> MergedAt:<nil> MergeCommitSha:<nil> Assignee:<nil> Milestone:<nil> CommitsURL: ReviewCommentsURL: ReviewCommentURL: CommentsURL: StatusesURL: Head:{Label: Ref: Sha: User:{Login: ID:0 AvatarURL: GravatarID: URL: HTMLURL: FollowersURL: FollowingURL: GistsURL: StarredURL: SubscriptionsURL: OrganizationsURL: ReposURL: EventsURL: ReceivedEventsURL: Type: SiteAdmin:false} Repo:{ID:0 Name: FullName: Owner:{Login: ID:0 AvatarURL: GravatarID: URL: HTMLURL: FollowersURL: FollowingURL: GistsURL: StarredURL: SubscriptionsURL: OrganizationsURL: ReposURL: EventsURL: ReceivedEventsURL: Type: SiteAdmin:false} Private:false HTMLURL: Description: Fork:false URL: ForksURL: KeysURL: CollaboratorsURL: TeamsURL: HooksURL: IssueEventsURL: EventsURL: AssigneesURL: BranchesURL: TagsURL: BlobsURL: GitTagsURL: GitRefsURL: TreesURL: StatusesURL: LanguagesURL: StargazersURL: ContributorsURL: SubscribersURL: SubscriptionURL: CommitsURL: GitCommitsURL: CommentsURL: IssueCommentURL: ContentsURL: CompareURL: MergesURL: ArchiveURL: DownloadsURL: IssuesURL: PullsURL: MilestonesURL: NotificationsURL: LabelsURL: ReleasesURL: CreatedAt:0001-01-01 00:00:00 +0000 UTC UpdatedAt:0001-01-01 00:00:00 +0000 UTC PushedAt:0001-01-01 00:00:00 +0000 UTC GitURL: SSHURL: CloneURL: SvnURL: Homepage:<nil> Size:0 StargazersCount:0 WatchersCount:0 Language:<nil> HasIssues:false HasDownloads:false HasWiki:false HasPages:false ForksCount:0 MirrorURL:<nil> OpenIssuesCount:0 Forks:0 OpenIssues:0 Watchers:0 DefaultBranch:}} Base:{Label: Ref: Sha: User:{Login: ID:0 AvatarURL: GravatarID: URL: HTMLURL: FollowersURL: FollowingURL: GistsURL: StarredURL: SubscriptionsURL: OrganizationsURL: ReposURL: EventsURL: ReceivedEventsURL: Type: SiteAdmin:false} Repo:{ID:0 Name: FullName: Owner:{Login: ID:0 AvatarURL: GravatarID: URL: HTMLURL: FollowersURL: FollowingURL: GistsURL: StarredURL: SubscriptionsURL: OrganizationsURL: ReposURL: EventsURL: ReceivedEventsURL: Type: SiteAdmin:false} Private:false HTMLURL: Description: Fork:false URL: ForksURL: KeysURL: CollaboratorsURL: TeamsURL: HooksURL: IssueEventsURL: EventsURL: AssigneesURL: BranchesURL: TagsURL: BlobsURL: GitTagsURL: GitRefsURL: TreesURL: StatusesURL: LanguagesURL: StargazersURL: ContributorsURL: SubscribersURL: SubscriptionURL: CommitsURL: GitCommitsURL: CommentsURL: IssueCommentURL: ContentsURL: CompareURL: MergesURL: ArchiveURL: DownloadsURL: IssuesURL: PullsURL: MilestonesURL: NotificationsURL: LabelsURL: ReleasesURL: CreatedAt:0001-01-01 00:00:00 +0000 UTC UpdatedAt:0001-01-01 00:00:00 +0000 UTC PushedAt:0001-01-01 00:00:00 +0000 UTC GitURL: SSHURL: CloneURL: SvnURL: Homepage:<nil> Size:0 StargazersCount:0 WatchersCount:0 Language:<nil> HasIssues:false HasDownloads:false HasWiki:false HasPages:false ForksCount:0 MirrorURL:<nil> OpenIssuesCount:0 Forks:0 OpenIssues:0 Watchers:0 DefaultBranch:}} Links:{Self:{Href:} HTML:{Href:} Issue:{Href:} Comments:{Href:} ReviewComments:{Href:} ReviewComment:{Href:} Commits:{Href:} Statuses:{Href:}} Merged:false Mergeable:<nil> MergeableState: MergedBy:<nil> Comments:0 ReviewComments:0 Commits:0 Additions:0 Deletions:0 ChangedFiles:0} Label:{ID:0 URL: Name: Color: Default:false} Repository:{ID:0 Name: FullName: Owner:{Login: ID:0 AvatarURL: GravatarID: URL: HTMLURL: FollowersURL: FollowingURL: GistsURL: StarredURL: SubscriptionsURL: OrganizationsURL: ReposURL: EventsURL: ReceivedEventsURL: Type: SiteAdmin:false} Private:false HTMLURL: Description: Fork:false URL: ForksURL: KeysURL: CollaboratorsURL: TeamsURL: HooksURL: IssueEventsURL: EventsURL: AssigneesURL: BranchesURL: TagsURL: BlobsURL: GitTagsURL: GitRefsURL: TreesURL: StatusesURL: LanguagesURL: StargazersURL: ContributorsURL: SubscribersURL: SubscriptionURL: CommitsURL: GitCommitsURL: CommentsURL: IssueCommentURL: ContentsURL: CompareURL: MergesURL: ArchiveURL: DownloadsURL: IssuesURL: PullsURL: MilestonesURL: NotificationsURL: LabelsURL: ReleasesURL: CreatedAt:0001-01-01 00:00:00 +0000 UTC UpdatedAt:0001-01-01 00:00:00 +0000 UTC PushedAt:0001-01-01 00:00:00 +0000 UTC GitURL: SSHURL: CloneURL: SvnURL: Homepage:<nil> Size:0 StargazersCount:0 WatchersCount:0 Language:<nil> HasIssues:false HasDownloads:false HasWiki:false HasPages:false ForksCount:0 MirrorURL:<nil> OpenIssuesCount:0 Forks:0 OpenIssues:0 Watchers:0 DefaultBranch:} Sender:{Login: ID:0 AvatarURL: GravatarID: URL: HTMLURL: FollowersURL: FollowingURL: GistsURL: StarredURL: SubscriptionsURL: OrganizationsURL: ReposURL: EventsURL: ReceivedEventsURL: Type: SiteAdmin:false} Installation:{ID:0}}
    

    Thanks for your help!

  • logging

    logging

    It would be great if this project supports logging; it helps a lot when debugging.

    For now I've used github.com/gorilla/handlers and modified Run in webhooks.go to be

    logSrv := handlers.LoggingHandler(os.Stdout, srv)
    s := &http.Server{Addr: addr, Handler: logSrv}
    return s.ListenAndServe()
    
  • Changed date field from int64 to time.Time to fix the parsing error.

    Changed date field from int64 to time.Time to fix the parsing error.

    Related issue: https://github.com/go-playground/webhooks/issues/47

    This PR fixes the parse error for installation repositories event for date fields by using time.Time instead of int64 type.

  • Changing duration types from int64 to float64

    Changing duration types from int64 to float64

    Gitlab uses float format for build related information. Since it was not documented, it could not be part of previous PR. Below snippet is from test setup.

      "build_status": "running",
      "build_started_at": "2021-01-11 20:21:22 +0100",
      "build_finished_at": null,
      "build_duration": 0.08038407,
      "build_allow_failure": false,
      "build_failure_reason": "unknown_failure",
      "pipeline_id": 33,
    
  • Added runner to gitlab

    Added runner to gitlab

    this has been changed on CE, I imagine all versions may be affected. It has not yet been heavily tested, I ended up designing an alternative, hard coded one, but figured i'd PR the items to be considered that I worked on.

  • [GitHub] Check HMAC signature in SHA256

    [GitHub] Check HMAC signature in SHA256

    I don't know whether it's a nit win migrated from SHA1, but it's compatible and recommended at GitHub Docs.

    I'm glad to send a PR if it's concluded to be a valid issue.

  • Add support for confidential comment events

    Add support for confidential comment events

    Add the required types and hooks for confidential comment events, and update the relevant fixtures with the latest GitLab examples.

    Note that the types can be differentiated using event_type, which is note or confidential_note.

  • Typo of field in PushEventPayload and TagEventPayload

    Typo of field in PushEventPayload and TagEventPayload

    Fix the json field name of Project in GitLab's PushEventPayload and TagEventPayload. The json field name should be lowercase project according to https://docs.gitlab.com/ee/user/project/integrations/webhook_events.html#push-events.

    {
      "object_kind": "push",
      "event_name": "push",
      ...
      "project":{
        "id": 15,
        ...
      },
      ...
    }
    

    Would love to have this fixed since some services we're interacting with expect the project field to exist and throw error when we use this library.

  • Fix GitLab webhook event Project field typo

    Fix GitLab webhook event Project field typo

    Fix the json field name of Project in GitLab's PushEventPayload and TagEventPayload. The json field name should be lowercase project according to https://docs.gitlab.com/ee/user/project/integrations/webhook_events.html#push-events.

Display last GitLab project git commit. Page is optimized for an e-paper device.
Display last GitLab project git commit. Page is optimized for an e-paper device.

git-on-epaper A gitlab webhook for push notifications on a project. The webhook serves a HTML that shows the last push on the project with the followi

Dec 12, 2022
Send messages from slack incoming webhook integrations to telegram
Send messages from slack incoming webhook integrations to telegram

slack-to-telegram Slack incoming webhook to telegram Send messages from slack incoming webhook integrations to telegram Tested on Gitlab Slack Notific

Jul 19, 2022
Package githubv4 is a client library for accessing GitHub GraphQL API v4 (https://developer.github.com/v4/).

githubv4 Package githubv4 is a client library for accessing GitHub GraphQL API v4 (https://docs.github.com/en/graphql). If you're looking for a client

Dec 26, 2022
May 25, 2021
A GitHub CLI extension that displays collaboration-related information about a GitHub repository.
A GitHub CLI extension that displays collaboration-related information about a GitHub repository.

collab-scanner GitHub CLI extension A GitHub CLI extension that displays collaboration-related information on a repository. Install gh extension insta

Dec 30, 2022
Go library for accessing the GitHub API

go-github go-github is a Go client library for accessing the GitHub API v3. Currently, go-github requires Go version 1.9 or greater. go-github tracks

Dec 30, 2022
Go library for accessing trending repositories and developers at Github.
Go library for accessing trending repositories and developers at Github.

go-trending A package to retrieve trending repositories and developers from Github written in golang. This package were inspired by rochefort/git-tren

Dec 21, 2022
Periodically collect data about my Twitter account and check in to github to preserve an audit trail.

Twitter audit trail backup This repository backs up my follower list, following list, blocked accounts list and muted accounts list periodically using

Dec 28, 2022
Assume AWS IAM roles from GitHub Actions workflows with no stored secrets
Assume AWS IAM roles from GitHub Actions workflows with no stored secrets

AWS IAM roles for GitHub Actions workflows Background and rationale GitHub Actions are a pretty nice solution for CI/CD. Where they fall short is inte

Feb 12, 2022
actionlint is a static checker for GitHub Actions workflow files.

actionlint actionlint is a static checker for GitHub Actions workflow files. Features: Syntax check for workflow files to check unexpected or missing

Dec 27, 2022
Easily manage your github credentials
Easily manage your github credentials

HUB ADMIN Hub Admin is a command-line tool managing your github credentials Installation go get github.com/crewdevio/HubAdmin How to use Open he

Oct 20, 2021
GitHub Actions demo for a monorepo Go project

GitHub Actions demo for a monorepo Go project The purpose of this repository is to demonstrate using a GitHub action as a pull request status check in

Oct 31, 2021
A demo repo to show KICS Github Action in Action

?? KICS GitHub Actions Demo This repository shows how KICS GitHub Action can be set and was fully inspired by the documentation on KICS GitHub Actions

Nov 23, 2021
A Github action to post to news.ycombinator.com

action-hackernews-post Unofficial A Github action to post to news.ycombinator.com Uses @lukakerr's hkn go module to login and post to HN Guidelines As

Mar 12, 2022
Explores GitHub Actions in Go Lab from GopherCon 2021

Gopher A Tweet An action that tweets. Gopher A Tweet was created based on GopherCon 2021s Gophers of Microsoft: GitHub Action in Go Lab to explore bui

Dec 10, 2021
A starting point for a GitHub Action based in Go.

GitHub Action Using Go This is a starting point for a GitHub Action based in Go. This repo provides all the structure needed to build a robust GitHub

Dec 11, 2021
A GitHub action for the Go! programming language (by Francis McCabe, 2004)

Setup Go! (GitHub Action) This project is a GitHub action for the Go! programmin

Oct 22, 2022
A Github Action to auto approve pull requests that contain only document reviews.

Approve documentation review A Github Action to auto approve pull requests that contain only document reviews. The Cloud Platform team have a document

Dec 23, 2021
GitHub Utilities for managing classroom repositories.

ghutil GitHub Utilities for bulk operations. Requirements A ghutil.toml configuration file is needed in the working directory. It should have entries

Dec 21, 2021