Skip to content

Commit 1d17906

Browse files
Add retry on 401 and 403 for runner-registration (#3377)
Co-authored-by: Francesco Renzi <[email protected]>
1 parent 442d52c commit 1d17906

File tree

2 files changed

+65
-9
lines changed

2 files changed

+65
-9
lines changed

github/actions/client.go

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -975,20 +975,38 @@ func (c *Client) getActionsServiceAdminConnection(ctx context.Context, rt *regis
975975

976976
c.logger.Info("getting Actions tenant URL and JWT", "registrationURL", req.URL.String())
977977

978-
resp, err := c.Do(req)
979-
if err != nil {
980-
return nil, err
981-
}
982-
defer resp.Body.Close()
978+
var resp *http.Response
979+
retry := 0
980+
for {
981+
var err error
982+
resp, err = c.Do(req)
983+
if err != nil {
984+
return nil, err
985+
}
986+
defer resp.Body.Close()
983987

984-
if resp.StatusCode < 200 || resp.StatusCode > 299 {
985-
registrationErr := fmt.Errorf("unexpected response from Actions service during registration call: %v", resp.StatusCode)
988+
if resp.StatusCode >= 200 && resp.StatusCode <= 299 {
989+
break
990+
}
986991

992+
errStr := fmt.Sprintf("unexpected response from Actions service during registration call: %v", resp.StatusCode)
987993
body, err := io.ReadAll(resp.Body)
988994
if err != nil {
989-
return nil, fmt.Errorf("%v - %v", registrationErr, err)
995+
err = fmt.Errorf("%s - %w", errStr, err)
996+
} else {
997+
err = fmt.Errorf("%s - %v", errStr, string(body))
998+
}
999+
1000+
if resp.StatusCode != http.StatusUnauthorized && resp.StatusCode != http.StatusForbidden {
1001+
return nil, err
1002+
}
1003+
1004+
retry++
1005+
if retry > 3 {
1006+
return nil, fmt.Errorf("unable to register runner after 3 retries: %v", err)
9901007
}
991-
return nil, fmt.Errorf("%v - %v", registrationErr, string(body))
1008+
time.Sleep(time.Duration(500 * int(time.Millisecond) * (retry + 1)))
1009+
9921010
}
9931011

9941012
var actionsServiceAdminConnection *ActionsServiceAdminConnection

github/actions/github_api_request_test.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package actions_test
22

33
import (
44
"context"
5+
"encoding/json"
56
"io"
67
"net/http"
78
"net/url"
@@ -152,6 +153,43 @@ func TestNewActionsServiceRequest(t *testing.T) {
152153
assert.Equal(t, client.ActionsServiceAdminTokenExpiresAt, expiresAt)
153154
})
154155

156+
t.Run("admin token refresh retry", func(t *testing.T) {
157+
newToken := defaultActionsToken(t)
158+
errMessage := `{"message":"test"}`
159+
160+
srv := "http://github.com/my-org"
161+
resp := &actions.ActionsServiceAdminConnection{
162+
AdminToken: &newToken,
163+
ActionsServiceUrl: &srv,
164+
}
165+
failures := 0
166+
unauthorizedHandler := func(w http.ResponseWriter, r *http.Request) {
167+
if failures < 2 {
168+
failures++
169+
w.Header().Set("Content-Type", "application/json")
170+
w.WriteHeader(http.StatusUnauthorized)
171+
w.Write([]byte(errMessage))
172+
return
173+
}
174+
175+
w.WriteHeader(http.StatusCreated)
176+
_ = json.NewEncoder(w).Encode(resp)
177+
}
178+
server := testserver.New(t, nil, testserver.WithActionsToken("random-token"), testserver.WithActionsToken(newToken), testserver.WithActionsRegistrationTokenHandler(unauthorizedHandler))
179+
client, err := actions.NewClient(server.ConfigURLForOrg("my-org"), defaultCreds)
180+
require.NoError(t, err)
181+
expiringToken := "expiring-token"
182+
expiresAt := time.Now().Add(59 * time.Second)
183+
client.ActionsServiceAdminToken = expiringToken
184+
client.ActionsServiceAdminTokenExpiresAt = expiresAt
185+
186+
_, err = client.NewActionsServiceRequest(ctx, http.MethodGet, "my-path", nil)
187+
require.NoError(t, err)
188+
assert.Equal(t, client.ActionsServiceAdminToken, newToken)
189+
assert.Equal(t, client.ActionsServiceURL, srv)
190+
assert.NotEqual(t, client.ActionsServiceAdminTokenExpiresAt, expiresAt)
191+
})
192+
155193
t.Run("token is currently valid", func(t *testing.T) {
156194
tokenThatShouldNotBeFetched := defaultActionsToken(t)
157195
server := testserver.New(t, nil, testserver.WithActionsToken(tokenThatShouldNotBeFetched))

0 commit comments

Comments
 (0)