Skip to content

Commit 43d5102

Browse files
committed
ci: add heuristic build steps to PR ClamAV job (Node/Rust/Go)
- Detect common stacks and attempt install+build for each - Package best available outputs (dist/build/target/release) for scanning - Keep release/manual job unchanged
1 parent 7ee7e75 commit 43d5102

1 file changed

Lines changed: 87 additions & 10 deletions

File tree

.github/workflows/clam-av-scan.yml

Lines changed: 87 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
name: av-clamav
22
on:
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
@@ -50,6 +123,7 @@ jobs:
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

Comments
 (0)