Skip to main content

Troubleshoot GitHub Actions workflows

Resolve common issues with GitHub Actions workflows and improve reliability.

Workflow fails to trigger​

Check trigger conditions​

Ensure your workflow triggers on the correct events:

on:
push:
branches: [ main, develop ] # Triggers only on these branches
pull_request:
branches: [ main ] # Triggers on PRs to main

Solution: Verify branch names and event types match your repository setup.

Check file paths​

If your workflow only runs on specific file changes:

on:
push:
paths:
- 'src/**' # Only triggers on changes to src/ directory
- 'package.json' # Or specific files

Solution: Use paths-ignore to exclude certain files or directories.

Permission errors​

Grant necessary permissions​

For workflows that need to write to the repository:

permissions:
contents: write # Allows pushing to repository
issues: write # Allows creating issues
pull-requests: write # Allows creating PRs

Solution: Add the permissions key to your job or workflow.

Use personal access tokens​

For workflows that access external resources:

- name: Access external API
run: |
curl -H "Authorization: Bearer ${{ secrets.API_TOKEN }}" \
https://api.example.com/data

Solution: Store sensitive tokens in repository secrets.

Dependency and environment issues​

Cache dependencies​

Speed up builds by caching dependencies:

- name: Cache node modules
uses: actions/cache@v3
with:
path: ~/.npm
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-

Solution: Add caching for package managers like npm, pip, or Maven.

Set up multiple environments​

Test across different operating systems and versions:

jobs:
test:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
node-version: [16, 18, 20]

Solution: Use matrix builds for comprehensive testing.

Workflow timing out​

Increase timeout limits​

For long-running jobs:

jobs:
build:
runs-on: ubuntu-latest
timeout-minutes: 30 # Default is 6 hours for self-hosted, 6 minutes for GitHub-hosted

Solution: Set appropriate timeout values for your workflow steps.

Optimize workflow performance​

Break large jobs into smaller steps:

- name: Install dependencies
run: npm ci

- name: Run tests
run: npm test

- name: Build artifacts
run: npm run build

Solution: Split complex tasks into separate steps for better error isolation.

Secret and environment variable issues​

Access workflow secrets​

Use secrets in your workflow:

- name: Deploy to production
run: |
echo "Deploying with token: ${{ secrets.DEPLOY_TOKEN }}"
./deploy.sh ${{ secrets.DEPLOY_TOKEN }}

Solution: Reference secrets using the ${{ secrets.SECRET_NAME }} syntax.

Set environment variables​

Define environment variables for your workflow:

env:
NODE_ENV: production
API_URL: https://api.example.com

jobs:
build:
steps:
- name: Use environment variables
run: echo "API URL is $API_URL"

Solution: Use environment variables for configuration that changes between environments.

Network and connectivity issues​

Retry failed network requests​

For unreliable network operations:

- name: Retry npm install
uses: nick-invision/retry@v2
with:
timeout_minutes: 10
max_attempts: 3
command: npm install

Solution: Use retry actions or implement retry logic in your scripts.

Test external connectivity​

- name: Test external API
run: |
curl -f https://api.example.com/health || exit 1

Solution: Add health checks for external dependencies.

Debugging workflow issues​

Enable debug logging​

Add debug mode to your workflow:

- name: Enable debug logging
run: |
echo "ACTIONS_STEP_DEBUG=true" >> $GITHUB_ENV
echo "ACTIONS_RUNNER_DEBUG=true" >> $GITHUB_ENV

Solution: Set debug environment variables to get more detailed logs.

Use workflow commands​

Add logging to your workflow:

- name: Log environment
run: |
echo "## Environment Information"
echo "Runner OS: ${{ runner.os }}"
echo "Node version: $(node --version)"
echo "NPM version: $(npm --version)"

Solution: Use GitHub workflow commands to provide better context in logs.

Get help​

If you encounter issues not covered here:

  1. Check the GitHub Actions documentation
  2. Search GitHub Community Discussions
  3. Review your workflow logs in the Actions tab
  4. Test changes in a separate branch before merging

Next steps​