/ .forgejo / workflows / ci.yml
ci.yml
  1  name: ACDC Forge CI
  2  
  3  concurrency:
  4    group: ci-${{ github.ref }}
  5    cancel-in-progress: true
  6  
  7  on:
  8    push:
  9      branches: [main, develop, 'feat/*']
 10    pull_request:
 11      branches: [main]
 12    workflow_dispatch:
 13  
 14  jobs:
 15    adl-build:
 16      name: Build ADL Programs
 17      runs-on: native
 18      steps:
 19        - uses: actions/checkout@v4
 20  
 21        - name: Check ADL availability
 22          id: adl-check
 23          run: |
 24            if command -v adl &> /dev/null; then
 25              echo "available=true" >> $GITHUB_OUTPUT
 26            else
 27              echo "available=false" >> $GITHUB_OUTPUT
 28              echo "ADL compiler not available, skipping build steps"
 29            fi
 30  
 31        - name: Build forge_alpha
 32          if: steps.adl-check.outputs.available == 'true'
 33          run: |
 34            cd programs/forge_alpha
 35            adl build
 36  
 37        - name: Build forge_delta
 38          if: steps.adl-check.outputs.available == 'true'
 39          run: |
 40            cd programs/forge_delta
 41            adl build
 42  
 43        - name: Test forge_alpha
 44          if: steps.adl-check.outputs.available == 'true'
 45          run: |
 46            cd programs/forge_alpha
 47            adl test
 48  
 49        - name: Test forge_delta
 50          if: steps.adl-check.outputs.available == 'true'
 51          run: |
 52            cd programs/forge_delta
 53            adl test
 54  
 55        - name: Validate ADL source files
 56          run: |
 57            echo "Validating ADL program files exist..."
 58            test -f programs/forge_alpha/src/main.adl
 59            test -f programs/forge_delta/src/main.adl
 60            echo "ADL source files validated"
 61  
 62    frontend:
 63      name: Frontend Build
 64      runs-on: native
 65      steps:
 66        - uses: actions/checkout@v4
 67  
 68        - name: Setup Node
 69          uses: actions/setup-node@v4
 70          with:
 71            node-version: '20'
 72  
 73        - name: Setup acdc-design dependency
 74          run: |
 75            # Clone acdc-design to match file:../../acdc-design reference
 76            git clone --depth 1 http://10.106.0.2:3000/alpha-delta-network/acdc-design.git ../acdc-design
 77            cd ../acdc-design
 78            npm ci
 79            npm run build
 80  
 81        - name: Install dependencies
 82          run: |
 83            cd frontend
 84            rm -f package-lock.json pnpm-lock.yaml
 85            npm install
 86  
 87        - name: Type check
 88          run: cd frontend && npm run typecheck
 89  
 90        - name: Build
 91          run: cd frontend && npm run build
 92  
 93        - name: Test
 94          run: |
 95            cd frontend
 96            if find src -name "*.test.*" -o -name "*.spec.*" | grep -q .; then
 97              npm run test
 98            else
 99              echo "No test files found, skipping tests"
100            fi
101  
102    backend:
103      name: Backend Tests
104      runs-on: native
105      steps:
106        - uses: actions/checkout@v4
107  
108        - name: Setup Python
109          uses: actions/setup-python@v5
110          with:
111            python-version: '3.11'
112  
113        - name: Create venv and install dependencies
114          run: |
115            cd backend
116            python -m venv .venv
117            .venv/bin/pip install --upgrade pip
118            .venv/bin/pip install -r requirements.txt
119  
120        - name: Test
121          run: |
122            cd backend
123            .venv/bin/python -m pytest -v
124  
125    radicle-push:
126      name: Radicle Sync
127      runs-on: native
128      needs: [adl-build, frontend, backend]
129      if: github.ref == 'refs/heads/main' && (github.event_name == 'push' || github.event_name == 'workflow_dispatch')
130      steps:
131        - name: Checkout from Forgejo
132          uses: actions/checkout@v4
133          with:
134            fetch-depth: 0
135            path: forgejo-src
136  
137        - name: Sync to Radicle
138          run: |
139            set -euo pipefail
140            export PATH=$HOME/.radicle/bin:$PATH
141            RID="rad:z33myzrxtsEkX7ECATqMPz5FFTe5g"
142  
143            # Check if rad is available (skip if not installed on runner)
144            if ! command -v rad &> /dev/null; then
145              echo "Radicle CLI not available on this runner, skipping sync"
146              exit 0
147            fi
148  
149            rm -rf radicle-repo
150  
151            NODE_ID=$(rad self --nid 2>/dev/null || rad self | grep -oP 'Node ID \(NID\): \K[a-z0-9]+')
152            if [ -z "$NODE_ID" ]; then
153              echo "ERROR: Could not determine Radicle node ID"
154              exit 1
155            fi
156            echo "Local node ID: $NODE_ID"
157  
158            if ! rad clone "$RID" radicle-repo 2>&1; then
159              echo "rad clone failed, initializing from Forgejo source"
160              rm -rf radicle-repo
161              mkdir -p radicle-repo
162              cd radicle-repo
163              git init
164              git remote add rad "rad://${RID#rad:}/${NODE_ID}"
165              git remote add forgejo ../forgejo-src
166              git fetch forgejo main
167              git checkout -b main forgejo/main
168              git push rad main
169              echo "Radicle sync complete (initialized)"
170              exit 0
171            fi
172  
173            cd radicle-repo
174            git remote add forgejo ../forgejo-src 2>/dev/null || git remote set-url forgejo ../forgejo-src
175            git fetch forgejo main
176            git checkout main 2>/dev/null || git checkout -b main
177  
178            if ! git merge --ff-only forgejo/main 2>/dev/null; then
179              echo "Fast-forward failed, forcing sync to Forgejo state"
180              git reset --hard forgejo/main
181            fi
182  
183            EXPECTED_COMMIT=$(git rev-parse HEAD)
184            echo "Expected commit: $EXPECTED_COMMIT"
185  
186            git push rad main
187  
188            sleep 2
189            RADICLE_HEAD=$(git -C ~/.radicle/storage/${RID#rad:} rev-parse --short=7 HEAD 2>/dev/null || echo "unknown")
190            if [ "${EXPECTED_COMMIT:0:7}" = "$RADICLE_HEAD" ]; then
191              echo "Radicle sync verified: $RADICLE_HEAD"
192            else
193              echo "ERROR: Radicle sync verification failed"
194              echo "Expected: ${EXPECTED_COMMIT:0:7}, Got: $RADICLE_HEAD"
195              exit 1
196            fi
197            echo "Radicle sync complete"