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"