392 lines
7.7 KiB
Markdown
392 lines
7.7 KiB
Markdown
# Workflow Operations Reference
|
|
|
|
Comprehensive guide for GitHub Actions workflow management using gh CLI.
|
|
|
|
## Listing Workflows
|
|
|
|
### View Available Workflows
|
|
|
|
```bash
|
|
# List all workflows in repository
|
|
gh workflow list
|
|
|
|
# List with detailed status
|
|
gh workflow list --all
|
|
|
|
# List workflows as JSON
|
|
gh workflow list --json name,id,state,path
|
|
```
|
|
|
|
---
|
|
|
|
## Viewing Workflow Details
|
|
|
|
### Inspect Workflow Configuration
|
|
|
|
```bash
|
|
# View workflow details
|
|
gh workflow view workflow-name
|
|
|
|
# View workflow by ID
|
|
gh workflow view 12345
|
|
|
|
# View workflow YAML
|
|
gh workflow view workflow-name --yaml
|
|
|
|
# View workflow in browser
|
|
gh workflow view workflow-name --web
|
|
```
|
|
|
|
---
|
|
|
|
## Enabling and Disabling Workflows
|
|
|
|
### Workflow State Management
|
|
|
|
```bash
|
|
# Enable workflow
|
|
gh workflow enable workflow-name
|
|
|
|
# Enable workflow by ID
|
|
gh workflow enable 12345
|
|
|
|
# Disable workflow
|
|
gh workflow disable workflow-name
|
|
|
|
# Disable workflow by ID
|
|
gh workflow disable 12345
|
|
```
|
|
|
|
---
|
|
|
|
## Running Workflows
|
|
|
|
### Manual Workflow Triggers
|
|
|
|
```bash
|
|
# Run workflow manually
|
|
gh workflow run workflow-name
|
|
|
|
# Run workflow on specific branch
|
|
gh workflow run workflow-name --ref feature-branch
|
|
|
|
# Run workflow with inputs
|
|
gh workflow run workflow-name -f input1=value1 -f input2=value2
|
|
|
|
# Run workflow with JSON inputs
|
|
gh workflow run workflow-name \
|
|
-f config='{"env":"production","debug":false}'
|
|
```
|
|
|
|
---
|
|
|
|
## Viewing Workflow Runs
|
|
|
|
### List Workflow Runs
|
|
|
|
```bash
|
|
# List all workflow runs
|
|
gh run list
|
|
|
|
# List runs for specific workflow
|
|
gh run list --workflow=workflow-name
|
|
|
|
# List runs with filters
|
|
gh run list --status success
|
|
gh run list --status failure
|
|
gh run list --branch main
|
|
|
|
# List recent runs
|
|
gh run list --limit 20
|
|
|
|
# List runs as JSON
|
|
gh run list --json databaseId,status,conclusion,headBranch,event
|
|
```
|
|
|
|
---
|
|
|
|
## Viewing Specific Run Details
|
|
|
|
### Inspect Run Information
|
|
|
|
```bash
|
|
# View specific run details
|
|
gh run view run-id
|
|
|
|
# View run in browser
|
|
gh run view run-id --web
|
|
|
|
# View run logs
|
|
gh run view run-id --log
|
|
|
|
# View failed run logs only
|
|
gh run view run-id --log-failed
|
|
|
|
# Get run as JSON
|
|
gh run view run-id --json status,conclusion,jobs,createdAt
|
|
```
|
|
|
|
---
|
|
|
|
## Monitoring Runs
|
|
|
|
### Real-Time Monitoring
|
|
|
|
```bash
|
|
# Watch workflow run in real-time
|
|
gh run watch run-id
|
|
|
|
# Watch with log output
|
|
gh run watch run-id --exit-status
|
|
|
|
# Watch interval (check every N seconds)
|
|
gh run watch run-id --interval 10
|
|
```
|
|
|
|
---
|
|
|
|
## Downloading Artifacts and Logs
|
|
|
|
### Retrieve Run Data
|
|
|
|
```bash
|
|
# Download workflow run logs
|
|
gh run download run-id
|
|
|
|
# Download specific artifact
|
|
gh run download run-id --name artifact-name
|
|
|
|
# Download to specific directory
|
|
gh run download run-id --dir ./downloads
|
|
|
|
# List available artifacts
|
|
gh run view run-id --log | grep "artifact"
|
|
```
|
|
|
|
---
|
|
|
|
## Canceling and Rerunning Workflows
|
|
|
|
### Run Control Operations
|
|
|
|
```bash
|
|
# Cancel workflow run
|
|
gh run cancel run-id
|
|
|
|
# Rerun workflow
|
|
gh run rerun run-id
|
|
|
|
# Rerun only failed jobs
|
|
gh run rerun run-id --failed
|
|
|
|
# Rerun with debug logging
|
|
gh run rerun run-id --debug
|
|
```
|
|
|
|
---
|
|
|
|
## Workflow Jobs
|
|
|
|
### Viewing Job Details
|
|
|
|
```bash
|
|
# List jobs for a run
|
|
gh api repos/{owner}/{repo}/actions/runs/{run_id}/jobs
|
|
|
|
# View specific job logs
|
|
gh run view run-id --log --job job-id
|
|
|
|
# Download job logs
|
|
gh api repos/{owner}/{repo}/actions/jobs/{job_id}/logs > job.log
|
|
```
|
|
|
|
---
|
|
|
|
## Advanced Workflow Operations
|
|
|
|
### Workflow Timing Analysis
|
|
|
|
```bash
|
|
# Get run timing
|
|
gh run view run-id --json createdAt,startedAt,updatedAt,conclusion
|
|
|
|
# List slow runs
|
|
gh run list --workflow=ci --json databaseId,createdAt,updatedAt | \
|
|
jq '.[] | select((.updatedAt | fromdate) - (.createdAt | fromdate) > 600)'
|
|
```
|
|
|
|
### Workflow Success Rate
|
|
|
|
```bash
|
|
# Calculate success rate for workflow
|
|
gh run list --workflow=ci --limit 100 --json conclusion | \
|
|
jq '[.[] | .conclusion] | group_by(.) | map({conclusion: .[0], count: length})'
|
|
```
|
|
|
|
---
|
|
|
|
## Bulk Operations
|
|
|
|
### Managing Multiple Runs
|
|
|
|
```bash
|
|
# Cancel all running workflows
|
|
gh run list --status in_progress --json databaseId -q '.[].databaseId' | \
|
|
xargs -I {} gh run cancel {}
|
|
|
|
# Rerun all failed runs from today
|
|
gh run list --status failure --created today --json databaseId -q '.[].databaseId' | \
|
|
xargs -I {} gh run rerun {}
|
|
|
|
# Download artifacts from multiple runs
|
|
gh run list --workflow=build --limit 5 --json databaseId -q '.[].databaseId' | \
|
|
xargs -I {} gh run download {}
|
|
```
|
|
|
|
---
|
|
|
|
## Workflow Secrets and Variables
|
|
|
|
### Managing Secrets (via API)
|
|
|
|
```bash
|
|
# List repository secrets
|
|
gh api repos/{owner}/{repo}/actions/secrets
|
|
|
|
# Create/update secret
|
|
gh secret set SECRET_NAME --body "secret-value"
|
|
|
|
# Create secret from file
|
|
gh secret set SECRET_NAME < secret.txt
|
|
|
|
# Delete secret
|
|
gh secret delete SECRET_NAME
|
|
|
|
# List secrets
|
|
gh secret list
|
|
```
|
|
|
|
### Managing Variables
|
|
|
|
```bash
|
|
# List repository variables
|
|
gh variable list
|
|
|
|
# Set variable
|
|
gh variable set VAR_NAME --body "value"
|
|
|
|
# Delete variable
|
|
gh variable delete VAR_NAME
|
|
```
|
|
|
|
---
|
|
|
|
## Workflow Dispatch Events
|
|
|
|
### Triggering with workflow_dispatch
|
|
|
|
Example workflow file configuration:
|
|
```yaml
|
|
on:
|
|
workflow_dispatch:
|
|
inputs:
|
|
environment:
|
|
description: 'Deployment environment'
|
|
required: true
|
|
default: 'staging'
|
|
type: choice
|
|
options:
|
|
- staging
|
|
- production
|
|
debug:
|
|
description: 'Enable debug mode'
|
|
required: false
|
|
type: boolean
|
|
```
|
|
|
|
Trigger with inputs:
|
|
```bash
|
|
gh workflow run deploy.yml \
|
|
-f environment=production \
|
|
-f debug=true
|
|
```
|
|
|
|
---
|
|
|
|
## Monitoring and Debugging
|
|
|
|
### Common Debugging Techniques
|
|
|
|
```bash
|
|
# View recent failures
|
|
gh run list --status failure --limit 10
|
|
|
|
# Check specific run logs
|
|
gh run view run-id --log-failed
|
|
|
|
# Download logs for analysis
|
|
gh run download run-id
|
|
|
|
# Rerun with debug logging
|
|
gh run rerun run-id --debug
|
|
|
|
# Check workflow syntax
|
|
gh workflow view workflow-name --yaml
|
|
```
|
|
|
|
### Workflow Performance Monitoring
|
|
|
|
```bash
|
|
# Get average run duration
|
|
gh run list --workflow=ci --limit 50 --json createdAt,updatedAt | \
|
|
jq '[.[] | ((.updatedAt | fromdate) - (.createdAt | fromdate))] | add / length'
|
|
|
|
# Find longest running jobs
|
|
gh api repos/{owner}/{repo}/actions/runs/{run_id}/jobs | \
|
|
jq '.jobs | sort_by(.started_at) | reverse | .[0:5]'
|
|
```
|
|
|
|
---
|
|
|
|
## Best Practices
|
|
|
|
### Workflow Organization
|
|
|
|
1. **Use descriptive names** - Make workflow purpose clear
|
|
2. **Modular workflows** - Break complex workflows into reusable actions
|
|
3. **Cache dependencies** - Speed up builds with caching
|
|
4. **Matrix strategies** - Test across multiple environments
|
|
5. **Workflow dependencies** - Use `needs` to control execution order
|
|
|
|
### Workflow Triggers
|
|
|
|
1. **Selective triggers** - Use path filters to run only when needed
|
|
2. **Schedule wisely** - Avoid resource waste with cron triggers
|
|
3. **Manual triggers** - Provide workflow_dispatch for flexibility
|
|
4. **PR workflows** - Separate validation from deployment
|
|
5. **Branch protection** - Require status checks before merge
|
|
|
|
### Secrets Management
|
|
|
|
1. **Use secrets** - Never hardcode credentials
|
|
2. **Scope appropriately** - Use environment-specific secrets
|
|
3. **Rotate regularly** - Update secrets periodically
|
|
4. **Audit access** - Review who can access secrets
|
|
5. **Use OIDC** - Prefer token-less authentication when possible
|
|
|
|
### Performance Optimization
|
|
|
|
1. **Conditional execution** - Skip unnecessary jobs
|
|
2. **Parallel jobs** - Run independent jobs concurrently
|
|
3. **Artifact management** - Clean up old artifacts
|
|
4. **Self-hosted runners** - Use for resource-intensive workloads
|
|
5. **Job timeouts** - Set reasonable timeout limits
|
|
|
|
### Monitoring and Alerts
|
|
|
|
1. **Enable notifications** - Get alerted on failures
|
|
2. **Status badges** - Display workflow status in README
|
|
3. **Metrics tracking** - Monitor success rates and duration
|
|
4. **Log retention** - Configure appropriate retention policies
|
|
5. **Dependency updates** - Automate with Dependabot
|