From 49ab03db9986b27dafd279fcc6121abe447784dc Mon Sep 17 00:00:00 2001 From: kschrief Date: Mon, 8 Apr 2024 14:50:34 -0400 Subject: [PATCH] feat: CI/CD docs (next-major) and merges (next-major/main) (#245) * New workflow * Fix: Not really * Undo comments * Undo comments * Added merge workflows * fix: Reversed version override flow * Less logins on GH Actions --- .github/workflows/merge-to-main.yml | 43 ++++++++++++++ .github/workflows/merge-to-next-major.yml | 72 +++++++++++++++++++++++ .github/workflows/release-github.yml | 28 ++++++--- 3 files changed, 134 insertions(+), 9 deletions(-) create mode 100644 .github/workflows/merge-to-main.yml create mode 100644 .github/workflows/merge-to-next-major.yml diff --git a/.github/workflows/merge-to-main.yml b/.github/workflows/merge-to-main.yml new file mode 100644 index 000000000..2c4c8f1df --- /dev/null +++ b/.github/workflows/merge-to-main.yml @@ -0,0 +1,43 @@ +name: Attempt to merge next to main +on: + workflow_dispatch: + +jobs: + # Check if next can merge into main + perform_merge: + name: Perform merge if "next" can merge into "main" + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + with: + fetch-depth: 0 + repo-token: ${{ secrets.SEMANTIC_RELEASE_BOT_PAT }} + persist-credentials: true + + # Set user identity + - name: Set-Identity + run: | + git config --global user.email "${{ secrets.GLOBAL_GITHUB_EMAIL }}" + git config --global user.name "${{ secrets.GLOBAL_GITHUB_USER }}" + + # Checkout "main" + - name: Checkout main + run: git checkout "main" + + - name: Perform the merge from next to main + run: | + git merge next + git push origin "main" + echo "Push to main succeeded" + + # If the merge cannot be performed, let stakeholders know + message_on_failure: + name: Merge failure + needs: perform_merge + runs-on: ubuntu-latest + if: ${{ failure() }} + + steps: + - name: Post error message (To-Do) + run: echo "Next cannot be merged into main cleanly" diff --git a/.github/workflows/merge-to-next-major.yml b/.github/workflows/merge-to-next-major.yml new file mode 100644 index 000000000..f0066b908 --- /dev/null +++ b/.github/workflows/merge-to-next-major.yml @@ -0,0 +1,72 @@ +name: Attempt to merge next to next-major +on: + workflow_dispatch: + push: + branches: + - 'next' + +jobs: + # Check if next can merge into next-major + perform_merge: + name: Perform merge if "next" can merge into "next-major" + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + with: + fetch-depth: 0 + repo-token: ${{ secrets.SEMANTIC_RELEASE_BOT_PAT }} + persist-credentials: true + + # Set user identity + - name: Set-Identity + run: | + git config --global user.email "${{ secrets.GLOBAL_GITHUB_EMAIL }}" + git config --global user.name "${{ secrets.GLOBAL_GITHUB_USER }}" + + # Checkout "next-major" + - name: Checkout next-major + run: git checkout "next-major" + + # Get the "next-major" version number + - name: Extract next-major version + id: extract_version + run: echo "::set-output name=version::$(node -e 'console.log(require("./package.json").version)')" + + # Checkout "next" + - name: Checkout next + run: git checkout "next" + + # Update "next" version to match "next-major" + - name: Update "next" version to match "next-major" + run: | + jq '.version = "${{ steps.extract_version.outputs.version }}"' package.json > temp.json + + if diff -q "package.json" "temp.json" >/dev/null; then + echo "Versions are identical. No change required." + rm temp.json + else + mv temp.json package.json + git add package.json && git commit -m "Sync version to ${{ steps.extract_version.outputs.version }}" + fi + + # Checkout "next-major" + - name: Checkout next-major + run: git checkout "next-major" + + - name: Perform the merge from next to next-major + run: | + git merge next + git push origin "next-major" + echo "Push to next-major succeeded" + + # If the merge cannot be performed, let stakeholders know + message_on_failure: + name: Merge failure + needs: perform_merge + runs-on: ubuntu-latest + if: ${{ failure() }} + + steps: + - name: Post error message (To-Do) + run: echo "Next cannot be merged into next-major cleanly" diff --git a/.github/workflows/release-github.yml b/.github/workflows/release-github.yml index 70fb05bd5..897303fae 100644 --- a/.github/workflows/release-github.yml +++ b/.github/workflows/release-github.yml @@ -9,7 +9,7 @@ on: - 'proposed' pull_request: types: [opened, synchronize] - branches: + branches: - 'next' - 'proposed' env: @@ -19,6 +19,7 @@ jobs: name: Release runs-on: ubuntu-latest steps: + # Checkout/install project - name: Checkout uses: actions/checkout@v2 with: @@ -35,6 +36,8 @@ jobs: run: 'echo "//registry.npmjs.org/:_authToken=${NPM_TOKEN}" > .npmrc' - name: Install dependencies run: npm ci + + # Set NPM_DIST_TAGS and DOCS_TAG if applicable based on branch - name: Set main tags if: github.ref_name == 'main' && github.event_name != 'pull_request' run: | @@ -45,17 +48,24 @@ jobs: run: | echo "NPM_DIST_TAG=next" >> $GITHUB_ENV echo "DOCS_TAG=next" >> $GITHUB_ENV + - name: Set next-major tags + if: github.ref_name == 'next-major' && github.event_name != 'pull_request' + run: | + echo "NPM_DIST_TAG=next-major" >> $GITHUB_ENV + echo "DOCS_TAGE=next-major" >> $GITHUB_ENV - name: Set feature branch tags - if: github.ref_name != 'main' && github.ref_name != 'next' && github.event_name != 'pull_request' + if: github.ref_name != 'main' && github.ref_name != 'next' && github.ref_name != 'next-major' && github.event_name != 'pull_request' run: | echo "NPM_DIST_TAG=test" >> $GITHUB_ENV echo "FEATURE_BRANCH=${{ github.ref_name }}" >> $GITHUB_ENV - name: Set PR tags - if: github.ref_name != 'main' && github.ref_name != 'next' && github.event_name == 'pull_request' + if: github.ref_name != 'main' && github.ref_name != 'next' && github.ref_name != 'next-major' && github.event_name == 'pull_request' run: | echo "NPM_DIST_TAG=test" >> $GITHUB_ENV echo "DOCS_TAG=pr-$(node ./src/js/version.mjs branch-to-prerelease ${{ github.head_ref }})" >> $GITHUB_ENV echo "FEATURE_BRANCH=${{ github.head_ref }}" >> $GITHUB_ENV + + # Perform real (When not a PR) or dry-run (When PR) semantic-release - name: Release mono-artifact to GitHub if: (github.ref_name != 'main' && github.event_name != 'pull_request') || github.event_name == 'workflow_dispatch' env: @@ -67,7 +77,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.SEMANTIC_RELEASE_BOT_PAT }} # <-- Allows semantic-release-bot to push changes to protected branches run: npx semantic-release --dry-run - name: Build artifacts for feature branches - if: github.ref_name != 'main' && github.ref_name != 'next' + if: github.ref_name != 'main' && github.ref_name != 'next' && github.ref_name != 'next-major' run: | PRERELEASE=$(node ./src/js/version.mjs branch-to-prerelease $FEATURE_BRANCH) node ./src/js/version.mjs latest-prerelease $PRERELEASE @@ -78,15 +88,15 @@ jobs: id: check_build uses: andstor/file-existence-action@v2 with: - files: "./src/sdks/core/dist/lib/firebolt.mjs" + files: './src/sdks/core/dist/lib/firebolt.mjs' - name: Release Firebolt SDKs to NPM if: steps.check_build.outputs.files_exists == 'true' && github.event_name != 'pull_request' && (github.ref_name != 'main' || github.event_name == 'workflow_dispatch') env: NPM_TOKEN: ${{ secrets.SEMANTIC_RELEASE_NPM_TOKEN }} # <-- Allows semantic-release to publish to npm without 2 factor auth. run: | - npm --version - echo "NPM DIST TAG :: " $NPM_DIST_TAG - npm publish --tag $NPM_DIST_TAG --workspaces + npm --version + echo "NPM DIST TAG :: " $NPM_DIST_TAG + npm publish --tag $NPM_DIST_TAG --workspaces - name: Dry-run Firebolt SDKs to NPM if: steps.check_build.outputs.files_exists == 'true' && (github.ref_name == 'main' && github.event_name != 'workflow_dispatch') env: @@ -100,7 +110,7 @@ jobs: cd /tmp git clone https://rdkcentral:$GITHUB_TOKEN@github.com/rdkcentral/firebolt.git ./firebolt-docs - name: Release docs to GitHub.io - if: steps.check_build.outputs.files_exists == 'true' && (github.ref_name == 'main' || github.ref_name == 'next' || github.event_name == 'pull_request') + if: steps.check_build.outputs.files_exists == 'true' && (github.ref_name == 'main' || github.ref_name == 'next' || github.ref_name == 'next-major' || github.event_name == 'pull_request') env: GITHUB_TOKEN: ${{ secrets.SEMANTIC_RELEASE_BOT_PAT }} # <-- Allows semantic-release-bot to push changes to protected branches run: |