diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index a868e7841..341add1c0 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -1,97 +1,77 @@ ---- -# Continuous Delivery (Multi-Platform Docker Build) -# Purpose: Builds and pushes multi-platform Docker images for Alpine, Debian, and Rocky variants. -# Trigger: Pushes to core branches, release tags, daily schedule, and manual dispatch. -# Permissions: -# - contents: read (Required for repository checkout). -# - packages: write (Required for GHCR push). -# - id-token: write (Required for secure OIDC authentication). -# - security-events: write (Required for SARIF upload from Trivy scans). - -name: "๐Ÿณ Docker Multi-Platform Build" - -"on": +name: ๐Ÿณ Docker Multi-Platform Build +'on': push: branches: - - "dev" + - dev tags: - # Global semantic version tags - - "v*" # v1.2.3 - - "V*" # V1.2.3 - - "[0-9]*" # 1.2.3 - - "[0-9]+.[0-9]+" - - "v[0-9]+.[0-9]+" - - "V[0-9]+.[0-9]+" - - "alpine-*.*" - - "debian-*.*" - - "rocky-*.*" - - "[0-9]+" - - "v[0-9]+" - - "V[0-9]+" - - "alpine-*" - - "debian-*" - - "rocky-*" - + - v* + - V* + - '[0-9]*' + - '[0-9]+.[0-9]+' + - v[0-9]+.[0-9]+ + - V[0-9]+.[0-9]+ + - alpine-*.* + - debian-*.* + - rocky-*.* + - '[0-9]+' + - v[0-9]+ + - V[0-9]+ + - alpine-* + - debian-* + - rocky-* schedule: - # Automatically run every day at 17:00 UTC - - cron: "0 17 * * *" + - cron: 0 17 * * * workflow_dispatch: inputs: variant: - description: "Distribution variant to build" + description: Distribution variant to build required: false type: choice options: - - "all" - - "alpine" - - "debian" - - "rocky" - default: "all" + - all + - alpine + - debian + - rocky + default: all push_images: - description: "Push images to registries" + description: Push images to registries required: false type: boolean default: true - permissions: contents: read - jobs: buildx: - name: "๐Ÿš€ Build & Deliver (${{ matrix.variant }})" + name: ๐Ÿš€ Build & Deliver (${{ matrix.variant }}) runs-on: ubuntu-latest strategy: fail-fast: false matrix: include: - variant: alpine - # x-release-please-start-version - version: "0.1.1" - # x-release-please-end + version: 0.1.1 file: docker/alpine/Dockerfile - platforms: linux/386,linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64,linux/ppc64le,linux/riscv64,linux/s390x + platforms: >- + linux/386,linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64,linux/ppc64le,linux/riscv64,linux/s390x is_latest: false package_manager: apk - - variant: debian - # x-release-please-start-version - version: "0.1.1" - # x-release-please-end + version: 0.1.1 file: docker/debian/Dockerfile - platforms: linux/amd64,linux/arm/v7,linux/arm64,linux/riscv64,linux/ppc64le,linux/s390x + platforms: >- + linux/amd64,linux/arm/v7,linux/arm64,linux/riscv64,linux/ppc64le,linux/s390x is_latest: true package_manager: apt-get - - variant: rocky - # x-release-please-start-version - version: "0.1.1" - # x-release-please-end + version: 0.1.1 file: docker/rocky/Dockerfile platforms: linux/amd64,linux/arm64,linux/ppc64le,linux/s390x is_latest: false package_manager: dnf concurrency: - group: docker-${{ github.workflow }}-${{ github.event_name == 'schedule' && 'nightly' || github.ref }}-${{ matrix.variant }} + group: >- + docker-${{ github.workflow }}-${{ github.event_name == 'schedule' && + 'nightly' || github.ref }}-${{ matrix.variant }} cancel-in-progress: ${{ github.event_name != 'schedule' }} permissions: contents: read @@ -103,10 +83,11 @@ jobs: TRIVY_CACHE_DIR: .trivycache BUILD_START_TIME: ${{ github.event.repository.updated_at }} steps: - - name: "๐ŸŽฏ Check Variant Filter (workflow_dispatch)" + - name: ๐ŸŽฏ Check Variant Filter (workflow_dispatch) id: variant-filter - run: | + run: > # For workflow_dispatch, check if this matrix variant should run + if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then if [ "${{ inputs.variant }}" != "all" ] && [ "${{ inputs.variant }}" != "${{ matrix.variant }}" ]; then echo "skip=true" >> "$GITHUB_OUTPUT" @@ -115,21 +96,23 @@ jobs: fi fi - # For tag pushes and release events, all variants are built (Global versioning) + + # For tag pushes and release events, all variants are built (Global + versioning) + echo "skip=false" >> "$GITHUB_OUTPUT" - echo "โ†’ Building ${{ matrix.variant }} ${{ matrix.version }}" - - name: "โฑ๏ธ Record Build Start Time" + echo "โ†’ Building ${{ matrix.variant }} ${{ matrix.version }}" + - name: โฑ๏ธ Record Build Start Time if: steps.variant-filter.outputs.skip != 'true' id: start-time run: | echo "timestamp=$(date -u +%s)" >> "$GITHUB_OUTPUT" echo "datetime=$(date -u +%Y-%m-%dT%H:%M:%SZ)" >> "$GITHUB_OUTPUT" - - - name: "๐Ÿงน Optimize Runner Disk Space" + - name: ๐Ÿงน Optimize Runner Disk Space if: steps.variant-filter.outputs.skip != 'true' - uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be # v1.3.1 + uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be with: tool-cache: false android: true @@ -138,63 +121,55 @@ jobs: large-packages: true docker-images: false swap-storage: false - - - name: "๐Ÿ“‚ Checkout Repository Code" + - name: ๐Ÿ“‚ Checkout Repository Code if: steps.variant-filter.outputs.skip != 'true' - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 with: token: ${{ secrets.WORKFLOW_SECRET || secrets.GITHUB_TOKEN }} persist-credentials: false - - - name: "โšก Cache Trivy Database" + - name: โšก Cache Trivy Database if: steps.variant-filter.outputs.skip != 'true' - uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5 + uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae with: path: .trivycache key: ${{ runner.os }}-trivy-${{ github.run_id }} restore-keys: | ${{ runner.os }}-trivy- - - - name: "๐Ÿ—๏ธ Configure QEMU Emulation" + - name: ๐Ÿ—๏ธ Configure QEMU Emulation if: steps.variant-filter.outputs.skip != 'true' - uses: docker/setup-qemu-action@06116385d9baf250c9f4dcb4858b16962ea869c3 # v4.1.0 - - - name: "๐Ÿ› ๏ธ Configure Docker Buildx" + uses: docker/setup-qemu-action@06116385d9baf250c9f4dcb4858b16962ea869c3 + - name: ๐Ÿ› ๏ธ Configure Docker Buildx if: steps.variant-filter.outputs.skip != 'true' - uses: docker/setup-buildx-action@d7f5e7f509e45cec5c76c4d5afdd7de93d0b3df5 # v4.1.0 + uses: docker/setup-buildx-action@d7f5e7f509e45cec5c76c4d5afdd7de93d0b3df5 with: buildkitd-config: .github/buildkitd.toml - - - name: "๐Ÿ”‘ Initialize DockerHub Registry Session" + - name: ๐Ÿ”‘ Initialize DockerHub Registry Session if: steps.variant-filter.outputs.skip != 'true' id: login-dockerhub continue-on-error: true - uses: docker/login-action@650006c6eb7dba73a995cc03b0b2d7f5ca915bee # v4.2.0 + uses: docker/login-action@650006c6eb7dba73a995cc03b0b2d7f5ca915bee with: username: ${{ secrets.DOCKER_HUB_USERNAME }} password: ${{ secrets.DOCKER_HUB_TOKEN }} - - - name: "๐Ÿ”‘ Initialize Quay.io Registry Session" + - name: ๐Ÿ”‘ Initialize Quay.io Registry Session if: steps.variant-filter.outputs.skip != 'true' id: login-quay continue-on-error: true - uses: docker/login-action@650006c6eb7dba73a995cc03b0b2d7f5ca915bee # v4.2.0 + uses: docker/login-action@650006c6eb7dba73a995cc03b0b2d7f5ca915bee with: registry: quay.io username: ${{ secrets.QUAY_USERNAME }} password: ${{ secrets.QUAY_ROBOT_TOKEN }} - - - name: "๐Ÿ”‘ Initialize GitHub Container Registry Session" + - name: ๐Ÿ”‘ Initialize GitHub Container Registry Session if: steps.variant-filter.outputs.skip != 'true' id: login-ghcr continue-on-error: true - uses: docker/login-action@650006c6eb7dba73a995cc03b0b2d7f5ca915bee # v4.2.0 + uses: docker/login-action@650006c6eb7dba73a995cc03b0b2d7f5ca915bee with: registry: ghcr.io username: ${{ github.repository_owner }} password: ${{ secrets.GITHUB_TOKEN }} - - - name: "โš ๏ธ Check Registry Login Status" + - name: โš ๏ธ Check Registry Login Status if: steps.variant-filter.outputs.skip != 'true' run: | echo "โ†’ Registry login status:" @@ -208,11 +183,10 @@ jobs: echo "::error::All registry logins failed. Cannot proceed." exit 1 fi - - - name: "๐Ÿท๏ธ Generate Docker Metadata" + - name: ๐Ÿท๏ธ Generate Docker Metadata if: steps.variant-filter.outputs.skip != 'true' id: meta - uses: docker/metadata-action@80c7e94dd9b9319bd5eb7a0e0fe9291e23a2a2e9 # v6.1.0 + uses: docker/metadata-action@80c7e94dd9b9319bd5eb7a0e0fe9291e23a2a2e9 with: images: | name=ghcr.io/snowdreamtech/unistack,enable=true @@ -222,47 +196,97 @@ jobs: latest=false prefix= suffix= - tags: | + tags: > # Branch builds (non-tag pushes) - variant-suffixed branch tag - type=ref,enable=${{ github.event_name == 'push' && !startsWith(github.ref, 'refs/tags/') }},priority=600,prefix=,suffix=-${{ matrix.variant }},event=branch + + type=ref,enable=${{ github.event_name == 'push' && + !startsWith(github.ref, 'refs/tags/') + }},priority=600,prefix=,suffix=-${{ matrix.variant }},event=branch + # Main/master branch - variant-suffixed tag - type=raw,enable=${{ contains(fromJSON('["refs/heads/main", "refs/heads/master"]'), github.ref) && github.event_name != 'schedule' }},priority=200,prefix=,suffix=-${{ matrix.variant }},value=latest - # Main/master branch - global latest tag (only for is_latest variant, no suffix) - type=raw,enable=${{ matrix.is_latest && contains(fromJSON('["refs/heads/main", "refs/heads/master"]'), github.ref) && github.event_name != 'schedule' }},priority=200,prefix=,suffix=,value=latest + + type=raw,enable=${{ contains(fromJSON('["refs/heads/main", + "refs/heads/master"]'), github.ref) && github.event_name != + 'schedule' }},priority=200,prefix=,suffix=-${{ matrix.variant + }},value=latest + + # Main/master branch - global latest tag (only for is_latest + variant, no suffix) + + type=raw,enable=${{ matrix.is_latest && + contains(fromJSON('["refs/heads/main", "refs/heads/master"]'), + github.ref) && github.event_name != 'schedule' + }},priority=200,prefix=,suffix=,value=latest + # Tag builds - variant-suffixed tag - type=raw,enable=${{ startsWith(github.ref, 'refs/tags/') }},priority=200,prefix=,suffix=-${{ matrix.variant }},value=latest - # Tag builds - global latest tag (only for is_latest variant, no suffix) - type=raw,enable=${{ matrix.is_latest && startsWith(github.ref, 'refs/tags/') }},priority=200,prefix=,suffix=,value=latest + + type=raw,enable=${{ startsWith(github.ref, 'refs/tags/') + }},priority=200,prefix=,suffix=-${{ matrix.variant }},value=latest + + # Tag builds - global latest tag (only for is_latest variant, no + suffix) + + type=raw,enable=${{ matrix.is_latest && startsWith(github.ref, + 'refs/tags/') }},priority=200,prefix=,suffix=,value=latest + # Nightly builds - variant-suffixed - type=schedule,enable=true,priority=1000,prefix=,suffix=-${{ matrix.variant }},pattern=nightly - # Nightly builds - global nightly tag (only for is_latest variant, no suffix) - type=schedule,enable=${{ matrix.is_latest }},priority=1000,prefix=,suffix=,pattern=nightly + + type=schedule,enable=true,priority=1000,prefix=,suffix=-${{ + matrix.variant }},pattern=nightly + + # Nightly builds - global nightly tag (only for is_latest variant, + no suffix) + + type=schedule,enable=${{ matrix.is_latest + }},priority=1000,prefix=,suffix=,pattern=nightly + # Date-based tags for traceability (YYYYMMDD) - variant-suffixed - type=schedule,enable=true,priority=900,prefix=,suffix=-${{ matrix.variant }},pattern={{date 'YYYYMMDD'}} - # Date-based tags - global tag (only for is_latest variant, no suffix) - type=schedule,enable=${{ matrix.is_latest }},priority=900,prefix=,suffix=,pattern={{date 'YYYYMMDD'}} + + type=schedule,enable=true,priority=900,prefix=,suffix=-${{ + matrix.variant }},pattern={{date 'YYYYMMDD'}} + + # Date-based tags - global tag (only for is_latest variant, no + suffix) + + type=schedule,enable=${{ matrix.is_latest + }},priority=900,prefix=,suffix=,pattern={{date 'YYYYMMDD'}} + # Semantic version tags (vX.Y.Z) - variant-suffixed + type=semver,pattern={{version}},suffix=-${{ matrix.variant }} - # Semantic version tags (vX.Y.Z) - global tag (only for is_latest variant, no suffix) + + # Semantic version tags (vX.Y.Z) - global tag (only for is_latest + variant, no suffix) + type=semver,pattern={{version}},enable=${{ matrix.is_latest }} env: DOCKER_METADATA_ANNOTATIONS_LEVELS: manifest,index - - - name: "๐Ÿš€ Orchestrate Build & Delivery Suite" + - name: ๐Ÿš€ Orchestrate Build & Delivery Suite id: build if: steps.variant-filter.outputs.skip != 'true' - uses: docker/build-push-action@f9f3042f7e2789586610d6e8b85c8f03e5195baf # v7.2.0 + uses: docker/build-push-action@f9f3042f7e2789586610d6e8b85c8f03e5195baf with: context: . file: ${{ matrix.file }} - build-args: | - BUILDTIME=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.created'] }} + build-args: > + BUILDTIME=${{ + fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.created'] + }} + VERSION=${{ matrix.version }} - REVISION=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.revision'] }} + + REVISION=${{ + fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.revision'] + }} platforms: ${{ matrix.platforms }} provenance: true sbom: true - push: ${{ (github.event_name == 'workflow_dispatch' && inputs.push_images) || (github.event_name != 'workflow_dispatch' && (contains(fromJSON('["refs/heads/main", "refs/heads/dev"]'), github.ref) || startsWith(github.ref, 'refs/tags/') || github.event_name == 'schedule')) }} + push: >- + ${{ (github.event_name == 'workflow_dispatch' && inputs.push_images) + || (github.event_name != 'workflow_dispatch' && + (contains(fromJSON('["refs/heads/main", "refs/heads/dev"]'), + github.ref) || startsWith(github.ref, 'refs/tags/') || + github.event_name == 'schedule')) }} tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} annotations: ${{ steps.meta.outputs.annotations }} @@ -271,20 +295,26 @@ jobs: type=gha,scope=main-${{ matrix.variant }} type=gha,scope=dev-${{ matrix.variant }} cache-to: type=gha,mode=max,scope=${{ github.ref_name }}-${{ matrix.variant }} - - - name: "๐Ÿ“ˆ Analyze Build Cache Performance" + - name: ๐Ÿ“ˆ Analyze Build Cache Performance id: cache-stats if: steps.variant-filter.outputs.skip != 'true' && always() - run: | + run: > # Calculate build duration + start_time=${{ steps.start-time.outputs.timestamp }} + end_time=$(date -u +%s) + duration=$((end_time - start_time)) + echo "duration_seconds=${duration}" >> "$GITHUB_OUTPUT" + echo "duration_minutes=$((duration / 60))" >> "$GITHUB_OUTPUT" + # Estimate cache efficiency (based on build time) + if [ "${duration}" -lt 300 ]; then echo "cache_efficiency=High (< 5 min)" >> "$GITHUB_OUTPUT" elif [ "${duration}" -lt 600 ]; then @@ -293,24 +323,34 @@ jobs: echo "cache_efficiency=Low (> 10 min)" >> "$GITHUB_OUTPUT" fi - echo "โ†’ Build completed in ${duration} seconds ($((duration / 60)) minutes)" - - name: "๐Ÿ” Verify Docker Manifest (Multi-Platform)" + echo "โ†’ Build completed in ${duration} seconds ($((duration / 60)) + minutes)" + - name: ๐Ÿ” Verify Docker Manifest (Multi-Platform) id: manifest-check - if: steps.variant-filter.outputs.skip != 'true' && steps.build.conclusion == 'success' && steps.build.outputs.digest != '' + if: >- + steps.variant-filter.outputs.skip != 'true' && steps.build.conclusion + == 'success' && steps.build.outputs.digest != '' env: IMAGE_DIGEST: ${{ steps.build.outputs.digest }} - run: | + run: > # Use GHCR tag for inspection to avoid DockerHub rate limits - first_tag=$(echo "${{ steps.meta.outputs.tags }}" | grep '^ghcr.io/' | head -n 1) + + first_tag=$(echo "${{ steps.meta.outputs.tags }}" | grep '^ghcr.io/' | + head -n 1) + if [ -z "$first_tag" ]; then first_tag=$(echo "${{ steps.meta.outputs.tags }}" | head -n 1) fi + echo "โ†’ Inspecting manifest for: ${first_tag}" + # Inspect the manifest - if manifest=$(docker buildx imagetools inspect "${first_tag}" 2>&1); then + + if manifest=$(docker buildx imagetools inspect "${first_tag}" 2>&1); + then echo "${manifest}" # Count platforms @@ -344,9 +384,10 @@ jobs: echo "::error title=Manifest Inspection Failed::Could not inspect image manifest" echo "status=failed" >> "$GITHUB_OUTPUT" fi - - - name: "๐Ÿš€ Smoke Test (Verify Image Functionality)" - if: steps.variant-filter.outputs.skip != 'true' && steps.build.conclusion == 'success' + - name: ๐Ÿš€ Smoke Test (Verify Image Functionality) + if: >- + steps.variant-filter.outputs.skip != 'true' && steps.build.conclusion + == 'success' env: TAGS: ${{ steps.meta.outputs.tags }} PACKAGE_MANAGER: ${{ matrix.package_manager }} @@ -465,42 +506,51 @@ jobs: fi echo "โœ“ Registry verification completed" - - - name: "๐Ÿท๏ธ Determine Image for Trivy Scan" + - name: ๐Ÿท๏ธ Determine Image for Trivy Scan id: trivy-image - if: steps.variant-filter.outputs.skip != 'true' && steps.build.conclusion == 'success' - run: | + if: >- + steps.variant-filter.outputs.skip != 'true' && steps.build.conclusion + == 'success' + run: > # Use GHCR tag for Trivy scan to avoid Docker Hub rate limits + # Fallback to the first generated tag if GHCR is not found - SCAN_TAG=$(echo "${{ steps.meta.outputs.tags }}" | grep '^ghcr.io/' | head -n 1) + + SCAN_TAG=$(echo "${{ steps.meta.outputs.tags }}" | grep '^ghcr.io/' | + head -n 1) + if [ -z "${SCAN_TAG}" ]; then SCAN_TAG="${{ fromJSON(steps.meta.outputs.json).tags[0] }}" fi + echo "tag=${SCAN_TAG}" >> "$GITHUB_OUTPUT" - echo "โ†’ Scanning image: ${SCAN_TAG}" - - name: "๐Ÿ•ต๏ธ Scan Image for Vulnerabilities (Trivy)" + echo "โ†’ Scanning image: ${SCAN_TAG}" + - name: ๐Ÿ•ต๏ธ Scan Image for Vulnerabilities (Trivy) id: trivy - if: steps.variant-filter.outputs.skip != 'true' && steps.build.conclusion == 'success' + if: >- + steps.variant-filter.outputs.skip != 'true' && steps.build.conclusion + == 'success' continue-on-error: true - uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 # v0.36.0 + uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 env: - TRIVY_DB_REPOSITORY: "public.ecr.aws/aquasecurity/trivy-db" - TRIVY_CHECKS_BUNDLE_REPOSITORY: "public.ecr.aws/aquasecurity/trivy-checks" + TRIVY_DB_REPOSITORY: public.ecr.aws/aquasecurity/trivy-db + TRIVY_CHECKS_BUNDLE_REPOSITORY: public.ecr.aws/aquasecurity/trivy-checks with: - scan-type: "image" + scan-type: image image-ref: ${{ steps.trivy-image.outputs.tag }} - format: "sarif" - output: "trivy-image-${{ matrix.variant }}.sarif" - severity: "CRITICAL,HIGH,MEDIUM,LOW" + format: sarif + output: trivy-image-${{ matrix.variant }}.sarif + severity: CRITICAL,HIGH,MEDIUM,LOW ignore-unfixed: true - exit-code: "0" - skip-dirs: "/tmp,/var/tmp,/var/cache" - skip-files: "/usr/local/bin/docker-entrypoint.sh" - - - name: "๐Ÿ“Š Parse Trivy Results" + exit-code: '0' + skip-dirs: /tmp,/var/tmp,/var/cache + skip-files: /usr/local/bin/docker-entrypoint.sh + - name: ๐Ÿ“Š Parse Trivy Results id: trivy-summary - if: steps.variant-filter.outputs.skip != 'true' && steps.build.conclusion == 'success' && steps.trivy.outcome == 'success' + if: >- + steps.variant-filter.outputs.skip != 'true' && steps.build.conclusion + == 'success' && steps.trivy.outcome == 'success' continue-on-error: true run: | if [ -f "trivy-image-${{ matrix.variant }}.sarif" ]; then @@ -521,25 +571,27 @@ jobs: echo "medium=0" } >> "$GITHUB_OUTPUT" fi - - - name: "๐Ÿ“ค Upload Image Security Scan (SARIF)" - if: steps.variant-filter.outputs.skip != 'true' && steps.build.conclusion == 'success' && steps.trivy.outcome == 'success' + - name: ๐Ÿ“ค Upload Image Security Scan (SARIF) + if: >- + steps.variant-filter.outputs.skip != 'true' && steps.build.conclusion + == 'success' && steps.trivy.outcome == 'success' continue-on-error: true - uses: github/codeql-action/upload-sarif@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4.36.2 + uses: >- + github/codeql-action/upload-sarif@8aad20d150bbac5944a9f9d289da16a4b0d87c1e with: - sarif_file: "trivy-image-${{ matrix.variant }}.sarif" - category: "trivy-image-unistack-${{ matrix.variant }}" - - - name: "๐Ÿ—‘๏ธ Clean Up Build Artifacts" + sarif_file: trivy-image-${{ matrix.variant }}.sarif + category: trivy-image-unistack-${{ matrix.variant }} + - name: ๐Ÿ—‘๏ธ Clean Up Build Artifacts if: steps.variant-filter.outputs.skip != 'true' && always() run: | # Remove SARIF files to save space rm -f trivy-image-*.sarif echo "โœ“ Cleaned up build artifacts" - - - name: "โš ๏ธ Check Vulnerability Threshold" + - name: โš ๏ธ Check Vulnerability Threshold id: vuln-check - if: steps.variant-filter.outputs.skip != 'true' && steps.build.conclusion == 'success' + if: >- + steps.variant-filter.outputs.skip != 'true' && steps.build.conclusion + == 'success' run: | critical=${{ steps.trivy-summary.outputs.critical }} high=${{ steps.trivy-summary.outputs.high }} @@ -551,27 +603,34 @@ jobs: if [ "${high}" -gt 5 ]; then echo "::warning title=High Vulnerabilities Detected::Found ${high} high-severity vulnerabilities in ${{ matrix.variant }} ${{ matrix.version }} image" fi - - - name: "๐Ÿ” Install Cosign Tool" - if: steps.variant-filter.outputs.skip != 'true' && steps.build.conclusion == 'success' - uses: sigstore/cosign-installer@6f9f17788090df1f26f669e9d70d6ae9567deba6 # v4.1.2 - - - name: "๐Ÿ–Š๏ธ Sign the Docker Image" - if: steps.variant-filter.outputs.skip != 'true' && steps.build.conclusion == 'success' + - name: ๐Ÿ” Install Cosign Tool + if: >- + steps.variant-filter.outputs.skip != 'true' && steps.build.conclusion + == 'success' + uses: sigstore/cosign-installer@6f9f17788090df1f26f669e9d70d6ae9567deba6 + - name: ๐Ÿ–Š๏ธ Sign the Docker Image + if: >- + steps.variant-filter.outputs.skip != 'true' && steps.build.conclusion + == 'success' continue-on-error: true env: TAGS: ${{ steps.meta.outputs.tags }} COSIGN_YES: true BUILD_ID: ${{ github.run_id }}-${{ github.run_number }} COMMIT_SHA: ${{ github.sha }} - run: | + run: > echo "โ†’ Signing images with Cosign (keyless OIDC + metadata)" + # Track successful signatures + declare -a signed_tags=() + declare -a failed_tags=() + # Sign all images sequentially to better track failures + for tag in ${TAGS}; do echo " Signing: ${tag}" if cosign sign --yes \ @@ -589,14 +648,20 @@ jobs: fi done + echo "" + echo "โ†’ Signature Summary:" + echo " Successful: ${#signed_tags[@]}/${#TAGS[@]}" + if [ ${#failed_tags[@]} -gt 0 ]; then echo " Failed: ${failed_tags[*]}" fi + # Only verify successfully signed images + if [ ${#signed_tags[@]} -gt 0 ]; then echo "" echo "โ†’ Verifying signatures..." @@ -613,9 +678,10 @@ jobs: done fi - echo "โœ“ Signing process completed (${#signed_tags[@]} successful, ${#failed_tags[@]} failed)" - - name: "๐Ÿ“Š Generate Build Summary" + echo "โœ“ Signing process completed (${#signed_tags[@]} successful, + ${#failed_tags[@]} failed)" + - name: ๐Ÿ“Š Generate Build Summary if: steps.variant-filter.outputs.skip != 'true' && always() run: | { @@ -733,21 +799,26 @@ jobs: echo "- Registry authentication issues" fi } >> "$GITHUB_STEP_SUMMARY" - - - name: "โš ๏ธ Annotate Build Failure" + - name: โš ๏ธ Annotate Build Failure if: steps.variant-filter.outputs.skip != 'true' && failure() - run: | - echo "::error title=Docker Build Failed (${{ matrix.variant }} ${{ matrix.version }})::The multi-platform Docker build failed. Check the workflow logs for details." + run: > + echo "::error title=Docker Build Failed (${{ matrix.variant }} ${{ + matrix.version }})::The multi-platform Docker build failed. Check the + workflow logs for details." + # Detailed failure annotations + if [ "${{ steps.build.conclusion }}" = "failure" ]; then echo "::error title=Build Step Failed::Docker build process failed for ${{ matrix.variant }} ${{ matrix.version }}" fi + if [ "${{ steps.trivy.conclusion }}" = "failure" ]; then echo "::error title=Security Scan Failed::Trivy vulnerability scan failed for ${{ matrix.variant }} ${{ matrix.version }}" fi + if [ "${{ steps.login-dockerhub.outcome }}" != "success" ] && \ [ "${{ steps.login-quay.outcome }}" != "success" ] && \ [ "${{ steps.login-ghcr.outcome }}" != "success" ]; then diff --git a/CHANGELOG.md b/CHANGELOG.md index ab3f3989b..5fa8af09c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,477 @@ # Changelog +## [0.1.1](https://github.com/snowdreamtech/UniStack/compare/v0.1.1...v0.1.1) (2026-08-25) + + +### ๐Ÿš€ Features + +* add app_image variable to hello role defaults ([9fdad5a](https://github.com/snowdreamtech/UniStack/commit/9fdad5ab34cc9c28236f78d0a06db2e16af48c3c)) +* add distribution name lookup as fallback and update default service manager to systemd ([551b8e6](https://github.com/snowdreamtech/UniStack/commit/551b8e621127d0b30426ca84b66f221ffae31be5)) +* add fallback variables for sshd configuration settings in hardening template ([c290cc3](https://github.com/snowdreamtech/UniStack/commit/c290cc332a91ce37d3fb287355b8f3e66155f184)) +* add OpenBSD test script and conditionally disable unsupported sshd settings for OpenBSD hardening ([c69ba0a](https://github.com/snowdreamtech/UniStack/commit/c69ba0a5bb951b92921f9ffea94ef585b39e3cf4)) +* add package source support, update download URL structure, and implement automated hello app installation tasks ([bc43df5](https://github.com/snowdreamtech/UniStack/commit/bc43df559bb8aa9d50ad57a0625d01ecaee75e46)) +* **ansible/base:** add openSUSE/SLE package configuration ([570cdcc](https://github.com/snowdreamtech/UniStack/commit/570cdccc8c7d3a039e03d2e21e1a21506b7f652c)) +* **ansible/init:** port init role and aggressively de-native-ize ([01697d0](https://github.com/snowdreamtech/UniStack/commit/01697d085835b644a46d9b04747558e027109d9c)) +* **ansible:** create foundation scenario playbook ([70f516a](https://github.com/snowdreamtech/UniStack/commit/70f516adc3a81254391bbf497c1b11b55ca6ca22)) +* **ansible:** enforce 0600 on all SSH files for robust security ([1b92ccc](https://github.com/snowdreamtech/UniStack/commit/1b92ccc5da7b40624811afd07fed8e336c810241)) +* **ansible:** import and optimize context role from Uniloader ([2de07e3](https://github.com/snowdreamtech/UniStack/commit/2de07e3fdca554dd2b0e5b24f5a59388be97edd8)) +* **ansible:** scaffold L2 execution engines (core, native, container) ([9c7e128](https://github.com/snowdreamtech/UniStack/commit/9c7e12821a60bf1bce7233cdef10c119ac38d450)) +* **ansible:** scaffold L3 dispatcher and foundation app registry ([8a20cb0](https://github.com/snowdreamtech/UniStack/commit/8a20cb028d95caf9516448705a87e24e172d3b69)) +* **app_loader:** implement lifecycle hooks and migrate apps ([0b92044](https://github.com/snowdreamtech/UniStack/commit/0b920442b9c1dcac073382599519117137cf397e)) +* **apps:** add template and hello seed packages ([0b61c21](https://github.com/snowdreamtech/UniStack/commit/0b61c21560dc819dd49cf3b8dc3a01f80cd79768)) +* **app:** synchronize app_loader fallback matrix with os_loader for ultimate precision ([97d81d3](https://github.com/snowdreamtech/UniStack/commit/97d81d3836210aee993a6bc01c5e9f30c03fcbd5)) +* **base:** add Gentoo package configuration with fully-qualified names ([a69c915](https://github.com/snowdreamtech/UniStack/commit/a69c9158ce3c46b52ddc6f6d8aaec4cd3092a1c2)) +* **base:** add Mageia and NixOS package configurations ([f70ba5b](https://github.com/snowdreamtech/UniStack/commit/f70ba5bcc4b41504d302b5444186c20bcb243bac)) +* **base:** add NixOS package configuration ([d1c080d](https://github.com/snowdreamtech/UniStack/commit/d1c080d7a7e74134bb736fde148c3d87f102edfd)) +* **base:** add OpenWrt package configuration ([9b92e0c](https://github.com/snowdreamtech/UniStack/commit/9b92e0cae878b1ea6c584e9167c4d776428af0ca)) +* **base:** add Void Linux package configuration ([b6203de](https://github.com/snowdreamtech/UniStack/commit/b6203de9fdf5cdec9c22e49525ae68fd382ac6c5)) +* **ci:** add AlmaLinux to E2E matrix ([f6b04ee](https://github.com/snowdreamtech/UniStack/commit/f6b04ee045e761ff82dfe9953748bcdbe3ef2599)) +* **ci:** add AWS, Alibaba, Tencent and openEuler to E2E matrix ([2e0d285](https://github.com/snowdreamtech/UniStack/commit/2e0d28526d14513cc42344cb61145c7c1628e403)) +* **ci:** add Azure Linux and Anolis OS to E2E matrix ([0057c97](https://github.com/snowdreamtech/UniStack/commit/0057c97047abfb0b87675e5b70fb34d46cac7a0f)) +* **ci:** add freebsd, openbsd, netbsd e2e test matrix via vmactions ([01f4234](https://github.com/snowdreamtech/UniStack/commit/01f423481218d5c5f65e28fc0c754ef293b30d50)) +* **ci:** add macos e2e testing matrix ([bd295ed](https://github.com/snowdreamtech/UniStack/commit/bd295ed717bcd9515325285450f6d7477ad97a74)) +* **ci:** add oraclelinux:9 to E2E testing matrix ([ab8bc57](https://github.com/snowdreamtech/UniStack/commit/ab8bc572025ce5230d2e49d1acecd84428c7b6c5)) +* **ci:** add RHEL UBI9 and CentOS Stream 9 to E2E matrix ([78348e8](https://github.com/snowdreamtech/UniStack/commit/78348e85cabaafff32962023edaa69651ea9e451)) +* **ci:** add SUSE Linux Enterprise Server (SLES) to E2E matrix ([e855e2e](https://github.com/snowdreamtech/UniStack/commit/e855e2ea1facdaac747547d48d080dadbb04cb5b)) +* **cli:** add 'up' command to orchestrate scenario deployments ([8ae96d2](https://github.com/snowdreamtech/UniStack/commit/8ae96d226a66fac8b456bab8d5e7f8bbd83e1843)) +* **client:** implement registry update and download commands ([35dc492](https://github.com/snowdreamtech/UniStack/commit/35dc492c07afe10f04f01b13d56a337b04ac40c6)) +* **container:** port and decouple container engine from legacy ([d38b033](https://github.com/snowdreamtech/UniStack/commit/d38b0338367ed3014ea0fbd4ad243a6648f21d95)) +* **context:** exclude macOS homebrew from default become execution ([ba31b1a](https://github.com/snowdreamtech/UniStack/commit/ba31b1a45d3f87acf516940a4cc1bdf312775766)) +* **core:** add minor version precision to os_loader fallback matrix ([3dad1c3](https://github.com/snowdreamtech/UniStack/commit/3dad1c3fbe0a774c9464e5c66b204f83f631619d)) +* **core:** add runtime and sudo availability probes ([3350de6](https://github.com/snowdreamtech/UniStack/commit/3350de62a44698883159b716af4922efbb36eab8)) +* **core:** comprehensively enhance os_loader fallback matrix for ultimate flexibility ([1699daf](https://github.com/snowdreamtech/UniStack/commit/1699daf696671a72cfdae4df2456105e108a8544)) +* define registry data structures and document multi-registry security architecture ([af4f2b8](https://github.com/snowdreamtech/UniStack/commit/af4f2b8ae52594768044596b0a5e4b1305a2d625)) +* enable OpenSSH installation for BSD-based systems by updating exclusion lists and package definitions ([5c227fd](https://github.com/snowdreamtech/UniStack/commit/5c227fdd49b3dc2aa21b471bdb727129fd0ede39)) +* enable remote.SSH.allowLocalServerDownload to improve connection reliability ([8a6c80d](https://github.com/snowdreamtech/UniStack/commit/8a6c80dd26e92e1a2d37be50a2ca5ca5113f08d8)) +* expand Python discovery candidates and make postflight health check optional ([4d24a22](https://github.com/snowdreamtech/UniStack/commit/4d24a22750a8c63ba48f3d471bf2e2d1edef2541)) +* handle Alibaba Cloud Linux VPC mirror fallback automatically in repositories role ([dde64be](https://github.com/snowdreamtech/UniStack/commit/dde64be527edbd0ec35b018a219ad1e6eefd5cfd)) +* implement ansible execution hook and complete tasks ([8985ca0](https://github.com/snowdreamtech/UniStack/commit/8985ca0eb292210d9d9afd100deb9c3c7effd6e1)) +* implement automatic offline fallback for ansible collection installation via source build ([5eb2ef7](https://github.com/snowdreamtech/UniStack/commit/5eb2ef74ac26d9f519bb14264266e03584dfcc1f)) +* **init:** port robust ssh key management logic from legacy ([a7e270d](https://github.com/snowdreamtech/UniStack/commit/a7e270db2883a06226209c9fe07e8ed5b127f19d)) +* **init:** port robust sshd container management from legacy project ([6f0f118](https://github.com/snowdreamtech/UniStack/commit/6f0f1180695eb8e52a6fd0b61ef4a50464d16f46)) +* **install:** implement local and remote package installation ([0f4e87e](https://github.com/snowdreamtech/UniStack/commit/0f4e87e0f11f13add6c4539cc3493b8ec8c19054)) +* introduce default variables for identity and openssh configuration to improve consistency ([89751ea](https://github.com/snowdreamtech/UniStack/commit/89751ea9a37b146656e9c1626a2704011b1cbd7e)) +* **lifecycle:** implement list, uninstall, and upgrade commands ([789e619](https://github.com/snowdreamtech/UniStack/commit/789e619ea13354a933a6cb4c35c42a4ef108cb42)) +* **npm:** add BSD platform support (FreeBSD, OpenBSD, NetBSD) ([d50e968](https://github.com/snowdreamtech/UniStack/commit/d50e96836914373ff62aaa15531d5f7c2c416b57)) +* **orchestrator:** add scenario parser and core types ([8d4fe19](https://github.com/snowdreamtech/UniStack/commit/8d4fe198a6dfe193187571959aaa68c0c43554fc)) +* **orchestrator:** add sysinfo implementation for bsd platforms ([0e3f952](https://github.com/snowdreamtech/UniStack/commit/0e3f9528d9989be7b2266cedf5b1d3d7bc7da0ef)) +* **os:** add variable mappings for all supported package managers ([2d72d39](https://github.com/snowdreamtech/UniStack/commit/2d72d39a0125a85b730a0da1b1f1cb43801fffff)) +* port base role from Uniloader with zero external dependencies ([16f383e](https://github.com/snowdreamtech/UniStack/commit/16f383e2e5ec7fe96b15ba982b92b98d6f20f0d9)) +* **pypi:** implement multi-architecture python wheel packaging ([59c1e4a](https://github.com/snowdreamtech/UniStack/commit/59c1e4ad485621910a820b892f638250d35ee17a)) +* **registry:** implement pure Go registry builder with SQLite and zstd compression ([030b2b0](https://github.com/snowdreamtech/UniStack/commit/030b2b05e1cd229a1603e72afe581b5f9960c02d)) +* **registry:** optimize builder performance and add environments to compatibility ([13ba4d3](https://github.com/snowdreamtech/UniStack/commit/13ba4d3bf117f95d744acc7b01d16cc456881352)) +* **release:** configure extra-files to auto-update docker.yml version ([585003e](https://github.com/snowdreamtech/UniStack/commit/585003e8f06b5d31a50c42733162ce1437f06e76)) +* **release:** configure extra-files to auto-update docker.yml version ([d928b68](https://github.com/snowdreamtech/UniStack/commit/d928b68b2108c5a1628f2cea88710358a3ff1b8e)) +* replace example stack configuration with new test-hello playbook ([6e2d04f](https://github.com/snowdreamtech/UniStack/commit/6e2d04f3f77092fc5cf718907d1bb274b12ed28f)) +* **runner:** implement engine runner interface and ansible wrapper ([1452d12](https://github.com/snowdreamtech/UniStack/commit/1452d121de92b31e37672a3b55045b2dd6f9d788)) +* skip OpenRC service management tasks if init system is not running ([2a6f44d](https://github.com/snowdreamtech/UniStack/commit/2a6f44d6d8519289dd1406d17817df7e4cb11ddd)) +* **source:** auto-sync database on source add and update ([ea245d1](https://github.com/snowdreamtech/UniStack/commit/ea245d1b64c4d9f72a4089df9ed34832b4505268)) +* **source:** implement multi-source registry CRUD and query logic ([7a32bb7](https://github.com/snowdreamtech/UniStack/commit/7a32bb719e4a47090f657773fa0626c78e3cf999)) +* **source:** intelligent local path support (file:// scheme translation) ([57436ef](https://github.com/snowdreamtech/UniStack/commit/57436ef246aea8a1340e65c6e0ef7fe08157470f)) +* **source:** update default sources to core and community ([73fbaa2](https://github.com/snowdreamtech/UniStack/commit/73fbaa2efdf577f8e35658ef7f0159c08a3ad0b3)) +* **speckit:** implementation progress ([bee80c4](https://github.com/snowdreamtech/UniStack/commit/bee80c4f3730de8fc4463a0bb06e54139fd8849c)) +* **speckit:** implementation progress ([32a3ff8](https://github.com/snowdreamtech/UniStack/commit/32a3ff83d98788138fdec1f99b2a64e50ca50482)) +* **speckit:** implementation progress ([00d25d4](https://github.com/snowdreamtech/UniStack/commit/00d25d4e7bec2039a0a28771e9a592f7e0ee1eee)) +* **speckit:** implementation progress ([5e4cc34](https://github.com/snowdreamtech/UniStack/commit/5e4cc349bde92adf8ca99ef380dd26dbf05e387d)) +* **speckit:** implementation progress ([81ecdad](https://github.com/snowdreamtech/UniStack/commit/81ecdad641926798053929da12ebe214a022ada6)) +* **speckit:** implementation progress ([7a42d47](https://github.com/snowdreamtech/UniStack/commit/7a42d4746cff0401ceb1de34dad4bdb74ff5842d)) +* **speckit:** implementation progress ([cc63cda](https://github.com/snowdreamtech/UniStack/commit/cc63cda70afd27623914fa1d46fdf954747e79e8)) +* **speckit:** implementation progress ([7f73d04](https://github.com/snowdreamtech/UniStack/commit/7f73d04c19f2ada85f8f9f66cdf4045b55c190c4)) +* **speckit:** implementation progress ([656a1c2](https://github.com/snowdreamtech/UniStack/commit/656a1c2848d6c5457007eeb60f3751f55a701d11)) +* **speckit:** implementation progress ([17ffcff](https://github.com/snowdreamtech/UniStack/commit/17ffcffd384f94d482deb610a77ad682596637ad)) +* **speckit:** implementation progress ([6b371e4](https://github.com/snowdreamtech/UniStack/commit/6b371e4b21fc2d081e41d2a5d6b3f177dee1d4f2)) +* suppress deprecation and resource warnings in environment configuration ([7b552ef](https://github.com/snowdreamtech/UniStack/commit/7b552ef35471bb4c1b3cc4b59d19735e45d33bbd)) +* update OpenSSH package definitions and configure sshd_config.d support for BSD systems ([971c311](https://github.com/snowdreamtech/UniStack/commit/971c311dae63c4da3cda147ccf90283561e91f74)) +* update vscode settings with enhanced editor, explorer, and terminal configurations ([44230bc](https://github.com/snowdreamtech/UniStack/commit/44230bceaf3deebc247739e9f91c55a1d2721803)) +* **update:** add --name flag to update specific configured source ([9f22b45](https://github.com/snowdreamtech/UniStack/commit/9f22b4552d29ba4850ea3164c46d9930b3138061)) + + +### ๐Ÿ› Bug Fixes + +* adjust environment installer tasks and remove unsupported Clearlinux CI/CD targets ([8b421b6](https://github.com/snowdreamtech/UniStack/commit/8b421b689cda511f6ecc054dad204c2a5b166e72)) +* allow openssh package installation on BSD systems and clear default package list for OpenBSD ([bab9e3d](https://github.com/snowdreamtech/UniStack/commit/bab9e3d668402c654fec50b2ebb824adec372547)) +* **ansible/context:** correct native fact references and remove redundant path compute ([70804bf](https://github.com/snowdreamtech/UniStack/commit/70804bfeb3cbc0a5e181326eab50b7b8c81f34dd)) +* **ansible/init:** add missing yum_repos.d templates and fix gitignore ([ea9fbc2](https://github.com/snowdreamtech/UniStack/commit/ea9fbc202b5484f7dcc56fc1007fb55e7bf27dba)) +* **ansible/init:** correctly apply SSH strict mode permissions to CI runner user ([68a5024](https://github.com/snowdreamtech/UniStack/commit/68a502422a07f112e6754b792325d8910c04356d)) +* **ansible/init:** enhance robustness of init execution ([7742d66](https://github.com/snowdreamtech/UniStack/commit/7742d6610afe08c18625d462100a02674706e64e)) +* **ansible/init:** improve SSH restart handler and CI diagnostics ([cae6fd6](https://github.com/snowdreamtech/UniStack/commit/cae6fd6e08912b733280de30d4a5494273b06bcf)) +* **ansible/init:** repair mirror templates relying on deleted variables ([1687c1b](https://github.com/snowdreamtech/UniStack/commit/1687c1b994189918e99bc240f3ffb513bf90d222)) +* **ansible/init:** resolve SSH permission failures in cross-platform BSD runners ([49913af](https://github.com/snowdreamtech/UniStack/commit/49913af1778caa66b3893832b049c3d111d164fd)) +* **ansible/init:** safely handle undefined sshd variable in hardening template ([f0dc250](https://github.com/snowdreamtech/UniStack/commit/f0dc25036c5e586e02b8848f91ee2ead9624c2c0)) +* **ansible/init:** skip openssh service management in docker containers ([9b95ed7](https://github.com/snowdreamtech/UniStack/commit/9b95ed716650a1ddaea2fffd5ecf2d00888c9da0)) +* **ansible/init:** suppress changed status for ssh permission task to fix idempotency ([f16ad09](https://github.com/snowdreamtech/UniStack/commit/f16ad096fac2c549d9ca56a1ea27bdb48585ef6d)) +* **ansible/init:** update freebsd openssh package name ([a72f38b](https://github.com/snowdreamtech/UniStack/commit/a72f38b21084d5cce7943a7d1ca91a70a5c64b3d)) +* **ansible/native:** fix tdnf idempotency check on azure linux ([bd76f85](https://github.com/snowdreamtech/UniStack/commit/bd76f85b34ebf8a4591468b8809593be6e923d68)) +* **ansible/playbooks:** add bootstrap phase to init playbook ([99e34e2](https://github.com/snowdreamtech/UniStack/commit/99e34e2bdb8d184e966ee04503d0e24c4e8c1503)) +* **ansible:** add loop_control/loop_var to all loops to prevent item collision warnings ([09ea8d6](https://github.com/snowdreamtech/UniStack/commit/09ea8d670b6785af97248919fdcaf556700b0e32)) +* **ansible:** allow sudo usage for non-root users inside containers ([deaacc1](https://github.com/snowdreamtech/UniStack/commit/deaacc1d8159d4f678994a5dad8de11b52643dcb)) +* **ansible:** bypass urpmi list concatenation bug in variables ([614cbed](https://github.com/snowdreamtech/UniStack/commit/614cbed3f98ef67b354fdea86a0a229ac574c9ef)) +* **ansible:** change become_enabled default to false in scenarios to allow context smart detection ([50e1021](https://github.com/snowdreamtech/UniStack/commit/50e102175d293f12f6160f4996fe16edeacabaf9)) +* **ansible:** comment out shellcheck from openSUSE base packages ([9eee1f3](https://github.com/snowdreamtech/UniStack/commit/9eee1f38fc2cc37d9bafe8c9700f829d83e543da)) +* **ansible:** enforce secure permissions on ssh keys to fix FreeBSD CI ([ed96558](https://github.com/snowdreamtech/UniStack/commit/ed9655897ecb37dbd7cd5fdc32fc6cd82dadfc24)) +* **ansible:** ensure standard unix paths are in user module PATH ([905da21](https://github.com/snowdreamtech/UniStack/commit/905da21211eeeb4c8d246a38cef11583d6d5664d)) +* **ansible:** fix /etc/os-release regex for single quotes causing gentoo detection failure and map macOS shell to zsh ([1b457e8](https://github.com/snowdreamtech/UniStack/commit/1b457e8c882a09d3accee73b8a8aaf6015f0a901)) +* **ansible:** fix gentoo and nixos init failures ([c8bb6c8](https://github.com/snowdreamtech/UniStack/commit/c8bb6c83a6c10ae4a0b66fefba53ddbdd5dee3d1)) +* **ansible:** fix gentoo vars lookup and nixos useradd passwd dependency ([6582609](https://github.com/snowdreamtech/UniStack/commit/65826095e25020ecbb922f9ee6fa649dbc149fa2)) +* **ansible:** fix Jinja2 regex_search crash when /etc/os-release is missing or lacks ID ([18640fb](https://github.com/snowdreamtech/UniStack/commit/18640fb8def880a1607dbca68d018a7965775659)) +* **ansible:** fix void/openwrt/nixos/gentoo edge cases ([10d0efa](https://github.com/snowdreamtech/UniStack/commit/10d0efac04acc26239121ab0cdccff21d23f2fc4)) +* **ansible:** gracefully skip imperative user and sudoers configurations on NixOS ([e7ccf28](https://github.com/snowdreamtech/UniStack/commit/e7ccf280e33843db5b0d1228b0d855f073457caf)) +* **ansible:** handle azurelinux package manager detection gracefully without ugly core defaults ([127b0bf](https://github.com/snowdreamtech/UniStack/commit/127b0bf6ecb7d09c22b09e8345986be2e5e475b6)) +* **ansible:** install full shadow suite on openwrt for user module idempotency ([c25d323](https://github.com/snowdreamtech/UniStack/commit/c25d32384d7a631aad7b68874cab835d9ecfa604)) +* **ansible:** parse definitive os_release_id from /etc/os-release to fix skipped OS vars ([27ba4c6](https://github.com/snowdreamtech/UniStack/commit/27ba4c6d07635b9c4884b0d3cbaf32a5d0d7ce3f)) +* **ansible:** remove duplicate YAML document separator in foundation defaults ([2978cfc](https://github.com/snowdreamtech/UniStack/commit/2978cfc19bd9870c3455e3f659327d703e584366)) +* **ansible:** remove forced first-run cache update across all package managers ([43df596](https://github.com/snowdreamtech/UniStack/commit/43df596699666dc27d5950fc0ea9b3638a49d92c)) +* **ansible:** resolve become_enabled boolean casting in CI environments ([03367cf](https://github.com/snowdreamtech/UniStack/commit/03367cfbb9bae9ef0a776245663f067d4bde950e)) +* **ansible:** resolve multiple e2e failures across os variants ([2ecdbbc](https://github.com/snowdreamtech/UniStack/commit/2ecdbbc66c27712163ac93d8d54fdc1112870d9c)) +* **ansible:** resolve nixos useradd failure by seeding passwd files and identifying nix container without os-release ([54bec89](https://github.com/snowdreamtech/UniStack/commit/54bec8916ff4286469fadc4a6a72b1142014bb4d)) +* **ansible:** resolve openssh keygen race condition and idempotency failure by utilizing ssh-keygen -A ([af2f63e](https://github.com/snowdreamtech/UniStack/commit/af2f63e6b386c9f66e18cf4b866a914564c7fcec)) +* **ansible:** resolve with_first_found dict parsing error by using default fallback file ([084a913](https://github.com/snowdreamtech/UniStack/commit/084a9134bd404d42d5e77378e594ba8e5cf260f7)) +* **ansible:** revert variable name back to _init_user_shell ([a1fec58](https://github.com/snowdreamtech/UniStack/commit/a1fec58fe06ed40ae5ef5d01659d63e3d7f25413)) +* **ansible:** unlink NixOS symlinks for passwd files to fix useradd ([7d39072](https://github.com/snowdreamtech/UniStack/commit/7d39072c699cce62bac7fc32419880e3e04e4bd3)) +* **ansible:** use absolute path for find module to fix freebsd ssh permissions ([cddc94e](https://github.com/snowdreamtech/UniStack/commit/cddc94eb627b9adf9c7ce04c2d2957f98592a64c)) +* **ansible:** use correct api schema variables in foundation scenario ([9b6f890](https://github.com/snowdreamtech/UniStack/commit/9b6f8903485880838855a2c9af5c331a2e193153)) +* **app:** correct context inclusion guard to prevent redundant setup runs ([06f6f43](https://github.com/snowdreamtech/UniStack/commit/06f6f43556f2b7df4464a352ef87e99e998f80e9)) +* **apps/openssh:** fix variable names and formats ([32dad5a](https://github.com/snowdreamtech/UniStack/commit/32dad5a4fa7dd18eeac71e77e596ed1cb4010bfc)) +* **apps:** remove orphaned list items from foundation vars and add yaml doc headers ([c1f5ab4](https://github.com/snowdreamtech/UniStack/commit/c1f5ab46c10ed73d99bf00cf9644bfec3db84a4f)) +* **base:** add vars/ prefix to include_vars paths to avoid loading tasks files as vars ([4527f47](https://github.com/snowdreamtech/UniStack/commit/4527f470e2efe517e72a6ba298a656035e2ae26b)) +* **base:** install python3-dnf on Photon before using package module ([1287d28](https://github.com/snowdreamtech/UniStack/commit/1287d2850b4e841e2a86b2746a7b4462e8d120d5)) +* **base:** install python3-dnf to both system and venv for Photon compatibility ([54ad81f](https://github.com/snowdreamtech/UniStack/commit/54ad81f2a6ad9d935b73daf4ed9b5fb4756e4434)) +* **base:** reduce Gentoo package list to guaranteed available packages only (remove non-existent packages like sys-apps/psmisc) ([781512b](https://github.com/snowdreamtech/UniStack/commit/781512b34dc99ba64eb9f742c2aa3493556d47f2)) +* **base:** reduce openSUSE packages to guaranteed available set (no parallel, libcap, pinentry-curses) ([b3d6548](https://github.com/snowdreamtech/UniStack/commit/b3d6548bc4fa151b78510f88393aa656a5d94001)) +* **base:** reduce OpenWrt package list to guaranteed available packages only ([0b01ed2](https://github.com/snowdreamtech/UniStack/commit/0b01ed284f2060011060d7c07f08094e487943f8)) +* **base:** reduce Void Linux package list to essential packages only (many packages unavailable in xbps) ([317ebde](https://github.com/snowdreamtech/UniStack/commit/317ebde86d7e20e432eb5ead498728bce91ec3b2)) +* **base:** remove pinentry-tty and pinentry-curses on macOS (Homebrew only has pinentry-mac) ([9a639f8](https://github.com/snowdreamtech/UniStack/commit/9a639f87bd7820651208f7a6bd99ea423bfc5181)) +* **base:** use gpatch for both Homebrew and MacPorts on macOS ([446f46d](https://github.com/snowdreamtech/UniStack/commit/446f46dd9d9b9d37b6edab9bce7c82e6e7155fa9)) +* **base:** use lowercase shellcheck for Void Linux package name ([a3cb6e3](https://github.com/snowdreamtech/UniStack/commit/a3cb6e32a91f251b37614ee20d7b64c565cf08f5)) +* **bootstrap:** add pkgin support for NetBSD python initialization ([ebe8ff2](https://github.com/snowdreamtech/UniStack/commit/ebe8ff2d5c1bd507fe116bd56a8a5fe763d48631)) +* **bootstrap:** install python3-libdnf5 and python3-dnf to satisfy Ansible DNF module in venvs ([03b3d37](https://github.com/snowdreamtech/UniStack/commit/03b3d37d0bb1149d27af4d1c58354ee6e67d3e42)) +* **bootstrap:** remove aggressive pip timeout to prevent CI OOM/SIGKILL ([f586581](https://github.com/snowdreamtech/UniStack/commit/f586581855cd9960924d3c29421131178104b4e0)) +* **bootstrap:** skip sudo elevation on macOS to support homebrew ([1a3857a](https://github.com/snowdreamtech/UniStack/commit/1a3857aea5fe6c25bd8e815919186e826f8e468e)) +* **bsd:** update netbsd sysinfo structs and resolve wheel group lookup ([fe8652c](https://github.com/snowdreamtech/UniStack/commit/fe8652c4789bc099ce8a208b61a877ca5c90a3c2)) +* **ci:** bypass unirtm and install ansible directly via native package managers for BSD E2E tests ([ddb574b](https://github.com/snowdreamtech/UniStack/commit/ddb574b8255030b4afdf65ca1df2ad7311ccdb43)) +* **ci:** create dummy vault_pass for ansible and fix freebsd ansible package ([5f936e1](https://github.com/snowdreamtech/UniStack/commit/5f936e1e60f33e9ce755366146df86ca33eff3a2)) +* **ci:** install ansible on macos e2e runner ([a9793e3](https://github.com/snowdreamtech/UniStack/commit/a9793e38499f9c75de90f783639dcf5450dc7411)) +* **ci:** pin cross-platform-actions to sha and add bsd tests to ci.yml ([111a0dc](https://github.com/snowdreamtech/UniStack/commit/111a0dc0564de7b0007cef92049e6937c31b22b3)) +* **CI:** resolve foundation package and OS dependencies across multiple distributions ([d927d51](https://github.com/snowdreamtech/UniStack/commit/d927d51eab24b059923b0340e6d5d4cf5611da30)) +* **ci:** specify explicit OS versions for cross-platform-actions instead of latest ([359b434](https://github.com/snowdreamtech/UniStack/commit/359b4340b48124d596645d6b3bd029ed3bc8a0bd)) +* **ci:** update cross-platform-actions to v1.3.0 and add sudo for pkg bootstrap ([839885e](https://github.com/snowdreamtech/UniStack/commit/839885e61a43627db180832c8383433b62f79650)) +* clear default darwin ssh service name and update service lookup logic ([f8e5ec9](https://github.com/snowdreamtech/UniStack/commit/f8e5ec9fdce761b52cd3484429c31ca86f69771c)) +* comment out vault_password_file in ansible.cfg to resolve E2E tests ([a2f5660](https://github.com/snowdreamtech/UniStack/commit/a2f5660dffebf150c050ac2b95c5bc7ce1fd1529)) +* **context:** check /etc/os-release existence before reading (handles NixOS minimal containers) ([b81427c](https://github.com/snowdreamtech/UniStack/commit/b81427c02209d8f7af21e58a8ef6f2dd9f9cfe96)) +* **core:** migrate from os_distribution to os_distribution_id to prevent path spacing issues ([27af384](https://github.com/snowdreamtech/UniStack/commit/27af3843942ea3ebc05db556ba8b381b24156406)) +* **core:** resolve native loader pathing, container service startups and package dependencies ([bd6fa7e](https://github.com/snowdreamtech/UniStack/commit/bd6fa7e5e37b8b7cb8d06129c1342f20e2717875)) +* correct detection logic for NixOS, OpenWrt idempotency, and Void Linux xbps update ([c351bb0](https://github.com/snowdreamtech/UniStack/commit/c351bb043e639210eb42285fab28a13ae6b09753)) +* correct indentation in user setup tasks for consistent yaml formatting ([de7a526](https://github.com/snowdreamtech/UniStack/commit/de7a526379a9537d23066d072a44fcbe864861e2)) +* **deps:** replace ansible-core with full ansible package ([46f3172](https://github.com/snowdreamtech/UniStack/commit/46f3172b087ee73192019a2e053f62aea4309985)) +* **docs:** resolve npm vulnerabilities by pinning exact dependency versions ([d628640](https://github.com/snowdreamtech/UniStack/commit/d6286404ea025ee0cad3123b5b0b3bc6bd21a551)) +* downgrade missing systemctl failure to a warning and gate service checks by systemctl availability ([5601464](https://github.com/snowdreamtech/UniStack/commit/56014646897ce73210e50ff1983d113ab4410b3a)) +* **e2e:** fix bsd ansible working directory for correct roles_path resolution ([d5a6c4d](https://github.com/snowdreamtech/UniStack/commit/d5a6c4d2bf3025b6b337666b599d8f3d8675659a)) +* **e2e:** prevent sshd handler execution in containers ([403fbfa](https://github.com/snowdreamtech/UniStack/commit/403fbfa2e120b3e7e64ff13fa49f12a3967e68c3)) +* **e2e:** resolve multiple platform-specific bootstrap errors ([53c064d](https://github.com/snowdreamtech/UniStack/commit/53c064dc1b241931fede68c5b87b7acfef053238)) +* **e2e:** resolve multiple platform-specific CI failures ([52c8560](https://github.com/snowdreamtech/UniStack/commit/52c8560d929a112fab65c7540e09ca6684984b07)) +* **e2e:** workaround mageia urpmi bug and fix bsd ansible config ([5821460](https://github.com/snowdreamtech/UniStack/commit/582146024368ff86d67c80f450d124eb7cf6f309)) +* fallback os_distribution_id to lowercase distribution when _os_release_id is missing ([e1d21f2](https://github.com/snowdreamtech/UniStack/commit/e1d21f246288865aa59faf9bed6bcb055361a13f)) +* **foundation:** refactor openssh handler, fix template paths and os_loader contexts ([3bc8903](https://github.com/snowdreamtech/UniStack/commit/3bc8903ba8191a49ed4f894d94b3d8b0233eb69e)) +* **foundation:** restore correct execution order for sudo and user ([10c76a9](https://github.com/snowdreamtech/UniStack/commit/10c76a959f351ed7531c7dff1b2f6cd91fb1e030)) +* **gentoo:** initialize portage tree if missing before emerge ([b32bd32](https://github.com/snowdreamtech/UniStack/commit/b32bd32c36b5432897e36a45bc4c858992bad8c6)) +* **goreleaser:** exclude all unsupported modernc.org/sqlite OS/arch targets ([01fc415](https://github.com/snowdreamtech/UniStack/commit/01fc4151df7158dd99998f8c282f3ab422df5dee)) +* **goreleaser:** exclude unsupported OS/arch targets for modernc.org/libc ([6333382](https://github.com/snowdreamtech/UniStack/commit/6333382dfe56730bd4d2474f3afc0ee192f793f3)) +* **init:** add missing netbsd.yml vars file to complete bsd family support ([e55ac3f](https://github.com/snowdreamtech/UniStack/commit/e55ac3f8e2f1c069897fefdde67e75e2212f1d8a)) +* **init:** install python3-dnf on VMware Photon for Ansible dnf module ([3757665](https://github.com/snowdreamtech/UniStack/commit/3757665a96b2984ba652e2fa6c1358d6b7b00953)) +* **init:** install python3-dnf to both system and venv for Photon support ([04be69e](https://github.com/snowdreamtech/UniStack/commit/04be69ecb05f1ad30d4e49feedfbea4df6e6888b)) +* **init:** workaround mageia urpmi bug for openssh installation ([248bcb2](https://github.com/snowdreamtech/UniStack/commit/248bcb25706a680012a9b32d1cdc2ee7bd7823c7)) +* install shadow utils on OpenWrt/NixOS to enable standard user provisioning ([e0b977b](https://github.com/snowdreamtech/UniStack/commit/e0b977b1d2c30b9e51e6aa4ef82e640684cc7dd4)) +* **lifecycle:** refactor ansible hook to comply with package format spec ([afb3020](https://github.com/snowdreamtech/UniStack/commit/afb3020e9c8cfb097fa0f288d7869817c6036acb)) +* **loader:** resolve nested app variable discovery ([3456ce8](https://github.com/snowdreamtech/UniStack/commit/3456ce86b8e923d79434dd3cbb7964a218689932)) +* **loader:** resolve role context issue by using relative role name for built-in apps ([fd70911](https://github.com/snowdreamtech/UniStack/commit/fd70911a479513acab471b22e721dd47f0ddbec4)) +* **loader:** revert os_loader path resolution back to [0] ([ff075ee](https://github.com/snowdreamtech/UniStack/commit/ff075ee8551d07d9b01ee00d94335e70e5c5f1fa)) +* **macOS:** skip sudo and openssh package installation on darwin ([d14257e](https://github.com/snowdreamtech/UniStack/commit/d14257ee9afa0757863d8537346193feb18c3159)) +* **native:** add missing log_loader.yml to native role ([3daab33](https://github.com/snowdreamtech/UniStack/commit/3daab33df2a784fbef48eb4bbaa3064272b50a03)) +* **native:** check if systemd is pid1 before running daemon-reload and state changes ([b3ea6df](https://github.com/snowdreamtech/UniStack/commit/b3ea6df1db6baf8585b44ac1a68f4c7fda76e941)) +* **native:** remove obsolete package_loader_schema inclusion ([8e18833](https://github.com/snowdreamtech/UniStack/commit/8e188339e1fa602b4c81b28e3ecb4918b55ee9e5)) +* **native:** remove obsolete service_loader_schema inclusion ([d238375](https://github.com/snowdreamtech/UniStack/commit/d2383752674e742520dadd6ef39da830bf11c70a)) +* **native:** replace default(omit) with empty dict for package_result to prevent set_fact crash ([443bb8c](https://github.com/snowdreamtech/UniStack/commit/443bb8c751df5846a0d77cff15bdc3adc98e8f54)) +* **normalize:** replace all omit usage with type-safe default values ([d5ff157](https://github.com/snowdreamtech/UniStack/commit/d5ff15777ac33be31a0823b1f48135c2febe1ab8)) +* **npm:** track root npm package by scoping gitignore rule ([b3106bd](https://github.com/snowdreamtech/UniStack/commit/b3106bd35c2e57d69dafcbd8e37e2a0d868dd27e)) +* **orchestrator:** resolve python binary path correctly when ansible is installed natively ([17b43ec](https://github.com/snowdreamtech/UniStack/commit/17b43ec76b0ad8bada12243c02affc3bbc2a7ca8)) +* **orchestrator:** resolve skipped ansible-galaxy dependency installation when using system ansible ([5094b8c](https://github.com/snowdreamtech/UniStack/commit/5094b8c0cf8c50d42fcacfa55c2388eb20cb50c1)) +* **playbook:** remove premature play-level become in foundation.yml ([1bbf473](https://github.com/snowdreamtech/UniStack/commit/1bbf47384accd982dd877583ab81722025faffbe)) +* **pypi:** remove unsupported loongarch64 and riscv64 architectures ([e96b285](https://github.com/snowdreamtech/UniStack/commit/e96b28526c29e99d69266099c32c09f7edee5417)) +* **registry:** resolve variable shadowing bug in builder package deletion ([71f5d7d](https://github.com/snowdreamtech/UniStack/commit/71f5d7d7f7c68b3172a26d0677c0162d0ee572b7)) +* **registry:** unify namespace package storage to use safeName (replace slash with underscore) ([a795146](https://github.com/snowdreamtech/UniStack/commit/a79514645d6ca1a6f5679ae2a61a5b9964df4380)) +* **repositories:** install dnf-plugins-core to ensure CRB can be enabled ([62ca761](https://github.com/snowdreamtech/UniStack/commit/62ca76160d26605c50cbbedf835b4dc206749689)) +* resolve E2E bootstrap failures for Gentoo, Photon, NixOS, OpenWrt, VoidLinux ([ec7e89b](https://github.com/snowdreamtech/UniStack/commit/ec7e89b15f1fee9ffd4a887fce1938f339c6c4cc)) +* resolve E2E bootstrapping failures across multiple linux distributions ([2aefdce](https://github.com/snowdreamtech/UniStack/commit/2aefdcedb25230cc2c55a52c5e81e5e97e788825)) +* resolve ensurepip issue on ubuntu and apk lock issue on alpine ([41dbc1a](https://github.com/snowdreamtech/UniStack/commit/41dbc1a82f94d3002996bb5a76aea935a1ec0e36)) +* **scenarios:** add bootstrap role to foundation scenario to install python on bare hosts ([f372722](https://github.com/snowdreamtech/UniStack/commit/f372722b57de4cf25bd51a82400259832bf307f5)) +* **security:** resolve postcss vulnerability and fix gh issue creation label ([d1a10c0](https://github.com/snowdreamtech/UniStack/commit/d1a10c0e4673c96c4bc05f34ec58527f4d1dead0)) +* **service_loader:** remove invalid failed_when from include_tasks in default.yml ([67b3ba9](https://github.com/snowdreamtech/UniStack/commit/67b3ba90f55f781a2b9c7d8b02d2477c0ea91391)) +* **source:** relax name validation to allow dots ([6c0121f](https://github.com/snowdreamtech/UniStack/commit/6c0121f027ed43b13238778c0cdec7c9b10cfa9c)) +* **source:** validate source names and improve Windows local path handling ([816d02e](https://github.com/snowdreamtech/UniStack/commit/816d02e4760c60bf1f734fa2d7ce8ce073e46474)) +* update nanoid to 3.3.18 in package-lock.json ([eea2bbe](https://github.com/snowdreamtech/UniStack/commit/eea2bbe6e7f49c69817643acc5d1659236ae704d)) +* update nanoid to 3.3.18 in package-lock.json ([728158e](https://github.com/snowdreamtech/UniStack/commit/728158e9d875b342114680f4cf79a91ac5955b84)) +* update nanoid to 3.3.18 in package-lock.json ([7411de0](https://github.com/snowdreamtech/UniStack/commit/7411de016dbe4a384dc51712354aac7852f4e00b)) +* **update:** change fallback source name from 'default' to 'core' ([ef2171e](https://github.com/snowdreamtech/UniStack/commit/ef2171e8303a5167ced7567d0274907ee27fab24)) + + +### โšก๏ธ Performance Improvements + +* **ansible:** consolidate OS and context fact tasks for extreme speed gain ([58ee33d](https://github.com/snowdreamtech/UniStack/commit/58ee33d4c9da3a801b16c0dbda2bba20d4ce8966)) +* **app:** optimize task execution via Jinja2 memory consolidation ([2f46942](https://github.com/snowdreamtech/UniStack/commit/2f46942a00775bc2aad7906b83438c85eccd95b1)) + + +### ๐Ÿ›  Refactoring + +* **ansible/context:** completely remove anti-pattern tag parser ([e63084a](https://github.com/snowdreamtech/UniStack/commit/e63084ac3bde31ccb2f6d561e8f37cda81e982e3)) +* **ansible/context:** eliminate auto-detectable tags, retain only human-decision tags ([1036fea](https://github.com/snowdreamtech/UniStack/commit/1036fea44cf5635c4626321a2c2a415fb7e1ce6f)) +* **ansible/context:** extreme minification of context layer ([6dedc00](https://github.com/snowdreamtech/UniStack/commit/6dedc007c9605feca2738531839de0063329c010)) +* **ansible/context:** final tag_map refinement to 22 pure infrastructure tags ([495a1f7](https://github.com/snowdreamtech/UniStack/commit/495a1f739fd9e55ab3019b8d23450de3ec1204c2)) +* **ansible/context:** optimize os facts parsing and setup enforcement ([a3a2cde](https://github.com/snowdreamtech/UniStack/commit/a3a2cde3702d1d16fcc8c67749f4fdcafdcc42e3)) +* **ansible/context:** remove application specific tags from context ([db78279](https://github.com/snowdreamtech/UniStack/commit/db78279b152afa98c6e11e932eaa1a236be92ca1)) +* **ansible/context:** strict enforcement of human-only tag principle ([22679f6](https://github.com/snowdreamtech/UniStack/commit/22679f6dcc16fac3aef77e343d991d0383fdcde1)) +* **ansible/context:** trim down massive tag_map to core essentials ([74870ed](https://github.com/snowdreamtech/UniStack/commit/74870edcb855accbd580ebdee0da82fff080b9a1)) +* **ansible/context:** ultimate consolidation and cleanup of task logic ([ad7ca3e](https://github.com/snowdreamtech/UniStack/commit/ad7ca3e290ae214e1a7968dae5ef7d10cdae74e0)) +* **ansible/context:** ultimate decoupling of business and infrastructure ([3875e95](https://github.com/snowdreamtech/UniStack/commit/3875e9514b47f49c4bb0cab1a78e44b339108c11)) +* **ansible:** extract fallback package manager logic into a table-driven map for scalability ([90010d9](https://github.com/snowdreamtech/UniStack/commit/90010d9a4dc58c5ab0636717f875a69dc10cc4f6)) +* **ansible:** migrate legacy logic and delete obsolete roles ([24502d6](https://github.com/snowdreamtech/UniStack/commit/24502d6cb849f3f2251cf33a51bfe3d43e694939)) +* **ansible:** remove custom tasks for hello app to leverage smart app engine ([cb0786e](https://github.com/snowdreamtech/UniStack/commit/cb0786e3e63b53bc1c944c3ea0a7d3032f0476bd)) +* **ansible:** remove deprecated init and base playbooks ([7c8a8e8](https://github.com/snowdreamtech/UniStack/commit/7c8a8e84093aab62f87266f84ae55ea7d70ded02)) +* **app:** integrate smart dispatcher with auto delivery mode ([c29b559](https://github.com/snowdreamtech/UniStack/commit/c29b559537ea575b9abaee02d5945564a8cf60f1)) +* **apps/foundation:** convert to metapackage and cleanup obsolete files ([bc68f71](https://github.com/snowdreamtech/UniStack/commit/bc68f712506112e2236430e8b6876a0c81e7293f)) +* **apps/mirror:** extract mirror configuration into standalone role ([b63f6fc](https://github.com/snowdreamtech/UniStack/commit/b63f6fca3ef15d83b7ef4fa16565448280e009d1)) +* **apps/openssh:** extract openssh configuration into standalone role ([800bd54](https://github.com/snowdreamtech/UniStack/commit/800bd548709ef03e0be1215afefb6eb7a4142d00)) +* **apps/repositories:** extract repositories configuration into standalone role ([4197f55](https://github.com/snowdreamtech/UniStack/commit/4197f55abc7d9b0a10e0eb5d80623b1dd1f3e511)) +* **apps/sudo:** extract sudo configuration into standalone role ([207cd88](https://github.com/snowdreamtech/UniStack/commit/207cd880ff449de35595a68cc547bf72df5ff2ba)) +* **apps/user:** extract user configuration into standalone role ([fbbade7](https://github.com/snowdreamtech/UniStack/commit/fbbade7b9655962ac97aa714f09c9ea12555a6f2)) +* **apps:** convert foundation/openssh to declarative native API ([5f4c240](https://github.com/snowdreamtech/UniStack/commit/5f4c24014c82892401be860a3388a46bdb6ca5c9)) +* **apps:** remove redundant os_loader calls in tasks/main.yml ([ca6483b](https://github.com/snowdreamtech/UniStack/commit/ca6483bc4b75cceea3f6a7d2eed5bde9f3a28dc6)) +* **ci:** execute E2E tests natively using compiled unistack binary instead of unirtm ([ce1ff9e](https://github.com/snowdreamtech/UniStack/commit/ce1ff9e0d3c235ef5075fd96faf8df59d3138459)) +* **ci:** migrate cross-platform-actions steps to use custom cpa.sh shell ([a9b4eba](https://github.com/snowdreamtech/UniStack/commit/a9b4ebaa962489bf5ac61a574ea3d2d522b5f919)) +* clean up whitespace and redundant newlines in ansible tasks and documentation ([50cd8f4](https://github.com/snowdreamtech/UniStack/commit/50cd8f4c2823d522ca716aedfd598b79d790a604)) +* cleanup whitespace and normalize quotation styles in ansible roles and context variables ([d42d590](https://github.com/snowdreamtech/UniStack/commit/d42d590741fc16f11f241e5a31c53232aef63d4e)) +* consolidate mock python logic into createSmartFakePython helper and update ansible bootstrap path ([e8967f3](https://github.com/snowdreamtech/UniStack/commit/e8967f3271eeb2b2e51f5a08a539ac240f2d45a5)) +* consolidate RedHat package installation by removing EL8 specific command logic and unifying DNF module usage ([ee6bf3f](https://github.com/snowdreamtech/UniStack/commit/ee6bf3f05f4d04e8812377ee23a4780299472e47)) +* consolidate root user and group definition into facts and update system file ownership accordingly ([b43687e](https://github.com/snowdreamtech/UniStack/commit/b43687eb1d219969fa16337c2e8120b67411fb82)) +* **context:** implement explicit include guard for context loading ([a804343](https://github.com/snowdreamtech/UniStack/commit/a804343ff83c7c17dc0d9139e5cb25c0caf8fa83)) +* **core:** purge support for unsupported edge operating systems ([52998a5](https://github.com/snowdreamtech/UniStack/commit/52998a523e2f7052586a06f4aeba434746943ed3)) +* **deps:** manage ansible-core via unirtm instead of manual pipx ([5ca4778](https://github.com/snowdreamtech/UniStack/commit/5ca47788345be8f27c0e154b343a44fcb6670767)) +* flatten internal/pkg directory into internal ([35fc325](https://github.com/snowdreamtech/UniStack/commit/35fc3253541c5101bf2fd3da8604cd90e740ac2f)) +* flatten internal/pkg directory into internal ([df339d8](https://github.com/snowdreamtech/UniStack/commit/df339d85255e0d0cedc42e91e484c3e1417451b3)) +* **foundation:** leverage os_loader for OS-specific package sets, removing curl_conflict_loader ([32a5f99](https://github.com/snowdreamtech/UniStack/commit/32a5f997d3ba1a828ac4ff5f06031c713547f2a8)) +* **foundation:** migrate to app_loader lifecycle hooks ([edd0a5f](https://github.com/snowdreamtech/UniStack/commit/edd0a5f56c2ff05e0c708227c1df5a86f374c666)) +* **loader:** replace include_tasks with include_role ([5601e00](https://github.com/snowdreamtech/UniStack/commit/5601e0047d954a2ec37023eee229acd3975d956f)) +* **loader:** simplify dynamic role inclusion by directly using absolute source path ([d0f27f5](https://github.com/snowdreamtech/UniStack/commit/d0f27f55164b1c49c6c2a668c435bb2e7400cdb8)) +* **native:** extract native engine and purify loaders ([723e58f](https://github.com/snowdreamtech/UniStack/commit/723e58f636b08e1d3ad0e9d5c4d44aa2f446235b)) +* normalize become_enabled variable usage with default boolean cast across all tasks ([dc46e3b](https://github.com/snowdreamtech/UniStack/commit/dc46e3be1088e37303dfcc13f105c03a1b21e3dc)) +* **pypi:** localize package namespace to unistack ([a3e21a5](https://github.com/snowdreamtech/UniStack/commit/a3e21a5a183d4262935940b6b397070b284056eb)) +* reformat ansible loader configurations for improved readability ([d1c08fd](https://github.com/snowdreamtech/UniStack/commit/d1c08fd031adef6268d596ee53eed7913c65a7d7)) +* reformat loop item syntax in app_loader.yml for improved readability ([5d8348d](https://github.com/snowdreamtech/UniStack/commit/5d8348dbd35230d7fd254625f5f9fb28b85725f4)) +* remove hello application installation tasks ([341a0ea](https://github.com/snowdreamtech/UniStack/commit/341a0ead70a33629693b7fb06db86c90ced8c6c5)) +* remove redundant SSH permission fixes from init playbook and enhance CI debugging output ([1715f60](https://github.com/snowdreamtech/UniStack/commit/1715f601e7f55ef1f73443d9de05c653b43f622f)) +* remove support for Clear Linux swupd package manager ([6fd7af3](https://github.com/snowdreamtech/UniStack/commit/6fd7af393a73265904cdf6ce84fa4ef52c355513)) +* remove urpmi support, add tdnf shell workarounds for base packages, and update OpenWrt default packages ([fbe0249](https://github.com/snowdreamtech/UniStack/commit/fbe0249c09570c115d7e5707c8664a3c9ef5b651)) +* rename update_cache to sync in Gentoo portage package loader ([e11bc46](https://github.com/snowdreamtech/UniStack/commit/e11bc465a2bb0b11e20a3ffc2e33096a005bfc4f)) +* reorder foundation base package installation after repository configuration ([cb4c39b](https://github.com/snowdreamtech/UniStack/commit/cb4c39b7fbd027d3bd5dff4d0f73594951c6995e)) +* simplify app path resolution and standardize hierarchy loading in app_loader.yml ([6ee2992](https://github.com/snowdreamtech/UniStack/commit/6ee29921e285a75e9a43999fd2bb2381938426d6)) +* simplify os_family and os_pkg_mgr definitions by removing complex conditional overrides ([06b4c38](https://github.com/snowdreamtech/UniStack/commit/06b4c38dd6ec69b7231ed001d4274d5ef390c06e)) +* simplify upgrade command to use internal InstallPackage logic ([515742e](https://github.com/snowdreamtech/UniStack/commit/515742eb4b5675ebe4d2b89021d8627b7ff738f9)) +* split GoReleaser job into core and third-party release steps to improve reliability and fault tolerance ([6e760fb](https://github.com/snowdreamtech/UniStack/commit/6e760fbecbb3c91f008b44f26c7ec69806425f88)) +* split GoReleaser job to isolate core artifacts ([81647f0](https://github.com/snowdreamtech/UniStack/commit/81647f09a625f5069d038779e147b798a169230e)) +* split SSH permission enforcement tasks by target user and platform to handle OS-specific CI runner paths correctly ([8478515](https://github.com/snowdreamtech/UniStack/commit/8478515315a0b4dcaaff1d78d7f5ef77c17a1b2b)) +* split unified bsd sysinfo implementation into separate platform-specific files ([f1b169e](https://github.com/snowdreamtech/UniStack/commit/f1b169e95a98247d10e1fa7876b05c0ae87e9d3c)) +* standardize become_enabled logic and remove redundant debugging playbooks ([7cad301](https://github.com/snowdreamtech/UniStack/commit/7cad301094b7bffec99787216a1a30fe03665c02)) +* standardize default fallback values for OS and architecture variables in task loaders ([c04bc2e](https://github.com/snowdreamtech/UniStack/commit/c04bc2e49844a00634a0b49c2e73c46a0698b0d5)) +* switch Go download mirror to go.dev, remove harden-runner from GitHub workflows, and update vite to 8.1.3 ([5b38466](https://github.com/snowdreamtech/UniStack/commit/5b38466b3736724dd1a7d1cdbb737b69561fe183)) +* update core loader variables to use explicit type and path definitions across native task loaders ([3a9ab5e](https://github.com/snowdreamtech/UniStack/commit/3a9ab5e5cdc26ffe23dcffc33f966c1d5b46171f)) +* update OS context defaults from default to __skip__ to improve lookup flexibility ([ca2a0bf](https://github.com/snowdreamtech/UniStack/commit/ca2a0bfac424f1b770180c4a79b363ef51c286c2)) + + +### ๐Ÿ“– Documentation + +* add PyPI and NPM installation instructions to README ([886e70c](https://github.com/snowdreamtech/UniStack/commit/886e70ca0e3aefa632405c08a44436f882f8b3b7)) +* add specification for ansible execution hook ([1d59ac7](https://github.com/snowdreamtech/UniStack/commit/1d59ac74b9ca0de568b93bd5430dd4a6224062a9)) +* add tasks for ansible execution hook ([d6e1325](https://github.com/snowdreamtech/UniStack/commit/d6e1325861ac353a2c361d9441dc7059d62665a8)) +* **adr:** formalize OS support matrix and edge OS deprecation ([18a8317](https://github.com/snowdreamtech/UniStack/commit/18a83173213f8889d26956052e443c9fd77e53d8)) +* clarify package versioning requirements and backend parsing logic in specification ([1916739](https://github.com/snowdreamtech/UniStack/commit/1916739d119535e12ba8d286251493c681f0734a)) +* generate implementation plan for ansible execution hook ([8bd42a4](https://github.com/snowdreamtech/UniStack/commit/8bd42a49ab629a231cd820373f6132c15b81d220)) +* **lifecycle:** format tasks.md per speckit checklist rules ([459d648](https://github.com/snowdreamtech/UniStack/commit/459d6489c7b8b88bc3228c6b45af0032691980e2)) +* localize project references to unistack ([84800e1](https://github.com/snowdreamtech/UniStack/commit/84800e100b0db61020f3d1088d177f11cea091ee)) +* **plan:** add implementation plan for local package installation ([5e22547](https://github.com/snowdreamtech/UniStack/commit/5e22547eb1eb6c96bfaca416313e42fba4f00f92)) +* restructure documentation for i18n and remove proprietary content ([416bd46](https://github.com/snowdreamtech/UniStack/commit/416bd46475fccd72b0c58cbb7f3d7fb89d02e241)) +* **spec:** add specification for local package installation ([df27f32](https://github.com/snowdreamtech/UniStack/commit/df27f327de6bdf54f8639aeeadc44468c1bf23f0)) +* **speckit:** add implementation plan ([d0db4eb](https://github.com/snowdreamtech/UniStack/commit/d0db4eb48f82cfc90326fcf66a28b975a72f4a92)) +* **speckit:** add implementation plan ([33fb317](https://github.com/snowdreamtech/UniStack/commit/33fb3178d83a5239995cc43d4d30265f2c9082e7)) +* **speckit:** add implementation plan ([6d807c9](https://github.com/snowdreamtech/UniStack/commit/6d807c9cbe8ba9d402fa6c72bf0b6acdf61b3900)) +* **speckit:** add implementation plan ([b42b016](https://github.com/snowdreamtech/UniStack/commit/b42b0162593cef4e3588ff32dc236588e002dc46)) +* **speckit:** add implementation plan ([df26088](https://github.com/snowdreamtech/UniStack/commit/df26088862b930c19fcb588c1a9e53547c853ca5)) +* **speckit:** add implementation plan ([9e1d42e](https://github.com/snowdreamtech/UniStack/commit/9e1d42eed878983b4f7f4581bd5e40d3d645f825)) +* **speckit:** add implementation plan ([9520acf](https://github.com/snowdreamtech/UniStack/commit/9520acf26a35cc6dd2f2dc07eca213bebfde3a87)) +* **speckit:** add specification ([351e2f8](https://github.com/snowdreamtech/UniStack/commit/351e2f8e8daf18528a238372ee4ffc0b00d6859e)) +* **speckit:** add specification ([aa348fa](https://github.com/snowdreamtech/UniStack/commit/aa348fa3b24cc7f19c2642ed01e58cc86c76c481)) +* **speckit:** add specification ([473a52b](https://github.com/snowdreamtech/UniStack/commit/473a52b2d956504e291c1f6f20b9d38a87739349)) +* **speckit:** add specification ([e2d982d](https://github.com/snowdreamtech/UniStack/commit/e2d982d84f5c2d2db0494a2234e305b3d43d4145)) +* **speckit:** add specification ([14c6361](https://github.com/snowdreamtech/UniStack/commit/14c63614959d6debf69052322ea49b1322c00721)) +* **speckit:** add specification ([2b8d8ef](https://github.com/snowdreamtech/UniStack/commit/2b8d8ef5a2e8a7b542e5818374c727960e80a40e)) +* **speckit:** add specification ([73db464](https://github.com/snowdreamtech/UniStack/commit/73db464ee17473b1840a037bf3798abb985a814d)) +* **speckit:** add specification ([67249f7](https://github.com/snowdreamtech/UniStack/commit/67249f77f74aba96082cf2ac41fe4636f004c7d8)) +* **speckit:** add tasks ([44fdd66](https://github.com/snowdreamtech/UniStack/commit/44fdd665c2748b12b92792fb0f14a863effe81c2)) +* **speckit:** add tasks ([352b2e9](https://github.com/snowdreamtech/UniStack/commit/352b2e98ac5ba1d3c540cd9c75050590a2127512)) +* **speckit:** add tasks ([d3942e9](https://github.com/snowdreamtech/UniStack/commit/d3942e937fef0ce50266d3088db10e8ac801358c)) +* **speckit:** add tasks ([333c7ac](https://github.com/snowdreamtech/UniStack/commit/333c7acecd52a76cef1049f4139e7a16b2b88552)) +* **speckit:** add tasks ([84f348a](https://github.com/snowdreamtech/UniStack/commit/84f348a9b1c54c870f4b8bbf018ab2d66ef55e5b)) +* **speckit:** clarify specification ([bb0da12](https://github.com/snowdreamtech/UniStack/commit/bb0da1221632542f3bc18261da0ecfee2466fce9)) +* **specs:** update progress for 012-localize-unistack ([4843698](https://github.com/snowdreamtech/UniStack/commit/48436980e4381311f7c7cca01d48e06038890bf1)) +* **tasks:** generate tasks for local package installation ([5bd068a](https://github.com/snowdreamtech/UniStack/commit/5bd068ad98f715de60156d333b76b777f14155ad)) +* update registry research spec to use registry pack instead of deprecated repo commands ([0c178d1](https://github.com/snowdreamtech/UniStack/commit/0c178d1cf11acf7666985bc55c26270bb4b2de1a)) +* update unistack project description ([9837cb2](https://github.com/snowdreamtech/UniStack/commit/9837cb2324c7ba264e658e6d3358cb1ca7a1d7c2)) + + +### โ™ป๏ธ Miscellaneous Chores + +* add egress network allowlist entries to all GitHub Actions workflows ([9616592](https://github.com/snowdreamtech/UniStack/commit/961659274a02544704ba1a9e22327d70b11fb109)) +* add github.com/kr/text dependency to go.mod ([b3a737d](https://github.com/snowdreamtech/UniStack/commit/b3a737d5dd998e99ae8e2311b8c3ea266f904d86)) +* **ansible/init:** remove application-level mirror templates ([4f7c956](https://github.com/snowdreamtech/UniStack/commit/4f7c956d08acd938029af195372531dea416f123)) +* **ansible/init:** remove fastfetch from base OS initialization ([ca018b4](https://github.com/snowdreamtech/UniStack/commit/ca018b4cf24e82dd430803f36169b576eae68f07)) +* bump github.com/klauspost/compress to v1.19.1 ([02c96e4](https://github.com/snowdreamtech/UniStack/commit/02c96e47a6ddfb6cca8d1f359355dee5647e62ec)) +* bump Go version to 1.26.5 and update tool download mirrors ([4fcbf67](https://github.com/snowdreamtech/UniStack/commit/4fcbf67f5bc37469a217dc89241ce2cb0c9a65c1)) +* bump release version to 0.0.4 in .release-please-config.json ([f96b4bb](https://github.com/snowdreamtech/UniStack/commit/f96b4bbba2d32f2246191da9e79583a1c4c19767)) +* bump version from 0.0.2 to 0.0.3 ([f6e891a](https://github.com/snowdreamtech/UniStack/commit/f6e891a05cbdf55fcea2df01c209b4052360ed28)) +* **changelog:** deduplicate commit entries across versions ([e65ea1e](https://github.com/snowdreamtech/UniStack/commit/e65ea1e11bfd7a2be12f29f6f44361bc2372e44d)) +* **ci:** adjust linux matrix to use leap and archlinux:latest ([b3cf06e](https://github.com/snowdreamtech/UniStack/commit/b3cf06e816b76d8228489d873bb15e79ff6e5571)) +* **ci:** align debian build matrix with upstream supported architectures ([e9f0b8d](https://github.com/snowdreamtech/UniStack/commit/e9f0b8daf2a4cfbdfa28fc160bac4375e46a4691)) +* **ci:** align debian build matrix with upstream supported architectures ([b88eaa4](https://github.com/snowdreamtech/UniStack/commit/b88eaa4ea95a323b91bdf2a2304dde703704a1cd)) +* **ci:** expand E2E testing matrix with archlinux, fedora, and opensuse ([7f6e92f](https://github.com/snowdreamtech/UniStack/commit/7f6e92fb88b587a0692a34fe5757bd1decdaa0c1)) +* **ci:** pin archlinux and opensuse tumbleweed images to specific tags ([cb99f71](https://github.com/snowdreamtech/UniStack/commit/cb99f71bc8c5769ae0da4eb2509168e372961165)) +* **ci:** update rockylinux image references to official namespace ([4813249](https://github.com/snowdreamtech/UniStack/commit/4813249411369f0fc21e6e9caf568c2d9e13e419)) +* **deps:** add ansible-lint to unirtm tools ([addc7ae](https://github.com/snowdreamtech/UniStack/commit/addc7aedabd9bba637ac7912bb80c25464f4b7e3)) +* **deps:** bump the all-dependencies group in /docs with 3 updates ([8c8ffd9](https://github.com/snowdreamtech/UniStack/commit/8c8ffd91c27ffc4a74cf44ea5c3eadec988ffa04)) +* **deps:** bump vite in /docs in the all-dependencies group ([91cdab1](https://github.com/snowdreamtech/UniStack/commit/91cdab13e0b1cbf7e533b1173f02661b0c4dade4)) +* **deps:** bump vite in /docs in the all-dependencies group ([6cccd02](https://github.com/snowdreamtech/UniStack/commit/6cccd0239f14774c5dca746a861871855022e1cf)) +* **deps:** bump vite in /docs in the all-dependencies group ([bcad411](https://github.com/snowdreamtech/UniStack/commit/bcad411a69b84ae6eb1db8cb71e8e8a3f54f48d6)) +* **deps:** bump vite in /docs in the all-dependencies group ([f3e5f8f](https://github.com/snowdreamtech/UniStack/commit/f3e5f8fbf6c7bc524b70caccf8aa20eea3bbd4e7)) +* **deps:** fix vulnerabilities reported by osv-scanner and update go modules ([e99bbbe](https://github.com/snowdreamtech/UniStack/commit/e99bbbe7c690c8861a9b3b102f301e32a690ca84)) +* **deps:** merge upstream/dev into dev ([831c7a2](https://github.com/snowdreamtech/UniStack/commit/831c7a26c4d256de54ce7bbefde851246c71ef74)) +* **deps:** sync dependabot config and unirtm toolchain ([1a2f3a6](https://github.com/snowdreamtech/UniStack/commit/1a2f3a61612e634d7d6f829365043796bfa136e4)) +* **deps:** sync dependabot config and unirtm toolchain ([cbb930d](https://github.com/snowdreamtech/UniStack/commit/cbb930dc46469c1c2772d50d35738b7888bf2299)) +* **deps:** sync dependabot config and unirtm toolchain ([df5bc0f](https://github.com/snowdreamtech/UniStack/commit/df5bc0f9a19162828ec38c76f52f19102c1e668c)) +* **deps:** sync dependabot config and unirtm toolchain ([4f74adf](https://github.com/snowdreamtech/UniStack/commit/4f74adfffc0e78819a8a53ed22284f2c0897e8e2)) +* **deps:** sync dependabot config and unirtm toolchain ([eabf483](https://github.com/snowdreamtech/UniStack/commit/eabf483fd39cd3a00f73d7e380a8e82a8de3eb3d)) +* **deps:** sync dependabot config and unirtm toolchain ([70cd8d9](https://github.com/snowdreamtech/UniStack/commit/70cd8d91e24ff5d79ee4508b8d87a71c43f87912)) +* **deps:** sync dependabot config and unirtm toolchain ([928ab14](https://github.com/snowdreamtech/UniStack/commit/928ab14a0acd6af672079f234f9650e8183df44f)) +* **deps:** sync dependabot config and unirtm toolchain ([f561c65](https://github.com/snowdreamtech/UniStack/commit/f561c65fd180508bba43e61ed445fba6e3898d23)) +* **deps:** sync dependabot config and unirtm toolchain ([8140fd9](https://github.com/snowdreamtech/UniStack/commit/8140fd91e3128604ac2df153f1137e1ca4ff66c7)) +* **deps:** sync dependabot config and unirtm toolchain ([2d299ab](https://github.com/snowdreamtech/UniStack/commit/2d299ab95cf2f5f5da5f5c3f4de1a1f03dd8628c)) +* **deps:** sync dependabot config and unirtm toolchain ([0a5a894](https://github.com/snowdreamtech/UniStack/commit/0a5a894f45b5fa6d6d2d1978e25fcdb639949957)) +* **deps:** sync dependabot config and unirtm toolchain ([7b33c4a](https://github.com/snowdreamtech/UniStack/commit/7b33c4a2f1113f1f972f386469c3b10fdb42d331)) +* **deps:** sync dependabot config and unirtm toolchain ([59628d4](https://github.com/snowdreamtech/UniStack/commit/59628d49a78c0717168d047066fffddaeda4cea2)) +* **deps:** sync dependabot config and unirtm toolchain ([5169535](https://github.com/snowdreamtech/UniStack/commit/5169535295d32ab02b3705fac84c58f3295188cc)) +* **deps:** sync dependabot config and unirtm toolchain ([8e1ee07](https://github.com/snowdreamtech/UniStack/commit/8e1ee0773ab995a23a8457ff7969a2b00dfe2a39)) +* **deps:** sync dependabot config and unirtm toolchain ([4913150](https://github.com/snowdreamtech/UniStack/commit/49131502c38f7ed484f1f18bcfbdb597f35d4a0e)) +* **deps:** sync dependabot config and unirtm toolchain ([f18d952](https://github.com/snowdreamtech/UniStack/commit/f18d9522725fb87123027fddbf51a0026ff52fc1)) +* **deps:** sync dependabot config for PyPI ([e1533a8](https://github.com/snowdreamtech/UniStack/commit/e1533a8d8147765aa049b97ccd8a4f3d2b963efe)) +* **deps:** sync upstream dependency updates for CI actions and docs tooling ([841e790](https://github.com/snowdreamtech/UniStack/commit/841e79091a9321bd6cb4449d631c3212c21a0f9f)) +* **deps:** update Go toolchain version to 1.27.0 ([c93b0ec](https://github.com/snowdreamtech/UniStack/commit/c93b0ec5f90e59cc12d002d1c51bb939371f957f)) +* **deps:** update go version to 1.26.5 ([91349d4](https://github.com/snowdreamtech/UniStack/commit/91349d45d07f4928818f869a38e06042912d0710)) +* **deps:** update go version to 1.27.0 ([3b7cac1](https://github.com/snowdreamtech/UniStack/commit/3b7cac1f24e73ea116caed2a1640db96a0fc7c70)) +* **deps:** update go.mod and go.sum ([28a6203](https://github.com/snowdreamtech/UniStack/commit/28a620342b43535a907ea46f6c0d7ee106dcf0ed)) +* **deps:** update govulncheck tool version to v1.7.0 for Go 1.27 AST support ([54e84b9](https://github.com/snowdreamtech/UniStack/commit/54e84b9edc847675b20fa7ef7262d41b95878661)) +* **deps:** update unirtm toolchain version to 0.28.0 ([b24cb8e](https://github.com/snowdreamtech/UniStack/commit/b24cb8ef46c5fd2abce6b84a0cb8354b725f9ae7)) +* **deps:** update unirtm toolchain versions ([23e763a](https://github.com/snowdreamtech/UniStack/commit/23e763a3ea3618766e9f9103095f1aff52764652)) +* **deps:** upgrade golang version to 1.27.0 in template ([8559102](https://github.com/snowdreamtech/UniStack/commit/8559102441208d4d9d5150bea6705f565129a190)) +* **deps:** upgrade golang.org/x and core dependencies to address security advisories ([dcceb88](https://github.com/snowdreamtech/UniStack/commit/dcceb8873be4d2b8efe3d52168cdc3e73281757a)) +* **docker:** remove default VERSION and release-please markers ([5d5e128](https://github.com/snowdreamtech/UniStack/commit/5d5e128a0322aa5dc5145dbe85e5a6ab91b48dc8)) +* **docs:** update postcss to v8.5.25 to fix vulnerability GHSA-fxqj-rqcc-2cmp ([101abfe](https://github.com/snowdreamtech/UniStack/commit/101abfe25b514eec1d6898971b64eda0de1c147f)) +* fix security vulnerabilities in dependencies ([bbed176](https://github.com/snowdreamtech/UniStack/commit/bbed1761471e7ba510ef1e9e3fdfcb4e367878b5)) +* fix yaml formatting, line endings, and markdown lint issues ([6e10abe](https://github.com/snowdreamtech/UniStack/commit/6e10abe6e404065a1f2e959a06f6077bdcafcd50)) +* **foundation:** remove redundant base_dev_packages and legacy defaults ([cd315b0](https://github.com/snowdreamtech/UniStack/commit/cd315b03071cd517a2c9d1fa62f5e7712edbae81)) +* **foundation:** remove redundant base_dev_packages and legacy defaults ([ef9cfc8](https://github.com/snowdreamtech/UniStack/commit/ef9cfc863d2dfb9e2c661f015cc23c3e823f8f10)) +* **git:** merge upstream main into dev ([bedd535](https://github.com/snowdreamtech/UniStack/commit/bedd53535a2ae628e8902609d135d14732729d75)) +* **goreleaser:** update ldflags for flattened internal packages ([543c77e](https://github.com/snowdreamtech/UniStack/commit/543c77eefeaad75f6799e28768326f98f8f40dc1)) +* ignore SQLite database and temporary WAL/SHM files ([2f6ec0f](https://github.com/snowdreamtech/UniStack/commit/2f6ec0f33bcd5d5b303798ce38fd0e6e734c7ffa)) +* import strings package in downloader_pkg.go ([b8d23e1](https://github.com/snowdreamtech/UniStack/commit/b8d23e1cf7994b59f8aa85a3e26e13387230af4a)) +* increase MaxAuthTries default to 6 and add OpenBSD compatibility test script ([985ee11](https://github.com/snowdreamtech/UniStack/commit/985ee1106082cde7030f81e50b95bb68e6f93945)) +* **init:** fix typo in defaults/main.yml ([9e9bed6](https://github.com/snowdreamtech/UniStack/commit/9e9bed61f788fb35a295a034f05d69dc33647b36)) +* merge upstream dev branch to sync dependency updates ([0ed315d](https://github.com/snowdreamtech/UniStack/commit/0ed315d8fbe95207d909a004b5b44e17743fbffb)) +* merge upstream/dev and align configurations ([e4dc9cf](https://github.com/snowdreamtech/UniStack/commit/e4dc9cf2429114dd41dec7d9c8db89b905abe711)) +* **merge:** merge release main into dev ([414b2c8](https://github.com/snowdreamtech/UniStack/commit/414b2c83bb589357a2bf6282dd9bc5c66fd2bdeb)) +* **merge:** merge upstream dev into dev ([dc626af](https://github.com/snowdreamtech/UniStack/commit/dc626af0f5999b4e4c882acb8e2cfeff3fb750b4)) +* **merge:** merge upstream/dev into dev ([5909a86](https://github.com/snowdreamtech/UniStack/commit/5909a8691e0a81d6823c31ed7791cc2275eb8536)) +* **merge:** merge upstream/dev into dev ([43b9e62](https://github.com/snowdreamtech/UniStack/commit/43b9e62feafc312572607f86e65a6968cb9bc053)) +* **merge:** merge upstream/dev into dev ([fe0a462](https://github.com/snowdreamtech/UniStack/commit/fe0a462a5560d4097abff6f705b29638e80f87db)) +* **merge:** merge upstream/dev into dev ([4d905fc](https://github.com/snowdreamtech/UniStack/commit/4d905fcdbac5fbcea3ac1b3a7e7e9c820b4bfffb)) +* **merge:** merge upstream/dev into dev ([0be753e](https://github.com/snowdreamtech/UniStack/commit/0be753e07d6f7a5d840c0743fac54324daef0f7a)) +* **pypi:** add missing docstring to __init__.py ([7f597b1](https://github.com/snowdreamtech/UniStack/commit/7f597b1a3c46e078d67e1c175c180b2a99414964)) +* release main ([700980f](https://github.com/snowdreamtech/UniStack/commit/700980f0d84553b1094f49745d30f5daf9a22b1b)) +* release main ([d0658c7](https://github.com/snowdreamtech/UniStack/commit/d0658c7fcbfcec6dc02c64333dfc08457bf79685)) +* release main ([f194b67](https://github.com/snowdreamtech/UniStack/commit/f194b6782d11cd801472361df52aa91e89ff4885)) +* release main ([55a97dd](https://github.com/snowdreamtech/UniStack/commit/55a97ddfbd7dc4d81d95104d2d32ed1e6dc7d763)) +* release main ([041aa96](https://github.com/snowdreamtech/UniStack/commit/041aa965c661dd34171c7a5ea57c66ac9af5bfd4)) +* release main ([67d4810](https://github.com/snowdreamtech/UniStack/commit/67d48103a6b5ab3c6b707edeb1683d46de38869d)) +* release main ([ac32ddd](https://github.com/snowdreamtech/UniStack/commit/ac32ddd54d05d077fbfb0d310df419e82cef3e39)) +* release main ([a3848c6](https://github.com/snowdreamtech/UniStack/commit/a3848c6ef66794de17cb5a0411310a863fe2e6af)) +* release main ([11fbad2](https://github.com/snowdreamtech/UniStack/commit/11fbad25487f556c183416600e246a763e74236f)) +* release main ([4eaeb83](https://github.com/snowdreamtech/UniStack/commit/4eaeb837632c789918cb45e56327df837db47707)) +* release main ([e0b6eaf](https://github.com/snowdreamtech/UniStack/commit/e0b6eaf9f8b472b315c296dafdc2666b575a7be4)) +* release main ([4bd5e15](https://github.com/snowdreamtech/UniStack/commit/4bd5e157820bab53adbdb6854d859e98a05bd745)) +* release main ([d2437e7](https://github.com/snowdreamtech/UniStack/commit/d2437e750bc2b0edbe9a3b0479f3aa1017e66ef4)) +* release main ([d49b45b](https://github.com/snowdreamtech/UniStack/commit/d49b45b3e14fd44fe86ba538087773ab3bd43aa9)) +* release main ([f77a412](https://github.com/snowdreamtech/UniStack/commit/f77a412decfa47d99d65d08d6593da8a0a30bd8b)) +* release main ([ae2ad23](https://github.com/snowdreamtech/UniStack/commit/ae2ad23e7aedaa5f06f0881dc5636ded8360e5b9)) +* release main ([456a037](https://github.com/snowdreamtech/UniStack/commit/456a0376d828025324a61aa522ce15e7aa3328fc)) +* release main ([b74e40d](https://github.com/snowdreamtech/UniStack/commit/b74e40d47ab0901c7556b4b0a99af83d9ff7ebb0)) +* release main ([e72b6de](https://github.com/snowdreamtech/UniStack/commit/e72b6dee34465d106bf120be6a64c6d1215912f9)) +* release main ([ec828d1](https://github.com/snowdreamtech/UniStack/commit/ec828d1586b7eaad7562ffdbaa74ee20aa827522)) +* release main ([7290dad](https://github.com/snowdreamtech/UniStack/commit/7290dad0babfb8df3d062c3ddbd21b02b76b9505)) +* release main ([40863d5](https://github.com/snowdreamtech/UniStack/commit/40863d5425314b3ad86c556202e48981d0bf6668)) +* release main ([2a5c314](https://github.com/snowdreamtech/UniStack/commit/2a5c3145a64e0c414958dd18d4d620ed5cbf8076)) +* **release:** bump release-please config to 0.0.5 ([3f766b7](https://github.com/snowdreamtech/UniStack/commit/3f766b790b23b7596c6fc2821b51b7bdd4b2afec)) +* **release:** bump version to 0.0.5 across Dockerfiles and VERSION ([8f6298d](https://github.com/snowdreamtech/UniStack/commit/8f6298ddeda056c2b193973c3a42366067c39caa)) +* **release:** bump version to 0.0.6 across manifest, VERSION, and Dockerfiles ([24ddfda](https://github.com/snowdreamtech/UniStack/commit/24ddfda1984359a9bed98e5d286fafebb1135232)) +* **release:** force release-please to use 0.0.5 via release-as config ([fef7d1d](https://github.com/snowdreamtech/UniStack/commit/fef7d1d9d4c4a18379952d2857a2d08c415c05b9)) +* **release:** remove hardcoded release-as version ([37b2a5b](https://github.com/snowdreamtech/UniStack/commit/37b2a5b95adb08abac7e70180fe1dd251f6b7daa)) +* **release:** remove hardcoded release-as version ([105dc81](https://github.com/snowdreamtech/UniStack/commit/105dc81f183d9c471cb6ea888284d159d3ffd135)) +* **release:** set bump-patch-for-minor-pre-major to false ([1e47e29](https://github.com/snowdreamtech/UniStack/commit/1e47e29bf8d338de6bf5cee8c1373507568c5c4c)) +* **release:** synchronize lockfiles for version bump ([a960881](https://github.com/snowdreamtech/UniStack/commit/a9608811a7df541b01b795ba9b0f281fc6eb5b6c)) +* **release:** synchronize lockfiles for version bump ([2f779f3](https://github.com/snowdreamtech/UniStack/commit/2f779f30b5e20d10552f2868c6ae348cf9dee0e9)) +* **release:** synchronize lockfiles for version bump ([0d18a2a](https://github.com/snowdreamtech/UniStack/commit/0d18a2afbf674c16add198cc32ec8fcce08f8567)) +* **release:** synchronize lockfiles for version bump ([b2dd77a](https://github.com/snowdreamtech/UniStack/commit/b2dd77ae7d8ff020507d38d05bdc4754912fbca2)) +* **release:** synchronize lockfiles for version bump ([d053b59](https://github.com/snowdreamtech/UniStack/commit/d053b597785ed718ff3919a39e7d1fa3aaba9638)) +* **release:** synchronize lockfiles for version bump ([6fde3b5](https://github.com/snowdreamtech/UniStack/commit/6fde3b5be9a64c9642b4aa9808109cbd9474140b)) +* **release:** synchronize lockfiles for version bump ([d48645b](https://github.com/snowdreamtech/UniStack/commit/d48645b492c93b5ee1afe465bcf87a1e219b5107)) +* **release:** update release-as version to 0.0.6 in release-please-config.json ([713e552](https://github.com/snowdreamtech/UniStack/commit/713e552af13f04937529fd0066fafce4eb02480b)) +* **release:** update version to 0.0.6 in docker.yml ([11f08b5](https://github.com/snowdreamtech/UniStack/commit/11f08b5d6164daa90e87138bfa454916f977c6e8)) +* remove harden-runner security audit from docker workflow ([a7a42ce](https://github.com/snowdreamtech/UniStack/commit/a7a42cee2d95c84ac80b71cc26f05b5de70d63fb)) +* remove harden-runner security audit from docker workflow ([c376f0e](https://github.com/snowdreamtech/UniStack/commit/c376f0ef6aafcbe77ecef848c3699e1ed2c3dbf6)) +* remove regenerated unirtm.lock ([c0a8aa6](https://github.com/snowdreamtech/UniStack/commit/c0a8aa6bbd02028d3fdcb1fecdb07935af2d4f46)) +* remove temporary debug scripts ([78bf718](https://github.com/snowdreamtech/UniStack/commit/78bf718d28f427fd77d6164020b30b29d3d1d908)) +* remove unirtm.lock file ([acd227d](https://github.com/snowdreamtech/UniStack/commit/acd227d7ec448e497f8d945385dee12230e39217)) +* remove unirtm.lock to allow remote regeneration ([684c785](https://github.com/snowdreamtech/UniStack/commit/684c7856f0f7be97f176bf3ef0e6a693c7d5f2f2)) +* remove windows-latest from ci and cd workflow matrices ([b0598bc](https://github.com/snowdreamtech/UniStack/commit/b0598bc56f4ddce410d47e8d992e19063f3c460a)) +* rename ansible_pkg_mgr check from emerge to portage for Gentoo compatibility ([b2632a8](https://github.com/snowdreamtech/UniStack/commit/b2632a8b8964417665d0bf9e3a78496965942f59)) +* revert release-as version to 0.0.4 in release-please-config.json ([173e0fd](https://github.com/snowdreamtech/UniStack/commit/173e0fdbce6b20ec6c95818ea3bbb118fd052a81)) +* **security:** configure osv-scanner ignoring uncalled GO-2026-5932 ([f641c6d](https://github.com/snowdreamtech/UniStack/commit/f641c6d03899e7889378b778c51dee52348d856a)) +* skip .ansible directory in trivy scans ([fe8aa11](https://github.com/snowdreamtech/UniStack/commit/fe8aa11cd3787057be32c71d1608f264f2f23859)) +* **speckit:** auto-commit after fix(ansible): pass native_app_name from foundation to native ([a9ffee5](https://github.com/snowdreamtech/UniStack/commit/a9ffee53030ed0566e32ed231f22c0db6be4ae96)) +* **speckit:** manual auto-commit trigger ([7352668](https://github.com/snowdreamtech/UniStack/commit/7352668c7b7754b73e37fe1185f6271a8b49e077)) +* **speckit:** manual auto-commit trigger ([fdd54e8](https://github.com/snowdreamtech/UniStack/commit/fdd54e80fc0fa605d8ad6bea2a8e6655ebac69b0)) +* suppress root user hadolint warnings and add missing YAML front matter to defaults ([c620b21](https://github.com/snowdreamtech/UniStack/commit/c620b2184b40cab43393b533d6a972f24155d8a7)) +* trigger release ([1e055ae](https://github.com/snowdreamtech/UniStack/commit/1e055ae82bca1f191a4d316e1cf738f3b59cdaa6)) +* trigger release ([83e78e3](https://github.com/snowdreamtech/UniStack/commit/83e78e37ad406d4697708f365c96f4fc91a6ea7b)) +* trigger release ([f957279](https://github.com/snowdreamtech/UniStack/commit/f9572791f85db51cfa228471fbf55b79f6ad9f0a)) +* update Alibaba Cloud Linux 3 image and add Alibaba Cloud Linux 4 support in CI/CD workflows ([64bb458](https://github.com/snowdreamtech/UniStack/commit/64bb458a99446a9811cf80559963773c80bffee9)) +* update ansible dependencies in requirements.txt ([da527a9](https://github.com/snowdreamtech/UniStack/commit/da527a9393574decaeadc7135b1c8a3858236691)) +* update Ansible requirements to latest versions ([a1558c1](https://github.com/snowdreamtech/UniStack/commit/a1558c179f26fd0a850ef8b1b0ac7a45f55d1f7d)) +* update ansible requirements.txt dependencies ([6496e82](https://github.com/snowdreamtech/UniStack/commit/6496e82c21b175e94ae85b75b424fb75b5f52c75)) +* update apt cache parameter from yes to true for boolean consistency ([aabd5ab](https://github.com/snowdreamtech/UniStack/commit/aabd5abdb38adf5b92d13e4c4943250d41103595)) +* update base images to alpine 3.24.1 and debian 13.6.0 ([a1096c2](https://github.com/snowdreamtech/UniStack/commit/a1096c27797f144b45bc1ce0eefaa44c38b16a27)) +* update default registry URL to registry.unistack.sn0wdr1am.com across codebase and documentation ([7183cf8](https://github.com/snowdreamtech/UniStack/commit/7183cf8c9b38ae7d93079c33dc6f358cd89443a9)) +* update dependencies compress, sys, term, text, and libc ([7e9e98f](https://github.com/snowdreamtech/UniStack/commit/7e9e98f06c4b66de92e7ecd15939c9ca3afae76a)) +* update openssh service variable and initialize core role defaults ([9f36863](https://github.com/snowdreamtech/UniStack/commit/9f3686374e16723fe11f95d3675f6321307eb6b0)) +* update openssh_sshd_service to ssh for darwin compatibility ([e5dc824](https://github.com/snowdreamtech/UniStack/commit/e5dc824019ce88abf6baefc1d0650bcf397e2606)) +* update registry base URL from registry.unistack to registry-unistack ([14ad84f](https://github.com/snowdreamtech/UniStack/commit/14ad84fc6a4f28a75dac2ba4eb34cd6c5b41306a)) +* upgrade setup-unirtm action to v0.6.0 and UniRTM to v0.25.7 in workflows ([1088902](https://github.com/snowdreamtech/UniStack/commit/10889026cbc7ce16ab41407a099d74cf6a6eb89f)) +* **version:** bump version to 0.0.2 across Dockerfiles and VERSION ([456a909](https://github.com/snowdreamtech/UniStack/commit/456a9099828fdcee189baea964a4a47d7b6a983b)) + ## [0.1.0](https://github.com/snowdreamtech/UniStack/compare/v0.0.10...v0.1.0) (2026-08-09)