11name : av-clamav
22on :
33 workflow_dispatch :
4+ inputs :
5+ tag :
6+ description : ' Release tag to scan (e.g., v0.15.16)'
7+ required : false
48 release :
59 types : [published]
610 pull_request :
@@ -16,31 +20,100 @@ jobs:
1620 runs-on : ubuntu-latest
1721 steps :
1822 - uses : actions/checkout@v4
23+
24+ - name : Detect repo meta
25+ id : meta
26+ run : |
27+ echo "has_package_json=$([ -f package.json ] && echo true || echo false)" >> "$GITHUB_OUTPUT"
28+ echo "has_pnpm_lock=$([ -f pnpm-lock.yaml ] && echo true || echo false)" >> "$GITHUB_OUTPUT"
29+ echo "has_yarn_lock=$([ -f yarn.lock ] && echo true || echo false)" >> "$GITHUB_OUTPUT"
30+ echo "has_package_lock=$([ -f package-lock.json ] && echo true || echo false)" >> "$GITHUB_OUTPUT"
31+ echo "has_cargo=$([ -n \"$(git ls-files | grep -E '(^|/)Cargo.toml$')\" ] && echo true || echo false)" >> "$GITHUB_OUTPUT"
32+ echo "has_go=$([ -f go.mod ] && echo true || echo false)" >> "$GITHUB_OUTPUT"
33+
34+ - name : Setup Node
35+ if : steps.meta.outputs.has_package_json == 'true'
36+ uses : actions/setup-node@v4
37+ with :
38+ node-version : ' 20'
39+
40+ - name : Setup pnpm
41+ if : steps.meta.outputs.has_pnpm_lock == 'true'
42+ uses : pnpm/action-setup@v4
43+ with :
44+ version : 9
45+
46+ - name : Install deps (Node)
47+ if : steps.meta.outputs.has_package_json == 'true'
48+ run : |
49+ if [ "${{ steps.meta.outputs.has_pnpm_lock }}" = "true" ]; then pnpm install --frozen-lockfile || pnpm install; exit 0; fi
50+ if [ "${{ steps.meta.outputs.has_package_lock }}" = "true" ]; then npm ci || npm i; exit 0; fi
51+ if [ "${{ steps.meta.outputs.has_yarn_lock }}" = "true" ]; then yarn install --frozen-lockfile || yarn install; exit 0; fi
52+ echo "No Node lockfile found; skipping install"
53+
54+ - name : Build (Node)
55+ if : steps.meta.outputs.has_package_json == 'true'
56+ run : |
57+ set -e
58+ pnpm run -c build || pnpm -r build || pnpm -w build || \n npm run build || yarn build || echo 'No Node build script succeeded; continuing'
59+
60+ - name : Setup Rust
61+ if : steps.meta.outputs.has_cargo == 'true'
62+ uses : dtolnay/rust-toolchain@stable
63+
64+ - name : Build (Rust)
65+ if : steps.meta.outputs.has_cargo == 'true'
66+ run : cargo build --release
67+
68+ - name : Setup Go
69+ if : steps.meta.outputs.has_go == 'true'
70+ uses : actions/setup-go@v5
71+ with :
72+ go-version : ' 1.22.x'
73+
74+ - name : Build (Go)
75+ if : steps.meta.outputs.has_go == 'true'
76+ run : |
77+ set -e
78+ mkdir -p dist
79+ if ls cmd >/dev/null 2>&1; then
80+ for d in cmd/*; do name=$(basename "$d"); go build -o "dist/$name" "./$d"; done
81+ else
82+ go build -o dist/opencode ./...
83+ fi
84+
85+ - name : Package build outputs
86+ run : |
87+ set -e
88+ mkdir -p dist-pr
89+ if [ -d dist ]; then zip -qr dist-pr/scan.zip dist
90+ elif [ -d build ]; then zip -qr dist-pr/scan.zip build
91+ elif [ -d target/release ]; then zip -qr dist-pr/scan.zip target/release
92+ else zip -qr dist-pr/scan.zip . -x '.git/*' '.github/*'
93+ fi
94+
1995 - name : Install ClamAV
2096 run : |
2197 sudo apt-get update
2298 sudo apt-get install -y clamav
2399 sudo freshclam || true
24- - name : Prepare PR scan payload
25- run : |
26- mkdir -p dist-pr
27- if [ -d dist ]; then tar -czf dist-pr/scan.tgz -C dist .; \
28- elif [ -d build ]; then tar -czf dist-pr/scan.tgz -C build .; \
29- else tar -czf dist-pr/scan.tgz --exclude=.git --exclude=.github .; fi
100+
30101 - name : ClamAV scan (PR)
31102 run : |
32103 clamscan -ri --scan-archive=yes dist-pr | tee clamav-pr.log
33- ! grep -q "Infected files: [1-9]" clamav-pr.log
104+ ! grep -q 'Infected files: [1-9]' clamav-pr.log
105+
34106 - name : Upload PR scan results
35107 uses : actions/upload-artifact@v4
36108 with :
37109 name : clamav-pr-scan-results
38110 path : |
39111 clamav-pr.log
40- dist-pr/scan.tgz
112+ dist-pr/scan.zip
41113
42114 clamav-scan :
43115 if : github.event_name == 'release' || github.event_name == 'workflow_dispatch'
116+ name : ClamAV scan (release assets)
44117 runs-on : ubuntu-latest
45118 permissions :
46119 contents : read
50123 sudo apt-get update
51124 sudo apt-get install -y clamav
52125 sudo freshclam || true
126+
53127 - name : Resolve release tag
54128 id : resolve_tag
55129 env :
@@ -58,18 +132,21 @@ jobs:
58132 tag="${{ github.event.release.tag_name }}"
59133 if [ -z "$tag" ]; then tag="${{ github.event.inputs.tag }}"; fi
60134 if [ -z "$tag" ]; then tag="$(gh release list --limit 1 --json tagName -q '.[0].tagName')"; fi
61- if [ -z "$tag" ]; then echo " No release tag found" >&2; exit 1; fi
135+ if [ -z "$tag" ]; then echo ' No release tag found' >&2; exit 1; fi
62136 echo "tag=$tag" >> "$GITHUB_OUTPUT"
137+
63138 - name : Download assets
64139 env :
65140 GH_TOKEN : ${{ secrets.GITHUB_TOKEN }}
66141 run : |
67142 mkdir -p dist-release
68143 gh release download "${{ steps.resolve_tag.outputs.tag }}" --dir dist-release --clobber
144+
69145 - name : Scan with ClamAV (release assets)
70146 run : |
71147 clamscan -ri dist-release | tee clamav.log
72- ! grep -q "Infected files: [1-9]" clamav.log
148+ ! grep -q 'Infected files: [1-9]' clamav.log
149+
73150 - name : Upload scan results
74151 uses : actions/upload-artifact@v4
75152 with :
0 commit comments