Skip to content

Commit

Permalink
Add generate-jitconfig API for self-hosted runners (#2801)
Browse files Browse the repository at this point in the history
  • Loading branch information
mkulke committed Jun 19, 2023
1 parent b2ae94a commit 4f74d0c
Show file tree
Hide file tree
Showing 4 changed files with 179 additions and 0 deletions.
54 changes: 54 additions & 0 deletions github/actions_runners.go
Expand Up @@ -45,6 +45,60 @@ func (s *ActionsService) ListRunnerApplicationDownloads(ctx context.Context, own
return rads, resp, nil
}

// GenerateJITConfigRequest specifies body parameters to GenerateRepoJITConfig.
type GenerateJITConfigRequest struct {
Name string `json:"name"`
RunnerGroupID int64 `json:"runner_group_id"`
WorkFolder *string `json:"work_folder,omitempty"`

// Labels represents the names of the custom labels to add to the runner.
// Minimum items: 1. Maximum items: 100.
Labels []string `json:"labels"`
}

// JITRunnerConfig represents encoded JIT configuration that can be used to bootstrap a self-hosted runner.
type JITRunnerConfig struct {
EncodedJITConfig *string `json:"encoded_jit_config,omitempty"`
}

// GenerateOrgJITConfig generate a just-in-time configuration for an organization.
//
// GitHub API docs: https://docs.github.com/en/rest/actions/self-hosted-runners?apiVersion=2022-11-28#create-configuration-for-a-just-in-time-runner-for-an-organization
func (s *ActionsService) GenerateOrgJITConfig(ctx context.Context, owner string, request *GenerateJITConfigRequest) (*JITRunnerConfig, *Response, error) {
u := fmt.Sprintf("orgs/%v/actions/runners/generate-jitconfig", owner)
req, err := s.client.NewRequest("POST", u, request)
if err != nil {
return nil, nil, err
}

jitConfig := new(JITRunnerConfig)
resp, err := s.client.Do(ctx, req, jitConfig)
if err != nil {
return nil, resp, err
}

return jitConfig, resp, nil
}

// GenerateRepoJITConfig generates a just-in-time configuration for a repository.
//
// GitHub API docs: https://docs.github.com/en/rest/actions/self-hosted-runners?apiVersion=2022-11-28#create-configuration-for-a-just-in-time-runner-for-a-repository
func (s *ActionsService) GenerateRepoJITConfig(ctx context.Context, owner, repo string, request *GenerateJITConfigRequest) (*JITRunnerConfig, *Response, error) {
u := fmt.Sprintf("repos/%v/%v/actions/runners/generate-jitconfig", owner, repo)
req, err := s.client.NewRequest("POST", u, request)
if err != nil {
return nil, nil, err
}

jitConfig := new(JITRunnerConfig)
resp, err := s.client.Do(ctx, req, jitConfig)
if err != nil {
return nil, resp, err
}

return jitConfig, resp, nil
}

// RegistrationToken represents a token that can be used to add a self-hosted runner to a repository.
type RegistrationToken struct {
Token *string `json:"token,omitempty"`
Expand Down
89 changes: 89 additions & 0 deletions github/actions_runners_test.go
Expand Up @@ -7,6 +7,7 @@ package github

import (
"context"
"encoding/json"
"fmt"
"net/http"
"testing"
Expand Down Expand Up @@ -56,6 +57,94 @@ func TestActionsService_ListRunnerApplicationDownloads(t *testing.T) {
})
}

func TestActionsService_GenerateOrgJITConfig(t *testing.T) {
client, mux, _, teardown := setup()
defer teardown()

input := &GenerateJITConfigRequest{Name: "test", RunnerGroupID: 1, Labels: []string{"one", "two"}}

mux.HandleFunc("/orgs/o/actions/runners/generate-jitconfig", func(w http.ResponseWriter, r *http.Request) {
v := new(GenerateJITConfigRequest)
json.NewDecoder(r.Body).Decode(v)

testMethod(t, r, "POST")
if !cmp.Equal(v, input) {
t.Errorf("Request body = %+v, want %+v", v, input)
}

fmt.Fprint(w, `{"encoded_jit_config":"foo"}`)
})

ctx := context.Background()
jitConfig, _, err := client.Actions.GenerateOrgJITConfig(ctx, "o", input)
if err != nil {
t.Errorf("Actions.GenerateOrgJITConfig returned error: %v", err)
}

want := &JITRunnerConfig{EncodedJITConfig: String("foo")}
if !cmp.Equal(jitConfig, want) {
t.Errorf("Actions.GenerateOrgJITConfig returned %+v, want %+v", jitConfig, want)
}

const methodName = "GenerateOrgJITConfig"
testBadOptions(t, methodName, func() (err error) {
_, _, err = client.Actions.GenerateOrgJITConfig(ctx, "\n", input)
return err
})

testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
got, resp, err := client.Actions.GenerateOrgJITConfig(ctx, "o", input)
if got != nil {
t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
}
return resp, err
})
}

func TestActionsService_GenerateRepoJITConfig(t *testing.T) {
client, mux, _, teardown := setup()
defer teardown()

input := &GenerateJITConfigRequest{Name: "test", RunnerGroupID: 1, Labels: []string{"one", "two"}}

mux.HandleFunc("/repos/o/r/actions/runners/generate-jitconfig", func(w http.ResponseWriter, r *http.Request) {
v := new(GenerateJITConfigRequest)
json.NewDecoder(r.Body).Decode(v)

testMethod(t, r, "POST")
if !cmp.Equal(v, input) {
t.Errorf("Request body = %+v, want %+v", v, input)
}

fmt.Fprint(w, `{"encoded_jit_config":"foo"}`)
})

ctx := context.Background()
jitConfig, _, err := client.Actions.GenerateRepoJITConfig(ctx, "o", "r", input)
if err != nil {
t.Errorf("Actions.GenerateRepoJITConfig returned error: %v", err)
}

want := &JITRunnerConfig{EncodedJITConfig: String("foo")}
if !cmp.Equal(jitConfig, want) {
t.Errorf("Actions.GenerateRepoJITConfig returned %+v, want %+v", jitConfig, want)
}

const methodName = "GenerateRepoJITConfig"
testBadOptions(t, methodName, func() (err error) {
_, _, err = client.Actions.GenerateRepoJITConfig(ctx, "\n", "\n", input)
return err
})

testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
got, resp, err := client.Actions.GenerateRepoJITConfig(ctx, "o", "r", input)
if got != nil {
t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
}
return resp, err
})
}

func TestActionsService_CreateRegistrationToken(t *testing.T) {
client, mux, _, teardown := setup()
defer teardown()
Expand Down
16 changes: 16 additions & 0 deletions github/github-accessors.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

20 changes: 20 additions & 0 deletions github/github-accessors_test.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 4f74d0c

Please sign in to comment.