GitHub Git Status Check Action
Overview
The actions/github/gitStatusCheck action determines whether specific files have been modified by checking git status for YAML files (*.yml and *.yaml). This action is
useful for conditional workflow execution, allowing subsequent jobs to run only when relevant files have changed.
Language/Tool Support
- Git: Git repository status checking
- YAML: Focuses on YAML file changes (*.yml, *.yaml)
- Shell Scripts: Bash-based implementation
- GitHub Actions: Integration with GitHub Actions workflow logic
Features
- Selective File Monitoring: Monitors only YAML files for changes
- Branch-based Checking: Configurable branch for comparison
- Output Generation: Provides boolean output for workflow decisions
- Lightweight Execution: Fast execution with minimal resource usage
- Conditional Workflows: Enables conditional job execution
Usage
- name: Check YAML File Changes
id: yaml-check
uses: ./actions/github/gitStatusCheck
with:
branch: main
- name: Run YAML Processing
if: steps.yaml-check.outputs.shouldRun == 'true'
run: echo "YAML files have changed, processing..."
Inputs
| Input | Type | Required | Default | Description |
|---|---|---|---|---|
branch | string | ❌ | main | Branch to compare changes against |
Outputs
| Output | Type | Description |
|---|---|---|
shouldRun | boolean | Whether YAML files were modified (true/false) |
Action Implementation
- Script: Bash entrypoint script (
entrypoint.sh) - File Types: Monitors
*.ymland*.yamlfiles - Git Commands: Uses git status and diff commands
- Environment: Uses
BRANCH_NAMEenvironment variable
Usage Examples
Conditional Workflow Execution
name: YAML File Processing
on:
pull_request:
branches: [main]
jobs:
check-yaml-changes:
runs-on: ubuntu-latest
outputs:
yaml-changed: ${{ steps.check.outputs.shouldRun }}
steps:
- uses: actions/checkout@v4
- name: Check for YAML Changes
id: check
uses: ./actions/github/gitStatusCheck
with:
branch: main
process-yaml:
needs: check-yaml-changes
if: needs.check-yaml-changes.outputs.yaml-changed == 'true'
runs-on: ubuntu-latest
steps:
- name: Process YAML Files
run: echo "Processing YAML files..."
Workflow Configuration Validation
name: Workflow Validation
on:
pull_request:
paths:
- '.github/workflows/**'
jobs:
check-workflow-changes:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Check Workflow File Changes
id: workflow-check
uses: ./actions/github/gitStatusCheck
with:
branch: ${{ github.base_ref }}
- name: Validate workflows
if: steps.workflow-check.outputs.shouldRun == 'true'
run: |
echo "Workflow files changed, running validation..."
# Add workflow validation logic here
Docker Compose Updates
name: Docker Compose Validation
on:
push:
branches: [develop, staging]
jobs:
check-compose-changes:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Check Docker Compose Changes
id: compose-check
uses: ./actions/github/gitStatusCheck
with:
branch: main
- name: Validate Docker Compose
if: steps.compose-check.outputs.shouldRun == 'true'
run: |
echo "Docker Compose files changed"
docker-compose config --quiet
Kubernetes Manifest Updates
name: Kubernetes Validation
on:
pull_request:
paths:
- 'k8s/**'
- 'kubernetes/**'
jobs:
check-k8s-changes:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Check Kubernetes Manifest Changes
id: k8s-check
uses: ./actions/github/gitStatusCheck
with:
branch: ${{ github.base_ref }}
- name: Validate Kubernetes Manifests
if: steps.k8s-check.outputs.shouldRun == 'true'
run: |
echo "Kubernetes manifests changed"
kubectl apply --dry-run=client -f k8s/
Integration Patterns
Multi-Stage Conditional Pipeline
name: Conditional Pipeline
on:
pull_request:
jobs:
detect-changes:
runs-on: ubuntu-latest
outputs:
yaml-changed: ${{ steps.yaml.outputs.shouldRun }}
steps:
- uses: actions/checkout@v4
- name: Check YAML Changes
id: yaml
uses: ./actions/github/gitStatusCheck
validate-yaml:
needs: detect-changes
if: needs.detect-changes.outputs.yaml-changed == 'true'
runs-on: ubuntu-latest
steps:
- name: Validate YAML Syntax
run: yamllint .
deploy-config:
needs: [detect-changes, validate-yaml]
if: needs.detect-changes.outputs.yaml-changed == 'true'
runs-on: ubuntu-latest
steps:
- name: Deploy Configuration
run: echo "Deploying updated configuration..."
Branch-Specific Validation
name: Branch-Specific Checks
on:
push:
branches: [main, develop, release/*]
jobs:
check-changes:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Check Changes Against Main
id: main-check
uses: ./actions/github/gitStatusCheck
with:
branch: main
- name: Production Deployment
if: github.ref == 'refs/heads/main' && steps.main-check.outputs.shouldRun == 'true'
run: echo "Deploying to production..."
- name: Staging Deployment
if: github.ref == 'refs/heads/develop' && steps.main-check.outputs.shouldRun == 'true'
run: echo "Deploying to staging..."
Performance Optimization
name: Optimized Pipeline
on:
pull_request:
jobs:
quick-checks:
runs-on: ubuntu-latest
outputs:
should-run-expensive: ${{ steps.check.outputs.shouldRun }}
steps:
- uses: actions/checkout@v4
- name: Check for Configuration Changes
id: check
uses: ./actions/github/gitStatusCheck
expensive-validation:
needs: quick-checks
if: needs.quick-checks.outputs.should-run-expensive == 'true'
runs-on: ubuntu-latest
steps:
- name: Run Expensive Validation
run: |
echo "Running comprehensive validation..."
# Resource-intensive validation only when needed
File Detection Logic
The action checks for changes in:
Included File Types
*.yml- YAML files*.yaml- YAML files (alternative extension)
Common Use Cases
- GitHub Workflows:
.github/workflows/*.yml - Docker Compose:
docker-compose.yml,docker-compose.yaml - Kubernetes:
*.yaml,*.ymlin k8s directories - Configuration:
config.yml,application.yaml - CI/CD: Various pipeline configuration files
Branch Comparison
The action compares the current state against the specified branch:
Default Behavior
# Compares against main branch
uses: ./actions/github/gitStatusCheck
Custom Branch
# Compares against develop branch
uses: ./actions/github/gitStatusCheck
with:
branch: develop
Dynamic Branch
# Compares against PR base branch
uses: ./actions/github/gitStatusCheck
with:
branch: ${{ github.base_ref }}
Environment Configuration
The action uses environment variables:
BRANCH_NAME: Branch to compare against (from input)
Use Cases
Configuration Management
Monitor configuration file changes:
name: Config Change Detection
on:
pull_request:
paths:
- 'config/**'
jobs:
config-check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Check Config Changes
id: config
uses: ./actions/github/gitStatusCheck
- name: Validate Configuration
if: steps.config.outputs.shouldRun == 'true'
run: echo "Configuration changed, validating..."
Infrastructure as Code
Monitor infrastructure changes:
name: Infrastructure Validation
on:
pull_request:
paths:
- 'infrastructure/**'
- 'terraform/**'
jobs:
infra-check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Check Infrastructure Changes
id: infra
uses: ./actions/github/gitStatusCheck
- name: Plan Infrastructure
if: steps.infra.outputs.shouldRun == 'true'
run: terraform plan
Deployment Automation
Conditional deployment based on changes:
name: Smart Deployment
on:
push:
branches: [main]
jobs:
check-deployment-needed:
runs-on: ubuntu-latest
outputs:
deploy: ${{ steps.check.outputs.shouldRun }}
steps:
- uses: actions/checkout@v4
- name: Check Deployment Files
id: check
uses: ./actions/github/gitStatusCheck
deploy:
needs: check-deployment-needed
if: needs.check-deployment-needed.outputs.deploy == 'true'
runs-on: ubuntu-latest
steps:
- name: Deploy Application
run: echo "Deploying application..."
Troubleshooting
Common Issues
Action Always Returns False
- Check that YAML files actually exist in the repository
- Ensure the branch comparison is correct
Action Always Returns True
- Check if git history is available
- Verify branch exists and is accessible
- Ensure proper git configuration
Permission Issues
- Ensure repository checkout is performed
- Verify git commands can access repository
- Check working directory is correct
Debugging
Check Git Status Manually
# Debug git status locally
git status --porcelain | grep -E '\.(yml|yaml)$'
git diff --name-only origin/main | grep -E '\.(yml|yaml)$'
Verify Branch Existence
# Check if branch exists
git branch -r | grep origin/main
Test File Detection
# Test file pattern matching
find . -name "*.yml" -o -name "*.yaml"
Performance Considerations
Execution Time
- Fast: Minimal git operations
- Lightweight: Simple shell script execution
- Efficient: Early termination when files found
Resource Usage
- Low Memory: Minimal memory footprint
- Quick I/O: Limited file system operations
- Network: No external network calls
Optimization Tips
- Place Early: Run early in workflow for maximum benefit
- Combine Checks: Use outputs in multiple subsequent jobs
Best Practices
Workflow Design
- Early Execution: Run checks early in the workflow
- Output Reuse: Share outputs between multiple jobs
- Clear Naming: Use descriptive step IDs and names
- Documentation: Document conditional logic clearly
Branch Strategy
- Consistent Branches: Use consistent branch names for comparison
- Dynamic References: Use dynamic branch references in PRs
- Default Branches: Align with repository default branch
Migration Guide
From Path Filters
Replace workflow path filters with dynamic checks:
# Before: Static path filtering
on:
pull_request:
paths:
- '*.yml'
- '*.yaml'
# After: Dynamic checking
on:
pull_request:
jobs:
check:
steps:
- uses: ./actions/github/gitStatusCheck
id: yaml-check
- if: steps.yaml-check.outputs.shouldRun == 'true'
run: echo "Process YAML files"
From Manual Git Commands
Replace manual git status checks:
# Before: Manual git commands
- name: Check Changes
run: |
if git diff --name-only origin/main | grep -E '\.(yml|yaml)$'; then
echo "yaml_changed=true" >> $GITHUB_OUTPUT
fi
# After: Use action
- name: Check Changes
id: check
uses: ./actions/github/gitStatusCheck