#!/usr/bin/env bash # Copyright (c) Meta Platforms, Inc. and affiliates. # All rights reserved. # # This source code is licensed under the terms described in the LICENSE file in # the root directory of this source tree. # # Fails if any GitHub Actions workflow uses an external action without a full SHA pin. set -euo pipefail failed=0 # Find all workflow YAML files # Use GitHub Actions error format # ::error file={name},line={line},col={col}::{message} for file in $(find .github/workflows/ -type f \( -name "*.yml" -o -name "*.yaml" \)); do IFS=$'\n' # Get line numbers for each 'uses:' while IFS= read -r match; do line_num=$(echo "$match" | cut -d: -f1) line=$(echo "$match" | cut -d: -f2-) ref=$(echo "$line" | sed -E 's/.*@([A-Za-z0-9._-]+).*/\1/') if ! [[ $ref =~ ^[0-9a-fA-F]{40}$ ]]; then # Output in GitHub Actions annotation format echo "::error file=$file,line=$line_num::uses non-SHA action ref: $line" failed=1 fi done < <(grep -n -E '^.*uses:[^@]+@[^ ]+' "$file") done exit $failed