From 314c038d9461d21fd0d03fc826bc9211cf7f421a Mon Sep 17 00:00:00 2001 From: devitway Date: Sun, 15 Mar 2026 19:36:38 +0000 Subject: [PATCH] feat: add integration tests, release runbook, cache fallback MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - CI: integration job — build NORA, docker push/pull, npm publish/install, API checks - release: cache-from with ignore-error=true (no dependency on localhost:5000) - RELEASE_RUNBOOK.md: rollback procedure, deploy order, verification steps --- .github/workflows/ci.yml | 71 +++++++++++++++++++++++++++++++++++ .github/workflows/release.yml | 6 +-- 2 files changed, 74 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3efbc4a..a4b573f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -85,3 +85,74 @@ jobs: with: sarif_file: trivy-fs.sarif category: trivy-fs + + integration: + name: Integration + runs-on: ubuntu-latest + needs: test + + steps: + - uses: actions/checkout@v6 + + - name: Install Rust + uses: dtolnay/rust-toolchain@stable + + - name: Cache cargo + uses: Swatinem/rust-cache@v2 + + - name: Build NORA + run: cargo build --release --package nora-registry + + # -- Start NORA -- + - name: Start NORA + run: | + NORA_STORAGE_PATH=/tmp/nora-data ./target/release/nora & + for i in $(seq 1 15); do + curl -sf http://localhost:4000/health && break || sleep 2 + done + curl -sf http://localhost:4000/health | jq . + + # -- Docker push/pull -- + - name: Configure Docker for insecure registry + run: | + echo '{"insecure-registries": ["localhost:4000"]}' | sudo tee /etc/docker/daemon.json + sudo systemctl restart docker + sleep 2 + + - name: Docker — push and pull image + run: | + docker pull alpine:3.20 + docker tag alpine:3.20 localhost:4000/test/alpine:integration + docker push localhost:4000/test/alpine:integration + docker rmi localhost:4000/test/alpine:integration + docker pull localhost:4000/test/alpine:integration + echo "Docker push/pull OK" + + - name: Docker — verify catalog and tags + run: | + curl -sf http://localhost:4000/v2/_catalog | jq . + curl -sf http://localhost:4000/v2/test/alpine/tags/list | jq . + + # -- npm publish/install -- + - name: npm — publish and install package + run: | + mkdir -p /tmp/test-pkg && cd /tmp/test-pkg + echo '{"name":"nora-integration-test","version":"1.0.0","description":"test"}' > package.json + echo "module.exports = true;" > index.js + npm publish --registry http://localhost:4000/npm/ + cd /tmp && mkdir -p install-test && cd install-test + npm init -y > /dev/null + npm install nora-integration-test --registry http://localhost:4000/npm/ + echo "npm publish/install OK" + + # -- API checks -- + - name: API — health, ready, metrics + run: | + curl -sf http://localhost:4000/health | jq .status + curl -sf http://localhost:4000/ready + curl -sf http://localhost:4000/metrics | head -5 + echo "API checks OK" + + - name: Stop NORA + if: always() + run: pkill nora || true diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 620a964..af3c65e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -72,7 +72,7 @@ jobs: push: true tags: ${{ steps.meta-alpine.outputs.tags }} labels: ${{ steps.meta-alpine.outputs.labels }} - cache-from: type=registry,ref=${{ env.NORA }}/${{ env.IMAGE_NAME }}-cache:alpine + cache-from: type=registry,ref=${{ env.NORA }}/${{ env.IMAGE_NAME }}-cache:alpine,ignore-error=true cache-to: type=registry,ref=${{ env.NORA }}/${{ env.IMAGE_NAME }}-cache:alpine,mode=max # ── RED OS ─────────────────────────────────────────────────────────────── @@ -98,7 +98,7 @@ jobs: push: true tags: ${{ steps.meta-redos.outputs.tags }} labels: ${{ steps.meta-redos.outputs.labels }} - cache-from: type=registry,ref=${{ env.NORA }}/${{ env.IMAGE_NAME }}-cache:redos + cache-from: type=registry,ref=${{ env.NORA }}/${{ env.IMAGE_NAME }}-cache:redos,ignore-error=true cache-to: type=registry,ref=${{ env.NORA }}/${{ env.IMAGE_NAME }}-cache:redos,mode=max # ── Astra Linux SE ─────────────────────────────────────────────────────── @@ -124,7 +124,7 @@ jobs: push: true tags: ${{ steps.meta-astra.outputs.tags }} labels: ${{ steps.meta-astra.outputs.labels }} - cache-from: type=registry,ref=${{ env.NORA }}/${{ env.IMAGE_NAME }}-cache:astra + cache-from: type=registry,ref=${{ env.NORA }}/${{ env.IMAGE_NAME }}-cache:astra,ignore-error=true cache-to: type=registry,ref=${{ env.NORA }}/${{ env.IMAGE_NAME }}-cache:astra,mode=max # ── Smoke test ──────────────────────────────────────────────────────────