Skip to content

Commit

Permalink
Automatically update coredns assets using Github workflows (eksctl-io…
Browse files Browse the repository at this point in the history
…#7178)

* Automatically update coredns assets using github workflows

* configure aws credentials

* add id-token permission

* update role duration value to minimum supported

* fix typo
  • Loading branch information
TiberiuGC authored Oct 18, 2023
1 parent 8a61a8b commit 0d454a3
Show file tree
Hide file tree
Showing 3 changed files with 119 additions and 9 deletions.
32 changes: 23 additions & 9 deletions .github/workflows/update-generated.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,19 @@ on:
schedule:
- cron: "0 5 * * Thu"

permissions:
id-token: write

env:
DEFAULT_BRANCH: main
UPDATE_BRANCH: update-aws-node

jobs:
update_aws_node:
name: Update aws-node and open PR
update_generated_file:
strategy:
fail-fast: false
matrix:
resource: ["coredns", "aws-node"]
name: Update ${{ matrix.resource }} and open PR
runs-on: ubuntu-latest
container: public.ecr.aws/eksctl/eksctl-build:516ded83aa5dbd3e3c4e25c5d410e2dba3b5e668
env:
Expand All @@ -21,6 +27,14 @@ jobs:
with:
token: ${{ secrets.EKSCTLBOT_TOKEN }}
fetch-depth: 0
- name: Configure AWS credentials for coredns update
if: ${{ matrix.resource == 'coredns' }}
uses: aws-actions/configure-aws-credentials@010d0da01d0b5a38af31e9c3470dbfdabdecca3a # v4.0.1
with:
aws-region: us-west-2
role-duration-seconds: 900
role-session-name: eksctl-update-coredns-assets
role-to-assume: ${{ secrets.UPDATE_COREDNS_ROLE_ARN }}
- name: Setup identity as eksctl-bot
uses: ./.github/actions/setup-identity
with:
Expand All @@ -34,15 +48,15 @@ jobs:
key: go-${{ hashFiles('go.sum') }}
restore-keys: |
go-
- name: Update aws-node
run: make update-aws-node
- name: Update ${{ matrix.resource }}
run: make update-${{ matrix.resource }}
- name: Commit changes
id: commit
run: |
git checkout $DEFAULT_BRANCH
git checkout -B $UPDATE_BRANCH
git checkout -B update-${{ matrix.resource }}
git add -u
if ! EDITOR=true git commit -m "Update aws-node"; then
if ! EDITOR=true git commit -m "Update ${{ matrix.resource }}"; then
echo "changes=false" >> $GITHUB_OUTPUT
exit 0
fi
Expand All @@ -57,8 +71,8 @@ jobs:
script: |
const { data: pr } = await github.rest.pulls.create({
...context.repo,
title: "Update aws-node",
head: "${{ env.UPDATE_BRANCH }}",
title: "Update ${{ matrix.resource }}",
head: "update-${{ matrix.resource }}",
base: "${{ env.DEFAULT_BRANCH }}",
});
await github.rest.issues.addLabels({
Expand Down
4 changes: 4 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,10 @@ pkg/addons/default/assets/aws-node.yaml:
update-aws-node: ## Re-download the aws-node manifests from AWS
go generate ./pkg/addons/default/aws_node_generate.go

.PHONY:
update-coredns: ## get latest coredns builds for each available eks version
@go run pkg/addons/default/scripts/update_coredns_assets.go

deep_copy_helper_input = $(shell $(call godeps_cmd,./pkg/apis/...) | sed 's|$(generated_code_deep_copy_helper)||' )
$(generated_code_deep_copy_helper): $(deep_copy_helper_input) ## Generate Kubernetes API helpers
build/scripts/update-codegen.sh
Expand Down
92 changes: 92 additions & 0 deletions pkg/addons/default/scripts/update_coredns_assets.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
package main

import (
"context"
"fmt"
"log"
"os"
"path/filepath"
"regexp"
"sort"
"strings"

"github.com/aws/aws-sdk-go-v2/aws"
awseks "github.com/aws/aws-sdk-go-v2/service/eks"
"github.com/blang/semver"

api "github.com/weaveworks/eksctl/pkg/apis/eksctl.io/v1alpha5"
"github.com/weaveworks/eksctl/pkg/eks"
)

func main() {
ctx := context.Background()

clusterProvider, err := eks.New(ctx, &api.ProviderConfig{}, nil)
if err != nil {
log.Fatalf("failed to create the AWS provider: %v", err)
}

for _, kubernetesVersion := range api.SupportedVersions() {
latestVersion := getLatestVersion(ctx, clusterProvider, kubernetesVersion)
if latestVersion == "" {
continue
}
replaceCurrentVersionIfOutdated(latestVersion, kubernetesVersion)
}

}

func getLatestVersion(ctx context.Context, clusterProvider *eks.ClusterProvider, kubernetesVersion string) string {
output, err := clusterProvider.AWSProvider.EKS().DescribeAddonVersions(ctx, &awseks.DescribeAddonVersionsInput{
AddonName: aws.String("coredns"),
KubernetesVersion: &kubernetesVersion,
})
if err != nil {
log.Fatalf("failed calling EKS::DescribeAddonVersions: %v", err)
}

corednsVersions := output.Addons[0].AddonVersions
if len(corednsVersions) == 0 {
return ""
}

sort.Slice(corednsVersions, func(i, j int) bool {
vi, err := semver.Parse(trim(*corednsVersions[i].AddonVersion))
if err != nil {
log.Fatalf("failed to parse coredns version %s: %v", trim(*corednsVersions[i].AddonVersion), err)
}
vj, err := semver.Parse(trim(*corednsVersions[j].AddonVersion))
if err != nil {
log.Fatalf("failed to parse coredns version %s: %v", trim(*corednsVersions[j].AddonVersion), err)
}
if vi.Compare(vj) >= 0 {
return true
}
return false
})

return *corednsVersions[0].AddonVersion
}

func replaceCurrentVersionIfOutdated(latestVersion string, kubernetesVersion string) {
filePath := filepath.Join("pkg", "addons", "default", "assets", fmt.Sprintf("coredns-%s.json", kubernetesVersion))
coreFile, err := os.ReadFile(filePath)
if err != nil {
log.Fatalf("failed to read coredns-%s.json: %v", kubernetesVersion, err)
}

regexpVersion := regexp.MustCompile(`v\d+\.\d+\.\d+-eksbuild\.\d+`)
currentVersion := regexpVersion.FindString(string(coreFile))
if currentVersion == "" {
log.Fatalf("couldn't find coredns version in coredns-%s.json", kubernetesVersion)
}

updatedCoreFile := regexpVersion.ReplaceAllString(string(coreFile), latestVersion)
if err := os.WriteFile(filePath, []byte(updatedCoreFile), 0644); err != nil {
log.Fatalf("failed to write coredns-%s.json: %v", kubernetesVersion, err)
}
}

func trim(version string) string {
return strings.TrimPrefix(version, "v")
}

0 comments on commit 0d454a3

Please sign in to comment.