From e7603bed4aeb2cded28116ef4bd73ab84b6b72d0 Mon Sep 17 00:00:00 2001 From: shenlan Date: Sat, 13 Sep 2025 16:12:01 +0800 Subject: [PATCH] feat: add k3s offline package workflow --- ...yml => offline-package-k3s-installer.yaml} | 34 ++++++++++++--- scripts/resolve_k3s_versions.sh | 41 +++++++++++++++++++ 2 files changed, 70 insertions(+), 5 deletions(-) rename .github/workflows/{build-k3s-offline-installer.yml => offline-package-k3s-installer.yaml} (75%) create mode 100755 scripts/resolve_k3s_versions.sh diff --git a/.github/workflows/build-k3s-offline-installer.yml b/.github/workflows/offline-package-k3s-installer.yaml similarity index 75% rename from .github/workflows/build-k3s-offline-installer.yml rename to .github/workflows/offline-package-k3s-installer.yaml index d7cc1a0..10d9062 100644 --- a/.github/workflows/build-k3s-offline-installer.yml +++ b/.github/workflows/offline-package-k3s-installer.yaml @@ -4,7 +4,8 @@ on: push: paths: - 'scripts/make_k3s_offline_package.sh' - - '.github/workflows/build-k3s-offline-installer.yml' + - 'scripts/resolve_k3s_versions.sh' + - '.github/workflows/offline-package-k3s-installer.yaml' workflow_dispatch: jobs: @@ -13,6 +14,8 @@ jobs: matrix: arch: [amd64, arm64] runs-on: ubuntu-latest + outputs: + k3s_version: ${{ steps.resolve.outputs.version }} steps: - name: Checkout Repo @@ -27,7 +30,7 @@ jobs: - name: Install dependencies run: | export NERDCTL_VERSION=2.0.4 - sudo apt-get update && sudo apt-get install -y curl tar tree + sudo apt-get update && sudo apt-get install -y curl jq tar tree # 安装 K3s curl -sfL https://get.k3s.io | sh - # 设置 kubeconfig @@ -35,7 +38,8 @@ jobs: sudo cp /etc/rancher/k3s/k3s.yaml $HOME/.kube/config sudo chown $USER:$USER $HOME/.kube/config # 安装 nerdctl - sudo curl -LO https://github.com/containerd/nerdctl/releases/download/v${NERDCTL_VERSION}/nerdctl-${NERDCTL_VERSION}-linux-amd64.tar.gz + sudo curl -LO https://github.com/containerd/nerdctl/releases/download/v${NERDCTL_VERSION}/\ + nerdctl-${NERDCTL_VERSION}-linux-amd64.tar.gz sudo tar -C /usr/local/bin -xzf nerdctl-${NERDCTL_VERSION}-linux-amd64.tar.gz sudo chmod +x /usr/local/bin/nerdctl @@ -47,10 +51,18 @@ jobs: sudo nerdctl --version sudo nerdctl --namespace k8s.io --address /run/k3s/containerd/containerd.sock ps + - name: Resolve latest k3s version + id: resolve + run: | + set -euo pipefail + bash scripts/resolve_k3s_versions.sh + - name: Run Offline Package Builder + env: + K3S_VERSION: ${{ steps.resolve.outputs.version }} run: | chmod +x scripts/make_k3s_offline_package.sh - ARCH=${{ matrix.arch }} ./scripts/make_k3s_offline_package.sh + ARCH=${{ matrix.arch }} VERSION=${K3S_VERSION} ./scripts/make_k3s_offline_package.sh - name: Compress Offline Installer run: | @@ -92,7 +104,7 @@ jobs: needs: test-k3s-installer runs-on: ubuntu-latest env: - tag_name: offline-k3s-${{ github.run_number }} + tag_name: offline-k3s-${{ needs.build-k3s-installer.outputs.k3s_version }} steps: - uses: actions/checkout@v4 @@ -129,3 +141,15 @@ jobs: release-artifacts/k3s-offline-package-arm64.tar.gz env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Prune old releases (keep last 3) + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + set -euo pipefail + releases=$(gh release list --limit 100 --json tagName,createdAt --jq 'sort_by(.createdAt) | reverse | .[3:] | .[].tagName') + if [[ -n "$releases" ]]; then + for tag in $releases; do + gh release delete "$tag" -y + done + fi diff --git a/scripts/resolve_k3s_versions.sh b/scripts/resolve_k3s_versions.sh new file mode 100755 index 0000000..1756384 --- /dev/null +++ b/scripts/resolve_k3s_versions.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash +# scripts/resolve_k3s_versions.sh +# 输出:写入 $GITHUB_OUTPUT -> version, recent_versions +# 环境变量: +# OVERRIDE_VERSION 可选,手工覆盖版本(如 v1.30.0+k3s1) + +set -euo pipefail + +OVERRIDE_VERSION="${OVERRIDE_VERSION:-}" + +API_URL="https://api.github.com/repos/k3s-io/k3s/releases?per_page=100" +COMMON_HEADERS=(-H "Accept: application/vnd.github+json" -H "User-Agent: resolve_k3s_versions") +if [[ -n "${GITHUB_TOKEN:-}" ]]; then + COMMON_HEADERS+=(-H "Authorization: Bearer ${GITHUB_TOKEN}") +fi + +resolve_latest() { + if [[ -n "${OVERRIDE_VERSION}" ]]; then + echo "${OVERRIDE_VERSION}" + return + fi + + curl -fsSL "${COMMON_HEADERS[@]}" "${API_URL}" \ + | jq -r '[.[] | select(.prerelease==false and .draft==false) | .tag_name] | sort -V | last' +} + +resolve_recent() { + curl -fsSL "${COMMON_HEADERS[@]}" "${API_URL}" \ + | jq -r '[.[] | select(.prerelease==false and .draft==false) | .tag_name] | sort -V | reverse | .[0:3] | @tsv' +} + +LATEST="$(resolve_latest)" +RECENT="$(resolve_recent)" + +{ + echo "version=${LATEST}" + echo "recent_versions=${RECENT}" +} >> "${GITHUB_OUTPUT}" + +echo "Resolved latest stable k3s version: ${LATEST}" +echo "Recent versions: ${RECENT}"