refactor: consume cli-args-parser and OpenAPIV3 through tools #16
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 |