Skip to content

refactor: consume cli-args-parser and OpenAPIV3 through tools #16

refactor: consume cli-args-parser and OpenAPIV3 through tools

refactor: consume cli-args-parser and OpenAPIV3 through tools #16

Workflow file for this run

name: CI/CD Pipeline
on:
push:
branches: ['main']
tags: ['v*']
pull_request:
branches: ['main']
jobs:
quality:
name: Quality Check
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [22, 25]
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: 9
- name: Setup Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
registry-url: 'https://registry.npmjs.org'
cache: 'pnpm'
- name: Install Dependencies
run: pnpm install --frozen-lockfile
- name: Type Check
run: pnpm run typecheck
- name: Build
run: pnpm run build
- name: Run Tests
run: pnpm run test:run
release-next:
name: Release Next
needs: quality
if: |
github.event_name == 'push' &&
github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
permissions:
contents: write
packages: write
steps:
- name: Check if version bump commit
id: check
env:
COMMIT_MSG: ${{ github.event.head_commit.message }}
run: |
FIRST_LINE=$(echo "$COMMIT_MSG" | head -n 1)
if [[ "$FIRST_LINE" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
echo "skip=true" >> $GITHUB_OUTPUT
echo "Skipping: commit message is a version bump"
else
echo "skip=false" >> $GITHUB_OUTPUT
fi
- name: Checkout
if: steps.check.outputs.skip != 'true'
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup pnpm
if: steps.check.outputs.skip != 'true'
uses: pnpm/action-setup@v4
with:
version: 9
- name: Setup Node.js
if: steps.check.outputs.skip != 'true'
uses: actions/setup-node@v4
with:
node-version: '20'
registry-url: 'https://registry.npmjs.org'
cache: 'pnpm'
- name: Install Dependencies
if: steps.check.outputs.skip != 'true'
run: pnpm install --frozen-lockfile
- name: Bump Version (Next)
if: steps.check.outputs.skip != 'true'
id: version
run: |
CURRENT_VERSION=$(node -p "require('./package.json').version")
SHA=$(git rev-parse --short HEAD)
BASE_VERSION=$(echo $CURRENT_VERSION | cut -d'-' -f1)
NEW_VERSION="$BASE_VERSION-next.$SHA"
echo "New version: $NEW_VERSION"
npm version $NEW_VERSION --no-git-tag-version
echo "version=$NEW_VERSION" >> $GITHUB_OUTPUT
- name: Build
if: steps.check.outputs.skip != 'true'
run: pnpm run build
- name: Publish to NPM (Next)
if: steps.check.outputs.skip != 'true'
run: pnpm publish --tag next --no-git-checks
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
- name: Setup Node.js (GitHub Packages)
if: steps.check.outputs.skip != 'true'
uses: actions/setup-node@v4
with:
node-version: '20'
registry-url: 'https://npm.pkg.github.com'
scope: '@forattini-dev'
- name: Publish to GitHub Packages (Next)
if: steps.check.outputs.skip != 'true'
run: |
node -e "
const pkg = require('./package.json');
pkg.name = '@forattini-dev/dynamic-openapi-cli';
pkg.publishConfig = { registry: 'https://npm.pkg.github.com' };
require('fs').writeFileSync('package.json', JSON.stringify(pkg, null, 2));
"
pnpm publish --tag next --no-git-checks
env:
NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Job Summary
if: steps.check.outputs.skip != 'true'
env:
VERSION: ${{ steps.version.outputs.version }}
COMMIT_SHA: ${{ github.sha }}
REPO_URL: ${{ github.server_url }}/${{ github.repository }}
run: |
SHORT_SHA=${COMMIT_SHA::7}
echo "## πŸš€ Next Release Published" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "| Property | Value |" >> $GITHUB_STEP_SUMMARY
echo "|----------|-------|" >> $GITHUB_STEP_SUMMARY
echo "| **Version** | \`$VERSION\` |" >> $GITHUB_STEP_SUMMARY
echo "| **Tag** | \`next\` |" >> $GITHUB_STEP_SUMMARY
echo "| **Commit** | [\`$SHORT_SHA\`]($REPO_URL/commit/$COMMIT_SHA) |" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "### πŸ“¦ Installation" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "\`\`\`bash" >> $GITHUB_STEP_SUMMARY
echo "npm install dynamic-openapi-cli@next" >> $GITHUB_STEP_SUMMARY
echo "pnpm add dynamic-openapi-cli@next" >> $GITHUB_STEP_SUMMARY
echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
- name: Skip Summary
if: steps.check.outputs.skip == 'true'
run: |
echo "## ⏭️ Release Skipped" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "Version bump commit detected. Skipping @next release." >> $GITHUB_STEP_SUMMARY
release-stable:
name: Release Stable
needs: quality
if: startsWith(github.ref, 'refs/tags/v')
runs-on: ubuntu-latest
permissions:
contents: write
packages: write
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: 9
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
registry-url: 'https://registry.npmjs.org'
cache: 'pnpm'
- name: Install Dependencies
run: pnpm install --frozen-lockfile
- name: Build
run: pnpm run build
- name: Run Tests
run: pnpm run test:run
- name: Publish to NPM (Stable)
run: pnpm publish --no-git-checks
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
- name: Setup Node.js (GitHub Packages)
uses: actions/setup-node@v4
with:
node-version: '20'
registry-url: 'https://npm.pkg.github.com'
scope: '@forattini-dev'
- name: Publish to GitHub Packages (Stable)
run: |
node -e "
const pkg = require('./package.json');
pkg.name = '@forattini-dev/dynamic-openapi-cli';
pkg.publishConfig = { registry: 'https://npm.pkg.github.com' };
require('fs').writeFileSync('package.json', JSON.stringify(pkg, null, 2));
"
pnpm publish --no-git-checks
env:
NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Generate Changelog
id: changelog
run: |
PREV_TAG=$(git describe --tags --abbrev=0 HEAD^ 2>/dev/null || echo "")
CURRENT_TAG=${GITHUB_REF#refs/tags/}
echo "## What's Changed" > CHANGELOG_BODY.md
echo "" >> CHANGELOG_BODY.md
if [ -n "$PREV_TAG" ]; then
echo "Changes since $PREV_TAG:" >> CHANGELOG_BODY.md
echo "" >> CHANGELOG_BODY.md
FEATURES=$(git log "$PREV_TAG"..HEAD --pretty=format:"- %s" --grep="^feat" 2>/dev/null || true)
if [ -n "$FEATURES" ]; then
echo "### πŸš€ Features" >> CHANGELOG_BODY.md
echo "$FEATURES" >> CHANGELOG_BODY.md
echo "" >> CHANGELOG_BODY.md
fi
FIXES=$(git log "$PREV_TAG"..HEAD --pretty=format:"- %s" --grep="^fix" 2>/dev/null || true)
if [ -n "$FIXES" ]; then
echo "### πŸ› Bug Fixes" >> CHANGELOG_BODY.md
echo "$FIXES" >> CHANGELOG_BODY.md
echo "" >> CHANGELOG_BODY.md
fi
DOCS=$(git log "$PREV_TAG"..HEAD --pretty=format:"- %s" --grep="^docs" 2>/dev/null || true)
if [ -n "$DOCS" ]; then
echo "### πŸ“š Documentation" >> CHANGELOG_BODY.md
echo "$DOCS" >> CHANGELOG_BODY.md
echo "" >> CHANGELOG_BODY.md
fi
TESTS=$(git log "$PREV_TAG"..HEAD --pretty=format:"- %s" --grep="^test" 2>/dev/null || true)
if [ -n "$TESTS" ]; then
echo "### βœ… Tests" >> CHANGELOG_BODY.md
echo "$TESTS" >> CHANGELOG_BODY.md
echo "" >> CHANGELOG_BODY.md
fi
MAINTENANCE=$(git log "$PREV_TAG"..HEAD --pretty=format:"- %s" --grep="^ci\|^chore" 2>/dev/null || true)
if [ -n "$MAINTENANCE" ]; then
echo "### πŸ”§ Maintenance" >> CHANGELOG_BODY.md
echo "$MAINTENANCE" >> CHANGELOG_BODY.md
echo "" >> CHANGELOG_BODY.md
fi
CONTRIBUTORS=$(curl -s -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
"https://api.github.com/repos/${{ github.repository }}/compare/${PREV_TAG}...${CURRENT_TAG}" \
| node -e "const d=require('fs').readFileSync('/dev/stdin','utf8');try{const j=JSON.parse(d);const a=[...new Set((j.commits||[]).map(c=>c.author?.login).filter(Boolean))];if(a.length)console.log(a.map(u=>'- @'+u).join('\n'))}catch{}" 2>/dev/null || true)
if [ -n "$CONTRIBUTORS" ]; then
echo "### πŸ‘₯ Contributors" >> CHANGELOG_BODY.md
echo "$CONTRIBUTORS" >> CHANGELOG_BODY.md
echo "" >> CHANGELOG_BODY.md
fi
echo "**Full Changelog**: [$PREV_TAG...$CURRENT_TAG](https://github.com/${{ github.repository }}/compare/$PREV_TAG...$CURRENT_TAG)" >> CHANGELOG_BODY.md
else
echo "Initial release! πŸŽ‰" >> CHANGELOG_BODY.md
fi
echo "" >> CHANGELOG_BODY.md
echo "---" >> CHANGELOG_BODY.md
echo "" >> CHANGELOG_BODY.md
echo "## πŸ“¦ Installation" >> CHANGELOG_BODY.md
echo "" >> CHANGELOG_BODY.md
echo "\`\`\`bash" >> CHANGELOG_BODY.md
echo "npm install dynamic-openapi-cli" >> CHANGELOG_BODY.md
echo "pnpm add dynamic-openapi-cli" >> CHANGELOG_BODY.md
echo "\`\`\`" >> CHANGELOG_BODY.md
- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
body_path: CHANGELOG_BODY.md
draft: false
prerelease: false
generate_release_notes: false
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Job Summary
env:
REPO_URL: ${{ github.server_url }}/${{ github.repository }}
run: |
VERSION=${GITHUB_REF#refs/tags/v}
echo "## πŸŽ‰ Stable Release Published" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "| Property | Value |" >> $GITHUB_STEP_SUMMARY
echo "|----------|-------|" >> $GITHUB_STEP_SUMMARY
echo "| **Version** | \`$VERSION\` |" >> $GITHUB_STEP_SUMMARY
echo "| **Tag** | \`latest\` |" >> $GITHUB_STEP_SUMMARY
echo "| **Git Tag** | [\`v$VERSION\`]($REPO_URL/releases/tag/v$VERSION) |" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "### πŸ“¦ Installation" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "\`\`\`bash" >> $GITHUB_STEP_SUMMARY
echo "npm install dynamic-openapi-cli" >> $GITHUB_STEP_SUMMARY
echo "pnpm add dynamic-openapi-cli" >> $GITHUB_STEP_SUMMARY
echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "### πŸ”— Links" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "- [GitHub Release]($REPO_URL/releases/tag/v$VERSION)" >> $GITHUB_STEP_SUMMARY
echo "- [NPM Package](https://www.npmjs.com/package/dynamic-openapi-cli)" >> $GITHUB_STEP_SUMMARY