feat: add k3s offline package workflow

This commit is contained in:
shenlan 2025-09-13 16:12:01 +08:00
parent 7e2c8112c7
commit e7603bed4a
2 changed files with 70 additions and 5 deletions

View File

@ -4,7 +4,8 @@ on:
push: push:
paths: paths:
- 'scripts/make_k3s_offline_package.sh' - '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: workflow_dispatch:
jobs: jobs:
@ -13,6 +14,8 @@ jobs:
matrix: matrix:
arch: [amd64, arm64] arch: [amd64, arm64]
runs-on: ubuntu-latest runs-on: ubuntu-latest
outputs:
k3s_version: ${{ steps.resolve.outputs.version }}
steps: steps:
- name: Checkout Repo - name: Checkout Repo
@ -27,7 +30,7 @@ jobs:
- name: Install dependencies - name: Install dependencies
run: | run: |
export NERDCTL_VERSION=2.0.4 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 # 安装 K3s
curl -sfL https://get.k3s.io | sh - curl -sfL https://get.k3s.io | sh -
# 设置 kubeconfig # 设置 kubeconfig
@ -35,7 +38,8 @@ jobs:
sudo cp /etc/rancher/k3s/k3s.yaml $HOME/.kube/config sudo cp /etc/rancher/k3s/k3s.yaml $HOME/.kube/config
sudo chown $USER:$USER $HOME/.kube/config sudo chown $USER:$USER $HOME/.kube/config
# 安装 nerdctl # 安装 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 tar -C /usr/local/bin -xzf nerdctl-${NERDCTL_VERSION}-linux-amd64.tar.gz
sudo chmod +x /usr/local/bin/nerdctl sudo chmod +x /usr/local/bin/nerdctl
@ -47,10 +51,18 @@ jobs:
sudo nerdctl --version sudo nerdctl --version
sudo nerdctl --namespace k8s.io --address /run/k3s/containerd/containerd.sock ps 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 - name: Run Offline Package Builder
env:
K3S_VERSION: ${{ steps.resolve.outputs.version }}
run: | run: |
chmod +x scripts/make_k3s_offline_package.sh 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 - name: Compress Offline Installer
run: | run: |
@ -92,7 +104,7 @@ jobs:
needs: test-k3s-installer needs: test-k3s-installer
runs-on: ubuntu-latest runs-on: ubuntu-latest
env: env:
tag_name: offline-k3s-${{ github.run_number }} tag_name: offline-k3s-${{ needs.build-k3s-installer.outputs.k3s_version }}
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
@ -129,3 +141,15 @@ jobs:
release-artifacts/k3s-offline-package-arm64.tar.gz release-artifacts/k3s-offline-package-arm64.tar.gz
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 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

41
scripts/resolve_k3s_versions.sh Executable file
View File

@ -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}"