From 2afef42cdcb23f759a86c5d82e2c9522323662b3 Mon Sep 17 00:00:00 2001 From: Jonathan Miller <230051081+jmiller-moko@users.noreply.github.com> Date: Tue, 16 Dec 2025 18:08:57 -0600 Subject: [PATCH] Update build_zip.yml --- .github/workflows/build_zip.yml | 99 +++++++++++++++++++++++++++++---- 1 file changed, 89 insertions(+), 10 deletions(-) diff --git a/.github/workflows/build_zip.yml b/.github/workflows/build_zip.yml index 85a7b0b..ae04d6e 100644 --- a/.github/workflows/build_zip.yml +++ b/.github/workflows/build_zip.yml @@ -7,13 +7,14 @@ on: description: "Folder to zip (relative to repo root)" required: false default: "src" + version_suffix: + description: "Optional version suffix for filename (example 01.02.03)" + required: false + default: "" permissions: contents: read -actions: - contents: read - jobs: zip: name: Package folder as ZIP @@ -23,7 +24,28 @@ jobs: - name: Checkout repository uses: actions/checkout@v4 - - name: Validate target folder + - name: Verify tooling + shell: bash + run: | + set -euo pipefail + + if ! command -v zip >/dev/null 2>&1; then + echo "ERROR: zip is not installed on runner" >&2 + exit 1 + fi + + if ! command -v sha256sum >/dev/null 2>&1; then + echo "ERROR: sha256sum is not available on runner" >&2 + exit 1 + fi + + if command -v zipinfo >/dev/null 2>&1; then + echo "ZIPINFO_AVAILABLE=true" >> "$GITHUB_ENV" + else + echo "ZIPINFO_AVAILABLE=false" >> "$GITHUB_ENV" + fi + + - name: Validate inputs shell: bash run: | set -euo pipefail @@ -33,12 +55,28 @@ jobs: TARGET_FOLDER="src" fi + VERSION_SUFFIX="${{ github.event.inputs.version_suffix }}" + VERSION_SUFFIX="${VERSION_SUFFIX//[[:space:]]/}" + if [[ ! -d "$TARGET_FOLDER" ]]; then echo "ERROR: Folder does not exist: $TARGET_FOLDER" >&2 exit 1 fi + if [[ -n "$VERSION_SUFFIX" ]] && [[ ! "$VERSION_SUFFIX" =~ ^[0-9]{2}\.[0-9]{2}\.[0-9]{2}$ ]]; then + echo "ERROR: version_suffix must match NN.NN.NN (example 01.02.03)" >&2 + exit 1 + fi + echo "TARGET_FOLDER=$TARGET_FOLDER" >> "$GITHUB_ENV" + echo "VERSION_SUFFIX=$VERSION_SUFFIX" >> "$GITHUB_ENV" + + - name: Prepare dist folder + shell: bash + run: | + set -euo pipefail + rm -rf dist + mkdir -p dist - name: Create ZIP archive shell: bash @@ -47,19 +85,60 @@ jobs: REPO_NAME="${GITHUB_REPOSITORY##*/}" SAFE_FOLDER_NAME="$(echo "$TARGET_FOLDER" | tr '/' '-')" - ZIP_NAME="${REPO_NAME}-${SAFE_FOLDER_NAME}.zip" - rm -f "$ZIP_NAME" + if [[ -n "$VERSION_SUFFIX" ]]; then + ZIP_NAME="${REPO_NAME}-${SAFE_FOLDER_NAME}-${VERSION_SUFFIX}.zip" + else + ZIP_NAME="${REPO_NAME}-${SAFE_FOLDER_NAME}.zip" + fi + + ZIP_PATH="dist/$ZIP_NAME" cd "$TARGET_FOLDER" - zip -r "../$ZIP_NAME" . \ + + zip -r "../$ZIP_PATH" . \ -x "*.DS_Store" \ - -x "__MACOSX/*" + -x "__MACOSX/*" \ + -x "**/.git/**" \ + -x "**/.github/**" \ + -x "**/node_modules/**" \ + -x "**/coverage/**" \ + -x "**/*.log" \ + -x "**/*.tmp" echo "ZIP_NAME=$ZIP_NAME" >> "$GITHUB_ENV" + echo "ZIP_PATH=$ZIP_PATH" >> "$GITHUB_ENV" - - name: Upload ZIP artifact + - name: Generate manifest + shell: bash + run: | + set -euo pipefail + + MANIFEST_PATH="dist/${ZIP_NAME}.manifest.txt" + + if [[ "$ZIPINFO_AVAILABLE" == "true" ]]; then + zipinfo -1 "$ZIP_PATH" > "$MANIFEST_PATH" + else + unzip -Z1 "$ZIP_PATH" > "$MANIFEST_PATH" + fi + + echo "MANIFEST_PATH=$MANIFEST_PATH" >> "$GITHUB_ENV" + + - name: Generate SHA256 + shell: bash + run: | + set -euo pipefail + + SHA_PATH="dist/${ZIP_NAME}.sha256" + sha256sum "$ZIP_PATH" > "$SHA_PATH" + + echo "SHA_PATH=$SHA_PATH" >> "$GITHUB_ENV" + + - name: Upload build artifacts uses: actions/upload-artifact@v4 with: name: packaged-folder - path: ${{ env.ZIP_NAME }} + path: | + ${{ env.ZIP_PATH }} + ${{ env.MANIFEST_PATH }} + ${{ env.SHA_PATH }}