Skip to content

Commit 1761693

Browse files
committed
ci: guard AV workflows on PRs + robust tag resolution
- add job-level if: to run only on release/workflow_dispatch - add Resolve release tag step (supports manual input + last release fallback) - harden MpCmdRun.exe resolution on windows-latest This prevents PR runs from failing when github.event.release.tag_name is undefined and makes manual runs usable.
1 parent 5fc9d80 commit 1761693

2 files changed

Lines changed: 42 additions & 11 deletions

File tree

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

Lines changed: 17 additions & 1 deletion
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:
@@ -12,6 +16,7 @@ permissions:
1216

1317
jobs:
1418
clamav-scan:
19+
if: github.event_name == 'release' || github.event_name == 'workflow_dispatch'
1520
name: ClamAV scan (release assets)
1621
runs-on: ubuntu-latest
1722
permissions:
@@ -23,12 +28,23 @@ jobs:
2328
sudo apt-get install -y clamav
2429
sudo freshclam || true
2530
31+
- name: Resolve release tag
32+
id: resolve_tag
33+
env:
34+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
35+
run: |
36+
tag="${{ github.event.release.tag_name }}"
37+
if [ -z "$tag" ]; then tag="${{ github.event.inputs.tag }}"; fi
38+
if [ -z "$tag" ]; then tag="$(gh release list --limit 1 --json tagName -q '.[0].tagName')"; fi
39+
if [ -z "$tag" ]; then echo "No release tag found" >&2; exit 1; fi
40+
echo "tag=$tag" >> "$GITHUB_OUTPUT"
41+
2642
- name: Download assets
2743
env:
2844
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
2945
run: |
3046
mkdir -p dist-release
31-
gh release download "${{ github.event.release.tag_name }}" --dir dist-release --clobber
47+
gh release download "${{ steps.resolve_tag.outputs.tag }}" --dir dist-release --clobber
3248
3349
- name: Scan with ClamAV
3450
run: |

.github/workflows/windows-defender-scan.yml

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
name: av-windows-defender
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:
@@ -13,6 +17,7 @@ permissions:
1317

1418
jobs:
1519
defender-scan:
20+
if: github.event_name == 'release' || github.event_name == 'workflow_dispatch'
1621
name: Windows Defender scan (release assets)
1722
runs-on: windows-latest
1823
permissions:
@@ -23,41 +28,51 @@ jobs:
2328
shell: pwsh
2429
run: New-Item -ItemType Directory -Force -Path dist-release | Out-Null
2530

31+
- name: Resolve release tag
32+
id: resolve_tag
33+
shell: pwsh
34+
env:
35+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
36+
run: |
37+
$tag = "${{ github.event.release.tag_name }}"
38+
if (-not $tag) { $tag = "${{ github.event.inputs.tag }}" }
39+
if (-not $tag) { $tag = (gh release list --limit 1 --json tagName -q ".[0].tagName") }
40+
if (-not $tag) { throw 'No release tag found' }
41+
"tag=$tag" | Out-File -FilePath $env:GITHUB_OUTPUT -Append
42+
2643
- name: Download assets for this release
2744
shell: pwsh
2845
env:
2946
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
3047
run: |
31-
if (-not "${{ github.event.release.tag_name }}") {
32-
throw "This workflow requires a release context or manual tag input."
33-
}
34-
gh release download "${{ github.event.release.tag_name }}" --dir dist-release --clobber
48+
gh release download "${{ steps.resolve_tag.outputs.tag }}" --dir dist-release --clobber
3549
3650
- name: List assets
3751
shell: pwsh
38-
run: Get-ChildItem -File dist-release | Select-Object FullName, Length | Format-Table | Out-String | Tee-Object -FilePath dist-release\\asset-list.txt
52+
run: Get-ChildItem -File dist-release | Select-Object FullName, Length | Format-Table | Out-String | Tee-Object -FilePath dist-release\asset-list.txt
3953

4054
- name: Scan each asset with Defender
4155
shell: pwsh
4256
run: |
43-
$mp = "$env:ProgramFiles\\Windows Defender\\MpCmdRun.exe"
44-
$detections = @()
57+
$mp = (Get-Command MpCmdRun.exe -ErrorAction SilentlyContinue).Source
58+
if (-not $mp) { $mp = "$env:ProgramFiles\Windows Defender\MpCmdRun.exe" }
59+
if (-not (Test-Path $mp)) { throw 'MpCmdRun.exe not found' }
4560
Get-ChildItem -File dist-release | ForEach-Object {
4661
Write-Host "Scanning $($_.FullName)"
4762
& $mp -Scan -ScanType 3 -File $_.FullName
4863
Start-Sleep -Seconds 3
4964
}
50-
# Collect *recent* detections (last 30 minutes) and only for our folder
65+
# Collect recent detections (last 30 minutes) and only for our folder
5166
$since = (Get-Date).AddMinutes(-30)
5267
$recent = Get-MpThreatDetection | Where-Object {
5368
$_.InitialDetectionTime -ge $since -and
5469
$_.Resources -and ($_.Resources.Resource -match [Regex]::Escape((Resolve-Path "dist-release").Path))
5570
}
5671
if ($recent) {
57-
$recent | ConvertTo-Json -Depth 5 | Out-File dist-release\\defender-detections.json -Encoding UTF8
72+
$recent | ConvertTo-Json -Depth 5 | Out-File dist-release\defender-detections.json -Encoding UTF8
5873
Write-Error "Windows Defender found detections. See artifact."
5974
} else {
60-
'{"status":"clean"}' | Out-File dist-release\\defender-detections.json -Encoding UTF8
75+
'{"status":"clean"}' | Out-File dist-release\defender-detections.json -Encoding UTF8
6176
}
6277
6378
- name: Upload scan results

0 commit comments

Comments
 (0)