Overview
envcheck uses standard Unix exit codes to indicate the validation results. These exit codes are essential for integrating envcheck into CI/CD pipelines, scripts, and automated workflows.
Exit Code Reference
0 - Success
Meaning: All validations passed or only warnings were found.
When it occurs:
- All checks passed successfully
- Some non-critical warnings were found, but no errors
Example scenarios:
# All checks pass
$ envcheck
✓ All checks passed!
$ echo $?
0
# Warnings present but no errors
$ envcheck
⚠ 2 warning(s) found, but you can proceed.
$ echo $?
0
CI/CD behavior:
- Pipeline should continue
- Deployment can proceed
- No action required
1 - Validation Failure
Meaning: One or more validation checks failed with errors.
When it occurs:
- Required tools are missing or have incorrect versions
- Required environment variables are not set
- Required ports are unavailable
- Required files do not exist
- Network endpoints are unreachable or return unexpected status codes
Example scenarios:
# Required tool missing
$ envcheck
✗ node not found
❌ 1 issue(s) found. Fix them to continue.
$ echo $?
1
# Version mismatch
$ envcheck
✗ node version 16.14.0 does not satisfy >=18.0.0
❌ 1 issue(s) found. Fix them to continue.
$ echo $?
1
# Port in use
$ envcheck
✗ Port 3000 is already in use
❌ 1 issue(s) found. Fix them to continue.
$ echo $?
1
CI/CD behavior:
- Pipeline should fail
- Deployment should be blocked
- Errors must be fixed before proceeding
Implementation Details
The exit code logic is implemented in src/reporter.rs:92-98:
pub fn exit_code(&self) -> i32 {
if self.has_errors() {
1
} else {
0
}
}
The has_errors() method checks if any validation result has an Error status:
pub fn has_errors(&self) -> bool {
self.results.iter().any(|r| matches!(r.status, ValidationStatus::Error))
}
Validation Status Levels
envcheck uses three validation status levels that affect the exit code:
Success
- Validation check passed
- Does not affect exit code
- Displayed with ✓ symbol
Warning
- Non-critical issue detected
- Does not cause exit code 1
- Displayed with ⚠ symbol
- Includes optional suggestions for improvement
Error
- Critical validation failure
- Causes exit code 1
- Displayed with ✗ symbol
- Includes optional suggestions for remediation
Using Exit Codes in Scripts
Bash Script
#!/bin/bash
envcheck
if [ $? -eq 0 ]; then
echo "Environment is ready"
npm start
else
echo "Environment validation failed"
exit 1
fi
CI/CD Pipeline Examples
GitHub Actions
name: Validate Environment
on: [push, pull_request]
jobs:
validate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Run envcheck
run: |
envcheck
# Exits with code 1 if validation fails
- name: Deploy
if: success()
run: ./deploy.sh
GitLab CI
validate-environment:
stage: test
script:
- envcheck
# Job fails if exit code is non-zero
deploy:
stage: deploy
script:
- ./deploy.sh
needs:
- validate-environment
CircleCI
version: 2.1
jobs:
validate:
docker:
- image: cimg/base:stable
steps:
- checkout
- run:
name: Validate environment
command: envcheck
# Step fails if exit code is 1
workflows:
build-and-deploy:
jobs:
- validate
- deploy:
requires:
- validate
JSON Output and Exit Codes
When using --json flag, the exit code behavior remains the same:
$ envcheck --json
{
"results": [...],
"summary": {
"errors": 1,
"warnings": 0,
"successes": 2
},
"passed": false
}
$ echo $?
1
The passed field in JSON output indicates whether the exit code will be 0 (true) or 1 (false).
Best Practices
Use exit codes in automation:
- Always check exit codes in scripts and pipelines
- Fail fast when exit code is 1
- Log results for debugging failed validations
Warning status does not fail:
Remember that warnings do not cause a non-zero exit code. If you need warnings to fail your pipeline, you’ll need to parse the JSON output and check the warning count.
# Fail on warnings
RESULT=$(envcheck --json)
WARNINGS=$(echo $RESULT | jq '.summary.warnings')
if [ $WARNINGS -gt 0 ]; then
echo "Warnings are not allowed in production"
exit 1
fi