This post is the second part of our OpenAPI series. Let’s set up GitHub Actions for validating an OpenAPI spec before merging into the main branch.
Check more details
Step 1. Install IBM OpenAPI Validator
npm i -g ibm-openapi-validator
npm i @ibm-cloud/openapi-ruleset
Step 2. Setup OpenAPI Rullset
extends: '@ibm-cloud/openapi-ruleset'
rules:
ibm-accept-and-return-models: info
ibm-integer-attributes: false
ibm-required-array-properties-in-response: false
ibm-property-casing-convention: false
Create an file – validator-rules.yaml
You can check details
ibm rules (inherent from spectral:as rules)
spectral:oas rules
Step 3. Setup Configurations
Create an file – validator-config.yml
errorsOnly: true
colorizeOutput: true
limits:
warnings: 25
outputFormat: 'text'
summaryOnly: false
files:
- api.yml
ignoreFiles:
- validator-config.yml
logLevels:
root: error
ibm-schema-description-exists: debug
ruleset: ./validator-rules.yaml
produceImpactScore: false
markdownReport: true
Check document
Step 4. Check Project Folders and Files

Step 5. Run Validator on your Local Machine
lint-openapi -c ./validator-config.yml ./api.yml --errors-only --no-colors
After run the command, It will generate reporting file (md)
- api-validator-report.md
Step 6. Add .gitignore file
node_modules/
package-lock.json
package.json
api-validator-report.md
Step 7. Setup Github Action
name: Validate OpenAPI Documentation
on:
pull_request:
branches: [main]
push:
branches: [main]
jobs:
validate:
name: Validate OpenAPI Documentation
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install IBM OpenAPI Validator
run: |
npm i -g ibm-openapi-validator
npm i @ibm-cloud/openapi-ruleset
- name: Validate api.yml
id: validation
run: |
if lint-openapi -c ./validator-config.yml ./api.yml --errors-only --no-colors > validation_result.txt 2>&1; then
echo "validation_status=success" >> $GITHUB_OUTPUT
else
echo "validation_status=failed" >> $GITHUB_OUTPUT
fi
continue-on-error: true
- name: Comment PR with validation output
if: github.event_name == 'pull_request'
uses: actions/github-script@v7
with:
script: |
const fs = require('fs');
const validationStatus = '${{ steps.validation.outputs.validation_status }}';
const validationOutput = fs.readFileSync('api-validator-report.md', 'utf8');
let body = '';
if (validationStatus === 'success') {
body = `## ✅ OpenAPI Validation Passed
**File**: \`./api.yml\`
**Commit**: \`${{ github.sha }}\`
${validationOutput}
`;
} else {
body = `## ❌ OpenAPI Validation Failed
**File**: \`./api.yml\`
**Commit**: \`${{ github.sha }}\`
${validationOutput}
`;
}
// Truncate if too long for GitHub comment limit
if (body.length > 65000) {
body = body.slice(0, 65000) + '\n\n... (truncated due to GitHub comment length limit)';
}
// Find existing comment and update or create new one
const { data: comments } = await github.rest.issues.listComments({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
});
const marker = 'OpenAPI Validation';
const existing = comments.find(c => c.body && c.body.includes(marker));
if (existing) {
await github.rest.issues.updateComment({
owner: context.repo.owner,
repo: context.repo.repo,
comment_id: existing.id,
body
});
} else {
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
body
});
}
- name: Fail job if validation failed
if: steps.validation.outputs.validation_status == 'failed'
run: exit 1
Create Github Action yml file
- .github/workflows/validator.yml
⚠️ Check md file name – api-validator-report.md
const validationOutput = fs.readFileSync('api-validator-report.md', 'utf8');
Step 8. Check Github Action’s results
This is the last step, let’s check the results.

When you create a PR that targets main branch, our GitHub action will run and comment results on your Opened PR.



IBM OpenAPI Validator provides very detailed information. To fix issues, You can update your OpenAPI Spec file or You can change the rulesets if you don’t want to change your OpenAPI Spec files.
BTW This validator is really helpful it prevent wrong OpenAPI spec merged into main branch.

Leave a comment