Check, Build & Publish WSL2 Image #62
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Check, Build & Publish WSL2 Image | |
on: | |
# Nightly check at 00:00 UTC | |
schedule: | |
- cron: '0 0 * * *' | |
# Manual “Run workflow” button | |
workflow_dispatch: | |
# When you click “Publish release” in the UI | |
release: | |
types: [published] | |
permissions: | |
contents: write # required for tag push & gh‑release | |
jobs: | |
# ------------------------------------------------------------ | |
# 1. Decide whether we need a new release tag | |
# (runs on schedule or workflow‑dispatch, never on release) | |
# ------------------------------------------------------------ | |
check-and-release: | |
if: github.event_name != 'release' | |
runs-on: ubuntu-latest | |
outputs: | |
NEED_RELEASE: ${{ steps.decide.outputs.NEED_RELEASE }} | |
NEW_TAG: ${{ steps.decide.outputs.NEW_TAG }} | |
steps: | |
- name: Checkout repository ⚡ | |
uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 # get full history | |
fetch-tags: true # still unreliable; we force‑fetch below | |
- name: Ensure ALL tags are present | |
run: git fetch --tags --prune --force | |
- name: Get latest Containerlab version | |
id: clab | |
shell: bash | |
run: | | |
set -euo pipefail | |
latest_url=$(curl -sLI -o /dev/null -w '%{url_effective}' \ | |
https://github.com/srl-labs/containerlab/releases/latest) | |
ver=${latest_url##*/} | |
echo "CONTAINERLAB_VER=${ver#v}" >> "$GITHUB_OUTPUT" | |
echo "Found Containerlab ${ver#v}" | |
- name: Get latest WSL image tag | |
id: current | |
shell: bash | |
run: | | |
set -euo pipefail | |
tag=$(git tag --list --sort=-v:refname | head -n1 || true) | |
echo "LATEST_TAG=$tag" >> "$GITHUB_OUTPUT" | |
if [[ -z "$tag" ]]; then | |
echo "CONTAINERLAB_CUR=none" >> "$GITHUB_OUTPUT" | |
echo "WSL_CUR=none" >> "$GITHUB_OUTPUT" | |
exit 0 | |
fi | |
echo "Latest tag is $tag" | |
echo "CONTAINERLAB_CUR=${tag%%-*}" >> "$GITHUB_OUTPUT" | |
echo "WSL_CUR=${tag#*-}" >> "$GITHUB_OUTPUT" | |
- name: Decide whether to cut a new tag | |
id: decide | |
shell: bash | |
run: | | |
set -euo pipefail | |
need_release="false" | |
new_clab="${{ steps.clab.outputs.CONTAINERLAB_VER }}" | |
cur_clab="${{ steps.current.outputs.CONTAINERLAB_CUR }}" | |
cur_wsl="${{ steps.current.outputs.WSL_CUR }}" | |
new_wsl="1.0" | |
bump_wsl () { | |
local major=${cur_wsl%%.*} | |
local minor=${cur_wsl#*.} | |
new_wsl="${major}.$((minor+1))" | |
} | |
if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then | |
need_release="true" | |
[[ "$cur_clab" == "$new_clab" && "$cur_wsl" != "none" ]] && bump_wsl | |
elif [[ "$cur_clab" == "none" ]]; then | |
need_release="true" | |
elif [[ "$cur_clab" != "$new_clab" ]]; then | |
need_release="true" | |
fi | |
echo "NEED_RELEASE=$need_release" >> "$GITHUB_OUTPUT" | |
if [[ "$need_release" == "true" ]]; then | |
new_tag="${new_clab}-${new_wsl}" | |
echo "NEW_TAG=$new_tag" >> "$GITHUB_OUTPUT" | |
echo "Releasing $new_tag" | |
else | |
echo "No release required" | |
fi | |
- name: Create Git tag | |
if: steps.decide.outputs.NEED_RELEASE == 'true' | |
run: | | |
git config --local user.email "[email protected]" | |
git config --local user.name "GitHub Actions" | |
git tag -a "${{ steps.decide.outputs.NEW_TAG }}" \ | |
-m "Release ${{ steps.decide.outputs.NEW_TAG }}" | |
git push origin "${{ steps.decide.outputs.NEW_TAG }}" | |
- name: Draft GitHub Release | |
if: steps.decide.outputs.NEED_RELEASE == 'true' | |
uses: softprops/action-gh-release@v1 | |
with: | |
tag_name: ${{ steps.decide.outputs.NEW_TAG }} | |
name: "Release ${{ steps.decide.outputs.NEW_TAG }}" | |
body: | | |
WSL2 image for Containerlab ${{ steps.clab.outputs.CONTAINERLAB_VER }} | |
${{ github.event_name == 'workflow_dispatch' && 'Manually triggered.' || 'Automated nightly release.' }} | |
draft: false | |
prerelease: false | |
# ------------------------------------------------------------ | |
# 2. Build & upload WSL image when we *have* a tag | |
# ------------------------------------------------------------ | |
build-and-publish: | |
needs: check-and-release | |
if: needs.check-and-release.outputs.NEED_RELEASE == 'true' || github.event_name == 'release' | |
runs-on: ubuntu-22.04 | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: docker/setup-buildx-action@v2 | |
- name: Build Docker image | |
run: docker build . -t clab-wsl-debian | |
- name: Export container filesystem ➜ .wsl | |
run: | | |
docker run -t --name wsl_export clab-wsl-debian ls / | |
docker export wsl_export -o clab.tar | |
docker rm wsl_export | |
mv clab.tar clab.wsl | |
- uses: actions/upload-artifact@v4 | |
with: | |
name: clab-wsl2 | |
path: clab.wsl | |
- name: Determine tag name | |
id: tag | |
run: | | |
if [[ "${{ github.event_name }}" == "release" ]]; then | |
echo "TAG=${GITHUB_REF##*/}" >> "$GITHUB_OUTPUT" | |
else | |
echo "TAG=${{ needs.check-and-release.outputs.NEW_TAG }}" >> "$GITHUB_OUTPUT" | |
fi | |
- name: Upload release asset | |
uses: svenstaro/upload-release-action@v2 | |
with: | |
repo_token: ${{ secrets.GITHUB_TOKEN }} | |
file: clab.wsl | |
asset_name: clab-${{ steps.tag.outputs.TAG }}.wsl | |
tag: ${{ steps.tag.outputs.TAG }} |