diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..f2b0b447 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,191 @@ +name: Build, Test, Publish + +on: + pull_request: + types: [opened, synchronize] + +env: + NODE_VERSION: 20.x + +jobs: + setup: + runs-on: ubuntu-latest + steps: + - run: echo "Triggered by ${{ github.event_name }} event." + + - name: Check out repository code ${{ github.repository }} on ${{ github.ref }} + uses: actions/checkout@v3 + + - name: Set up Node.js ${{ env.NODE_VERSION }} + uses: actions/setup-node@v3 + with: + node-version: ${{ env.NODE_VERSION }} + cache: 'npm' + + - name: Cache node modules + uses: actions/cache@v3 + with: + path: node_modules + key: ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }} + restore-keys: | + ${{ runner.os }}-node- + + - name: Installing dependencies + if: steps.cache.outputs.cache-hit != 'true' + uses: borales/actions-yarn@v4 + with: + cmd: install --frozen-lockfile + + build: + needs: setup + runs-on: ubuntu-latest + steps: + - name: Check out repository code ${{ github.repository }} on ${{ github.ref }} + uses: actions/checkout@v3 + + - name: Restore node modules from cache + uses: actions/cache@v3 + with: + path: node_modules + key: ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }} + restore-keys: | + ${{ runner.os }}-node- + + - name: Build + uses: borales/actions-yarn@v4 + with: + cmd: build + + test-current: + needs: setup + runs-on: ubuntu-latest + steps: + - name: Check out repository code ${{ github.repository }} on ${{ github.ref }} + uses: actions/checkout@v3 + + - name: Restore node modules from cache + uses: actions/cache@v3 + with: + path: node_modules + key: ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }} + restore-keys: | + ${{ runner.os }}-node- + + - name: Test + uses: borales/actions-yarn@v4 + with: + cmd: test + + test-target: + needs: setup + runs-on: ubuntu-latest + steps: + - name: Check out repository code ${{ github.repository }} on ${{ github.ref }} + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Configure Git user + run: | + git config --global user.email "pkgbot@form.io" + git config --global user.name "pkgbot" + + - name: Merge target branch into current branch + run: | + git fetch origin ${{ github.event.pull_request.base.ref }}:${{ github.event.pull_request.base.ref }} + git merge ${{ github.event.pull_request.base.ref }} --no-commit --no-ff + + - name: Check for merge conflicts + run: | + if ! git merge --no-commit --no-ff ${{ github.event.pull_request.base.ref }}; then + echo "Merge conflicts detected." + git merge --abort + exit 1 + else + echo "Merge successful." + fi + + - name: Set up Node.js ${{ env.NODE_VERSION }} + uses: actions/setup-node@v3 + with: + node-version: ${{ env.NODE_VERSION }} + cache: 'npm' + + - name: Restore node modules from cache + uses: actions/cache@v3 + with: + path: node_modules + key: ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }} + restore-keys: | + ${{ runner.os }}-node- + + - name: Test + uses: borales/actions-yarn@v4 + with: + cmd: test + + publish: + needs: [setup, test-current, test-target] + if: ${{ github.event_name == 'pull_request' && (github.event.action == 'opened' || github.event.action == 'synchronize') }} + runs-on: ubuntu-latest + steps: + - name: Check out repository code ${{ github.repository }} on ${{ github.ref }} + uses: actions/checkout@v3 + + - name: Configure Git user + run: | + git config --global user.email "pkgbot@form.io" + git config --global user.name "pkgbot" + + - name: Add npm token to .npmrc + run: | + echo "//registry.npmjs.org/:_authToken=${{ secrets.NPM_TOKEN }}" > .npmrc + + - name: Set up Node.js ${{ env.NODE_VERSION }} + uses: actions/setup-node@v3 + with: + node-version: ${{ env.NODE_VERSION }} + cache: 'npm' + registry-url: 'https://registry.npmjs.org/' + + - name: Restore node modules from cache + uses: actions/cache@v3 + with: + path: node_modules + key: ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }} + restore-keys: | + ${{ runner.os }}-node- + + - name: Build + uses: borales/actions-yarn@v4 + with: + cmd: build + + - name: Prepare version for publish + id: prep + run: | + # Extract the pull request number and the short SHA of the commit + PR_NUMBER=$(echo ${{ github.event.number }}) + COMMIT_SHORT_SHA=$(echo "${{ github.event.pull_request.head.sha }}" | cut -c1-7) + + # Extract the current version from package.json + CURRENT_VERSION=$(node -p "require('./package.json').version") + + # If the current version includes '-rc.', remove it and everything after + # This step ensures that we start with a base version like '3.0.0' even if it was a release candidate + BASE_VERSION=$(echo "$CURRENT_VERSION" | cut -d'-' -f1) + + # Construct the new version string + NEW_VERSION="${BASE_VERSION}-dev.${PR_NUMBER}.${COMMIT_SHORT_SHA}" + + # Output the new version for use in subsequent GitHub Actions steps + echo "NEW_VERSION=$NEW_VERSION" >> $GITHUB_ENV + + - name: Echo version for testing + run: | + echo "Version to publish: $NEW_VERSION" + + - name: Publish to npm + run: | + npm version $NEW_VERSION + yarn publish --tag dev \ No newline at end of file diff --git a/.github/workflows/repo.yml b/.github/workflows/repo.yml deleted file mode 100644 index a44f52ad..00000000 --- a/.github/workflows/repo.yml +++ /dev/null @@ -1,75 +0,0 @@ -name: Build & Test - -on: push - -env: - NODE_VERSION: 18.x - -jobs: - setup: - runs-on: ubuntu-latest - steps: - - run: echo "Triggered by ${{ github.event_name }} event." - - - name: Check out repository code ${{ github.repository }} on ${{ github.ref }} - uses: actions/checkout@v3 - - - name: Set up Node.js ${{ env.NODE_VERSION }} - uses: actions/setup-node@v3 - with: - node-version: ${{ env.NODE_VERSION }} - cache: 'npm' - - - name: Cache node modules - uses: actions/cache@v3 - with: - path: node_modules - key: ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }} - restore-keys: | - ${{ runner.os }}-node- - - - name: Installing dependencies - if: steps.cache.outputs.cache-hit != 'true' - uses: borales/actions-yarn@v4 - with: - cmd: install --frozen-lockfile - - build: - needs: setup - runs-on: ubuntu-latest - steps: - - name: Check out repository code ${{ github.repository }} on ${{ github.ref }} - uses: actions/checkout@v3 - - - name: Restore node modules from cache - uses: actions/cache@v3 - with: - path: node_modules - key: ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }} - restore-keys: | - ${{ runner.os }}-node- - - - name: Build - uses: borales/actions-yarn@v4 - with: - cmd: build - - test: - needs: setup - runs-on: ubuntu-latest - steps: - - name: Check out repository code ${{ github.repository }} on ${{ github.ref }} - uses: actions/checkout@v3 - - - name: Restore node modules from cache - uses: actions/cache@v3 - with: - path: node_modules - key: ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }} - restore-keys: | - ${{ runner.os }}-node- - - - name: Test - uses: borales/actions-yarn@v4 - with: - cmd: test \ No newline at end of file