@@ -9,38 +9,59 @@ FINDING_FILE="$2"
99
1010echo " Fixing unpinned actions in $REPO_PATH ..."
1111
12- # Common action SHA pins (updated 2025-12-15 )
12+ # Common action SHA pins (updated 2026-02-04 )
1313declare -A ACTION_PINS=(
14- [" actions/checkout@v4" ]=" b4ffde65f46336ab88eb53be808477a3936bae11 "
15- [" actions/upload-artifact@v4 " ]=" 65c79d7f54e76e4e3c7a8f34db0f4ac8b515c478 "
16- [" github/codeql-action/init@v3" ]=" 662472033e021d55d94146f66f6058822b0b39fd "
17- [" github/codeql-action/analyze@v3" ]=" 662472033e021d55d94146f66f6058822b0b39fd "
18- [" github/codeql-action/upload-sarif@v3" ]=" 662472033e021d55d94146f66f6058822b0b39fd "
14+ [" actions/checkout@v4" ]=" 34e114876b0b11c390a56381ad16ebd13914f8d5 "
15+ [" actions/checkout@v5 " ]=" 93cb6efe18208431cddfb8368fd83d5badbf9bfd "
16+ [" github/codeql-action/init@v3" ]=" 6624720a57d4c312633c7b953db2f2da5bcb4c3a "
17+ [" github/codeql-action/analyze@v3" ]=" 6624720a57d4c312633c7b953db2f2da5bcb4c3a "
18+ [" github/codeql-action/upload-sarif@v3" ]=" 6624720a57d4c312633c7b953db2f2da5bcb4c3a "
1919 [" ossf/scorecard-action@v2.4.0" ]=" 62b2cac7ed8198b15735ed49ab1e5cf35480ba46"
20- [" trufflesecurity/trufflehog@v3" ]=" 8a8ef8526528d8a4ff3e2c90be08e25ef8efbd9b"
21- [" editorconfig-checker/action-editorconfig-checker@main" ]=" 9f8f6065f4db902c0c56cafa67cea18b3ebbb680"
20+ [" trufflesecurity/trufflehog@main" ]=" 7ee2e0fdffec27d19ccbb8fb3dcf8a83b9d7f9e8"
21+ [" editorconfig-checker/action-editorconfig-checker@main" ]=" 4054fa83a075fdf090bd098bdb1c09aaf64a4169"
22+ [" dtolnay/rust-toolchain@stable" ]=" 4be9e76fd7c4901c61fb841f559994984270fce7"
23+ [" Swatinem/rust-cache@v2" ]=" 779680da715d629ac1d338a641029a2f4372abb5"
24+ [" codecov/codecov-action@v5" ]=" 671740ac38dd9b0130fbe1cec585b89eea48d3de"
25+ [" slsa-framework/slsa-github-generator@v2.1.0" ]=" f7dd8c54c2067bafc12ca7a55595d5ee9b75204a"
26+ [" webfactory/ssh-agent@v0.9.0" ]=" dc588b651fe13675774614f8e6a936a468676387"
27+ [" ocaml/setup-ocaml@v3" ]=" dec6499fef64fc5d7ed43d43a87251b7b1c306f5"
28+ [" softprops/action-gh-release@v2" ]=" a06a81a03ee405af7f2048a818ed3f03bbf83c7b"
29+ [" actions/configure-pages@v5" ]=" 983d7736d9b0ae728b81ab479565c72886d7745b"
30+ [" actions/jekyll-build-pages@v1" ]=" 44a6e6beabd48582f863aeeb6cb2151cc1716697"
31+ [" actions/upload-pages-artifact@v3" ]=" 56afc609e74202658d3ffba0e8f6dda462b719fa"
32+ [" actions/deploy-pages@v4" ]=" d6db90164ac5ed86f2b6aed7e0febac5b3c0c03e"
33+ [" ruby/setup-ruby@v1" ]=" 09a7688d3b55cf0e976497ff046b70949eeaccfd"
34+ [" actions/upload-artifact@v4" ]=" 65c79d7f54e76e4e3c7a8f34db0f4ac8b515c478"
2235)
2336
24- # Extract file path from finding
25- WORKFLOW_FILE=$( jq -r ' .location.file' " $FINDING_FILE " )
26- WORKFLOW_PATH=" $REPO_PATH /$WORKFLOW_FILE "
37+ # Find all workflow files in repo
38+ FIXED_COUNT=0
39+ while IFS= read -r -d ' ' workflow; do
40+ rel_path=" ${workflow# $REPO_PATH / } "
41+ changed=false
2742
28- if [[ ! -f " $WORKFLOW_PATH " ]] ; then
29- echo " ERROR: Workflow file not found: $WORKFLOW_PATH "
30- exit 1
31- fi
43+ for action_version in " ${ ! ACTION_PINS[@]} " ; do
44+ SHA= " ${ACTION_PINS[$action_version]} "
45+ ACTION_NAME= " ${action_version %@* } "
46+ VERSION= " ${action_version #*@ } "
3247
33- # Pin actions to SHA
34- for action_version in " ${! ACTION_PINS[@]} " ; do
35- SHA=" ${ACTION_PINS[$action_version]} "
36- ACTION_NAME=" ${action_version%@* } "
37- VERSION=" ${action_version#*@ } "
48+ # Replace unpinned action with SHA-pinned version
49+ # Match both "uses: action@version" and "uses: action@version # comment"
50+ if grep -q " uses: ${action_version} " " $workflow " 2> /dev/null; then
51+ sed -i " s|uses: ${action_version} |uses: ${ACTION_NAME} @${SHA} # ${VERSION} |g" " $workflow "
52+ echo " Pinned ${ACTION_NAME} (${VERSION} ) in ${rel_path} "
53+ changed=true
54+ fi
55+ done
3856
39- # Replace unpinned action with SHA-pinned version
40- if grep -q " uses: ${action_version} " " $WORKFLOW_PATH " ; then
41- sed -i " s|uses: ${action_version} |uses: ${ACTION_NAME} @${SHA} # ${VERSION} |g" " $WORKFLOW_PATH "
42- echo " ✓ Pinned ${ACTION_NAME} to ${SHA} "
57+ if [[ " $changed " == " true" ]]; then
58+ (( FIXED_COUNT++ )) || true
4359 fi
44- done
60+ done < <( find " $REPO_PATH /.github/workflows " -type f \( -name " *.yml " -o -name " *.yaml " \) -print0 2> /dev/null )
4561
46- echo " ✅ Unpinned actions fixed in $WORKFLOW_FILE "
62+ echo " "
63+ if [[ " $FIXED_COUNT " -gt 0 ]]; then
64+ echo " Pinned actions in $FIXED_COUNT workflow(s)"
65+ else
66+ echo " No unpinned actions found"
67+ fi
0 commit comments