Skip to content

Commit 389d842

Browse files
Relax version requirements to allow patch version mismatch (#4080)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
1 parent f6f42dd commit 389d842

File tree

3 files changed

+133
-1
lines changed

3 files changed

+133
-1
lines changed
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package v1alpha1
2+
3+
import "strings"
4+
5+
func IsVersionAllowed(resourceVersion, buildVersion string) bool {
6+
if buildVersion == "dev" || resourceVersion == buildVersion || strings.HasPrefix(buildVersion, "canary-") {
7+
return true
8+
}
9+
10+
rv, ok := parseSemver(resourceVersion)
11+
if !ok {
12+
return false
13+
}
14+
bv, ok := parseSemver(buildVersion)
15+
if !ok {
16+
return false
17+
}
18+
return rv.major == bv.major && rv.minor == bv.minor
19+
}
20+
21+
type semver struct {
22+
major string
23+
minor string
24+
}
25+
26+
func parseSemver(v string) (p semver, ok bool) {
27+
if v == "" {
28+
return
29+
}
30+
p.major, v, ok = parseInt(v)
31+
if !ok {
32+
return p, false
33+
}
34+
if v == "" {
35+
p.minor = "0"
36+
return p, true
37+
}
38+
if v[0] != '.' {
39+
return p, false
40+
}
41+
p.minor, v, ok = parseInt(v[1:])
42+
if !ok {
43+
return p, false
44+
}
45+
if v == "" {
46+
return p, true
47+
}
48+
if v[0] != '.' {
49+
return p, false
50+
}
51+
if _, _, ok = parseInt(v[1:]); !ok {
52+
return p, false
53+
}
54+
return p, true
55+
}
56+
57+
func parseInt(v string) (t, rest string, ok bool) {
58+
if v == "" {
59+
return
60+
}
61+
if v[0] < '0' || '9' < v[0] {
62+
return
63+
}
64+
i := 1
65+
for i < len(v) && '0' <= v[i] && v[i] <= '9' {
66+
i++
67+
}
68+
if v[0] == '0' && i != 1 {
69+
return
70+
}
71+
return v[:i], v[i:], true
72+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package v1alpha1_test
2+
3+
import (
4+
"testing"
5+
6+
"github.com/actions/actions-runner-controller/apis/actions.github.com/v1alpha1"
7+
"github.com/stretchr/testify/assert"
8+
)
9+
10+
func TestIsVersionAllowed(t *testing.T) {
11+
t.Parallel()
12+
tt := map[string]struct {
13+
resourceVersion string
14+
buildVersion string
15+
want bool
16+
}{
17+
"dev should always be allowed": {
18+
resourceVersion: "0.11.0",
19+
buildVersion: "dev",
20+
want: true,
21+
},
22+
"resourceVersion is not semver": {
23+
resourceVersion: "dev",
24+
buildVersion: "0.11.0",
25+
want: false,
26+
},
27+
"buildVersion is not semver": {
28+
resourceVersion: "0.11.0",
29+
buildVersion: "NA",
30+
want: false,
31+
},
32+
"major version mismatch": {
33+
resourceVersion: "0.11.0",
34+
buildVersion: "1.11.0",
35+
want: false,
36+
},
37+
"minor version mismatch": {
38+
resourceVersion: "0.11.0",
39+
buildVersion: "0.10.0",
40+
want: false,
41+
},
42+
"patch version mismatch": {
43+
resourceVersion: "0.11.1",
44+
buildVersion: "0.11.0",
45+
want: true,
46+
},
47+
"arbitrary version match": {
48+
resourceVersion: "abc",
49+
buildVersion: "abc",
50+
want: true,
51+
},
52+
}
53+
54+
for name, tc := range tt {
55+
t.Run(name, func(t *testing.T) {
56+
got := v1alpha1.IsVersionAllowed(tc.resourceVersion, tc.buildVersion)
57+
assert.Equal(t, tc.want, got)
58+
})
59+
}
60+
}

controllers/actions.github.com/autoscalingrunnerset_controller.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ func (r *AutoscalingRunnerSetReconciler) Reconcile(ctx context.Context, req ctrl
151151
return ctrl.Result{}, nil
152152
}
153153

154-
if autoscalingRunnerSet.Labels[LabelKeyKubernetesVersion] != build.Version {
154+
if !v1alpha1.IsVersionAllowed(autoscalingRunnerSet.Labels[LabelKeyKubernetesVersion], build.Version) {
155155
if err := r.Delete(ctx, autoscalingRunnerSet); err != nil {
156156
log.Error(err, "Failed to delete autoscaling runner set on version mismatch",
157157
"buildVersion", build.Version,

0 commit comments

Comments
 (0)