diff --git a/.github/workflows/pipeline.yml b/.github/workflows/pipeline.yml index 0a9ad6b..bc4f81a 100644 --- a/.github/workflows/pipeline.yml +++ b/.github/workflows/pipeline.yml @@ -4,8 +4,10 @@ name: CI/CD Pipeline on: push: branches: [ "main" ] - pull_request: + paths-ignore: + pull_request: branches: [ "main" ] + paths-ignore: # Schedule pipeline to run monday midnight after sunday ends schedule: - cron: 0 0 * * MON @@ -76,12 +78,31 @@ jobs: - name: Compile TypeScript into JavaScript run: pnpm run build - # publish to NPM - publish-npm: - name: Publish to NPM - if: github.event_name == 'push' # only run this on push, not PR + # detect if there were code changes: + detect-code-changes: + name: Detect Code Changes needs: build runs-on: ubuntu-latest + outputs: + code_changes: ${{ steps.files.outputs.code_changes }} + steps: + - uses: actions/checkout@v3 + - name: Determine Changed Files + id: files + run: | + if git diff --name-only ${{ github.base_ref }}...${{ github.head_ref }} | grep -qvE '(\.md$|\.github/workflows/)' + then + echo "::set-output name=code_changes::true" + else + echo "::set-output name=code_changes::false" + fi + + # verify new NPM version is updated during push and PR. Skips version number check step if there were code changes + verify-npm-version: + name: Verify Updated NPM version + if: github.event_name == 'push' || github.event_name == 'pull_request' # run version checks only on PR and push + needs: detect-code-changes + runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 with: @@ -93,7 +114,8 @@ jobs: registry-url: 'https://registry.npmjs.org/' - name: Install dependencies run: npm install - - name: Check if version updated + - name: Check if version number is updated + if: needs.build-and-test.outputs.code_changes == 'true' # only make check for code changes id: check_version run: | LATEST_TAG=$(git describe --tags --abbrev=0) @@ -101,20 +123,46 @@ jobs: if [ "$LATEST_TAG" = "v$PACKAGE_VERSION" ]; then echo "Version in package.json is already published. Exiting..." exit 1 - else - echo "::set-output name=version::$PACKAGE_VERSION" fi + + # publish to NPM if: + # - It was a push + # - There were code changes + publish-npm: + name: Publish to NPM + if: github.event_name == 'push' && needs.build-and-test.outputs.code_changes == 'true' + needs: verify-npm-version + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 # Fetches all history for all branches and tags + - name: Use Node.js + uses: actions/setup-node@v3 + with: + node-version: '20.x' + registry-url: 'https://registry.npmjs.org/' + - name: Install dependencies + run: npm install + - name: Check if version updated + id: check_version + run: | + LATEST_TAG=$(git describe --tags --abbrev=0) + PACKAGE_VERSION=$(node -p "require('./package.json').version") + echo "::set-output name=version::$PACKAGE_VERSION" - name: Publish to NPM if: steps.check_version.outputs.version run: npm publish env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} - # Create Release + # Create Release on GitHub if: + # - It was a push + # - There were code changes release: name: Create Release - if: github.event_name == 'push' # only run this on push, not PR - needs: publish-npm + if: github.event_name == 'push' && needs.build-and-test.outputs.code_changes == 'true' + needs: verify-npm-version runs-on: ubuntu-latest steps: - name: Checkout code