44 Commits

Author SHA1 Message Date
Francesco Renzi 33cbb7a1d9 log 2026-02-02 12:07:47 +01:00
Francesco Renzi 9cd2ceb86b static user agent 2026-02-02 11:00:34 +01:00
Francesco Renzi aeda0a5af4 Add --labels support in docker example (#51) 2026-01-30 13:41:46 +00:00
Nikola Jokic c841c96f1c Add debug info while issuing request (#50)
* Add debug info while issuing request

* wip

* wip

* Rework tests
2026-01-30 13:03:22 +01:00
Francesco Renzi 145b7e382f Add more details about the API in the readme (#47) 2026-01-13 17:19:32 +00:00
Francesco Renzi 0015641f99 Remove unused fields (#48) 2026-01-13 17:19:16 +00:00
Nikola Jokic 1208e1216e Hide session handling and generate session client from the main client (#42) 2026-01-05 18:19:41 +01:00
Francesco Renzi ebe67dba45 Add missing sections to readme (#45) 2026-01-02 16:53:12 +00:00
Francesco Renzi 5cb859334b Add CONTRIBUTING.md (#44) 2026-01-02 16:52:57 +00:00
Francesco Renzi 3fe477d93e Add SUPPORT.md (#43)
Updated support instructions and removed TODOs.
2026-01-02 10:44:46 -06:00
Nikola Jokic f3ab19d2b8 Use system info and build info as user agent, and expose DebugInfo (#41)
* Refactor setting and unsetting system info

* detect version on init

* Update client.go

* Update client_test.go

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update client.go

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-12-17 16:29:45 +01:00
Francesco Renzi 40342b1e2a Add CODEOWNERS file for repository ownership (#40) 2025-12-08 15:08:51 +01:00
Francesco Renzi d9d8d097da Add Contributor Covenant Code of Conduct (#38) 2025-12-04 11:48:21 +00:00
Francesco Renzi e346584c2d Create SECURITY.md for reporting vulnerabilities (#39)
Added guidelines for reporting security issues and policies.
2025-12-04 11:48:07 +00:00
Francesco Renzi be0376b5b5 Add MIT License to the project (#37) 2025-12-04 12:32:40 +01:00
Nikola Jokic 7e0eae99a6 Modify error API and add Listener tests (#36)
* Modify error API to not include exception, but to test on type

* reformat

* address renames and documentations from the review

* test is errors

* document
2025-12-02 18:23:40 +01:00
Nikola Jokic 01adae723f Implement dockerscaleset e2e tests (#25)
* wip: setting up e2e tests

* rebase
2025-11-27 17:18:00 +01:00
Francesco Renzi e37307f46f Use retryablehttp for token calls too (#35) 2025-11-27 12:36:11 +00:00
Nikola Jokic 23bfd4848d Remove example module and revert back to ints for simpler usage (#34)
* Remove example module and revert back to ints for simpler usage

* fmt

* remove unused transformations

* add max runners to the scaler
2025-11-27 13:31:44 +01:00
Francesco Renzi a2a8af97b6 Add scripts (#33)
* Add scripts

* Fix errors test
2025-11-27 13:05:42 +01:00
Francesco Renzi 60ce378d14 Enable cache in test jobs (#31) 2025-11-26 17:08:22 +00:00
Francesco Renzi dde6b4631c Deserialize scale messages in the client (#28)
* Deserialize scale messages in the client

* fix tests
2025-11-26 17:08:00 +00:00
Francesco Renzi fe39658434 Update devcontainer configuration with features and settings (#32)
* Update devcontainer configuration with features and settings

* Add devcontainer Dockerfile

* Comment why node

* \n
2025-11-26 17:07:35 +00:00
Francesco Renzi cec89c5b7b Add godoc comments and unexport (#27)
* Add separate constructors for each credential type

* Add godoc comments to client

* Unexport GitHubConfig

* Add godoc comments for listener package

* Apply suggestions from code review

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-11-26 15:05:39 +00:00
Nikola Jokic 7442885c99 Use strong typing and allow atomic change of the max runners (#24)
* Use strong typing and allow atomic change of the max runners

* prepare type change in dockerscaleset
2025-11-26 12:10:39 +01:00
Francesco Renzi 6d1c317b90 Return error on failed runner start (#17) 2025-11-24 11:06:19 +00:00
Nikola Jokic 45800be002 Add error messages instead of just returning an error (#16)
* Add error messages instead of just returning an error

* Apply suggestions from code review

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-11-24 12:05:49 +01:00
Nikola Jokic 16a9c915cb Use buildinfo to set the client version in the user agent (#13)
* Use go:generate to set the user agent version and sha

* regenerate

* buildinfo

* remove unused

* use init to source buildinfo
2025-11-21 14:38:55 +00:00
Francesco Renzi c2f0a53402 Add command to work around auth issues (#15) 2025-11-10 10:41:03 +00:00
Francesco Renzi 5f370484a7 Add READMEs (#10)
* Add READMEs

* Apply suggestions from code review

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* feedback

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-10-31 15:15:26 +00:00
Francesco Renzi 8104f571eb Update module name (#12) 2025-10-31 14:25:50 +00:00
Francesco Renzi 4cc97e220a Rename Handler -> Scaler (#11) 2025-10-31 14:06:27 +00:00
Nikola Jokic 8155f87a58 Remove replace in example go.mod (#9) 2025-10-31 14:02:56 +00:00
Nikola Jokic 83fb2e2837 Set user agent as soon as the scale set is created, and remove the proxy info (#8)
* Set user agent as soon as the scale set is created

* fix test
2025-10-31 14:16:02 +01:00
Nikola Jokic 1f22d2441c move testserver to internal package (#7) 2025-10-31 14:10:56 +01:00
Francesco Renzi e9e5ca3282 Consolidate tests in a single file (#6) 2025-10-31 12:00:11 +00:00
Nikola Jokic 51aa04a4b2 Add Docker example (#5)
* Renames, style changes and unesports

* use signal handling

* remove unused fields, unexport packages, have a working example

* remove viper

* fix logger

* fix test

* remove unused var

* Added few log lines

* max runners fixed

* Restructure example

* Improve naming for app auth

* Apply suggestions from code review

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Remove old comment

---------

Co-authored-by: Francesco Renzi <rentziass@gmail.com>
Co-authored-by: Francesco Renzi <rentziass@github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-10-31 11:35:41 +00:00
Francesco Renzi 39ffa2e560 Remove acquire jobs (#4) 2025-10-30 14:52:11 +01:00
Nikola Jokic b1dcbc44e6 Renames, style changes and unexports (#3) 2025-10-30 14:24:07 +01:00
Francesco Renzi 287d3410da Merge pull request #2 from actions/nikola-jokic/remove-interface-and-mocks
Remove interfaces, mocks, and unused identity_test
2025-10-30 10:42:13 +00:00
Nikola Jokic c549549283 Remove interfaces, mocks, and unused identity_test 2025-10-30 11:35:35 +01:00
Francesco Renzi a2aa9f9ea9 Merge pull request #1 from actions/rentziass/ginkgo
Remove dependency on ginkgo
2025-10-30 10:24:51 +00:00
Francesco Renzi dd4c9f2481 Remove dependency on ginkgo 2025-10-30 10:21:06 +00:00
Nikola Jokic 8b43e9e5c9 Initial commit containing ARC github/actions client 2025-10-30 10:15:01 +01:00
5 changed files with 10 additions and 10 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
MIT License
Copyright GitHub, Inc.
Copyright (c) 2025 GitHub
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
+3 -3
View File
@@ -1,6 +1,6 @@
# GitHub Actions Runner Scale Set Client (Public Preview)
# GitHub Actions Runner Scale Set Client (Private Preview)
> Status: **Public Preview** While the API is stable, interfaces and examples in this repository may change.
> Status: **Private Preview** While the API is stable, interfaces and examples in this repository may change.
This repository provides a standalone Go client for the GitHub Actions **Runner Scale Set** APIs. It is extracted from the `actions-runner-controller` project so that platform teams, integrators, and infrastructure providers can build **their own custom autoscaling solutions** for GitHub Actions runners.
@@ -12,7 +12,7 @@ You do *not* need to adopt the full controller (and Kubernetes) to take advantag
A runner scale set is a group of self-hosted runners that autoscales based on workflow demand. Here's how it works:
1. **Registration**: You create a scale set with a name, which also serves as the label workflows use to target it (e.g., `runs-on: my-scale-set`). Multiple labels can be assigned per scale set. Like regular self-hosted runners, scale sets can be registered at the repository, organization, or enterprise level.
1. **Registration**: You create a scale set with a name, which also serves as the label workflows use to target it (e.g., `runs-on: my-scale-set`). Like regular self-hosted runners, scale sets can be registered at the repository, organization, or enterprise level.
2. **Polling**: Your scale set client continuously polls the API, reporting its maximum capacity (how many runners it can produce).
3. **Job matching**: GitHub matches jobs to your scale set based on the label and runner group policies, just like regular self-hosted runners.
4. **Scaling signal**: The API responds with how many runners your scale set needs online (`statistics.TotalAssignedJobs`).
+5 -3
View File
@@ -7,6 +7,7 @@ import (
"encoding/json"
"fmt"
"io"
"log/slog"
"maps"
"net/http"
"net/url"
@@ -126,9 +127,9 @@ type ProxyFunc func(req *http.Request) (*url.URL, error)
type SystemInfo struct {
// System is the name of the scale set implementation
System string `json:"system"`
// Version is the version of the client
// Version is the version of the controller
Version string `json:"version"`
// CommitSHA is the git commit SHA of the client
// CommitSHA is the git commit SHA of the controller
CommitSHA string `json:"commit_sha"`
// ScaleSetID is the ID of the scale set
ScaleSetID int `json:"scale_set_id"`
@@ -222,7 +223,6 @@ type userAgent struct {
SystemInfo
BuildVersion string `json:"build_version"`
BuildCommitSHA string `json:"build_commit_sha"`
Kind string `json:"kind"`
}
func (c *Client) newGitHubAPIRequest(ctx context.Context, method, path string, body io.Reader) (*http.Request, error) {
@@ -836,6 +836,8 @@ func (c *Client) getActionsServiceAdminConnection(ctx context.Context, rt *regis
return nil, fmt.Errorf("failed to get actions service admin connection: %w", err)
}
slog.Info("got connection", *adminConnection.ActionsServiceURL, c.userAgent)
return adminConnection, nil
}
+1 -1
View File
@@ -137,9 +137,9 @@ func (c *commonClient) setUserAgent() {
SystemInfo: c.systemInfo,
BuildVersion: buildInfo.version,
BuildCommitSHA: buildInfo.commitSHA,
Kind: "scaleset",
})
c.userAgent = string(b)
slog.Info("user agent", "useragent", c.userAgent)
}
// HTTPOption defines a functional option for configuring the Client.
-2
View File
@@ -124,7 +124,6 @@ func TestUserAgent(t *testing.T) {
SystemInfo: testSystemInfo,
BuildCommitSHA: sha,
BuildVersion: version,
Kind: "scaleset",
}
b, err := json.Marshal(wantInfo)
require.NoError(t, err, "failed to marshal expected user agent")
@@ -145,7 +144,6 @@ func TestUserAgent(t *testing.T) {
SystemInfo: userAgentInfo,
BuildCommitSHA: sha,
BuildVersion: version,
Kind: "scaleset",
}
b, err = json.Marshal(wantInfo)
require.NoError(t, err, "failed to marshal expected user agent after SetSystemInfo")