fix(ci): safely handle multi-line commit messages in deploy check (#194)

The previous implementation directly interpolated the commit message
into the shell script, which broke when messages contained newlines.
Words like "not" were being interpreted as shell commands.

Fix: Pass commit message via environment variable and write to temp file
before grepping, avoiding shell injection issues.
This commit is contained in:
Jatin K Malik
2026-02-12 08:44:27 -08:00
committed by GitHub
parent 17bf62be64
commit 04bb814a52
+8 -4
View File
@@ -45,20 +45,24 @@ jobs:
- '.github/workflows/**'
- name: Check if website should deploy
id: deploy_check
env:
COMMIT_MESSAGE: ${{ github.event.head_commit.message }}
run: |
# Deploy if web files changed OR python files changed (for version updates)
COMMIT_MESSAGE="${{ github.event.head_commit.message }}"
# Use heredoc to safely handle multi-line commit messages
COMMIT_MSG_FILE=$(mktemp)
printenv COMMIT_MESSAGE > "$COMMIT_MSG_FILE"
# Escape the commit message properly for shell comparison
# Use case-insensitive matching with grep instead of glob patterns
# Use case-insensitive matching with grep
if [[ "${{ steps.filter.outputs.web }}" == "true" ]] || \
[[ "${{ steps.filter.outputs.python }}" == "true" ]] || \
[[ "${{ github.event_name }}" == "workflow_dispatch" ]] || \
echo "$COMMIT_MESSAGE" | grep -iE "(feat\(website\)|docs\(website\)|chore\(website\)|fix\(website\)|refactor\(website\))"; then
grep -iE "(feat\(website\)|docs\(website\)|chore\(website\)|fix\(website\)|refactor\(website\))" "$COMMIT_MSG_FILE"; then
echo "deploy=true" >> $GITHUB_OUTPUT
else
echo "deploy=false" >> $GITHUB_OUTPUT
fi
rm -f "$COMMIT_MSG_FILE"
python-lint:
name: 🔍 Lint Python