diff --git a/.github/workflows/build-core.yml b/.github/workflows/build-core.yml index 84bbbd5..39e85fa 100644 --- a/.github/workflows/build-core.yml +++ b/.github/workflows/build-core.yml @@ -44,50 +44,99 @@ jobs: github-repo: ${{ github.repository }} github-token: ${{ secrets.GITHUB_TOKEN }} - check_changelog: + update-changelog: + if: github.event_name == 'pull_request' runs-on: ubuntu-latest + outputs: + was_updated: ${{ steps.check-change.outputs.change_detected }} + check_commit: ${{ steps.check-changelog.outputs.check_commit }} steps: - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@v2 with: - path: copy-repo - fetch-depth: ${{ github.event_name == 'pull_request' && 2 || 0 }} + ref: ${{ github.head_ref }} + fetch-depth: 0 - - name: Get changed files - id: changed-files + - name: Check for updated CHANGELOG.md using git + id: check-changelog + run: | + if git diff --name-only origin/${{ github.base_ref }} | grep -q "^CHANGELOG.md$"; then + echo "CHANGELOG.md has been updated." + echo "::set-output name=check_commit::true" + else + echo "ERROR: CHANGELOG.md has not been updated." + echo "::set-output name=check_commit::false" + fi + - name: Extract changelog info + if: steps.check-changelog.outputs.check_commit == 'false' + id: extract-changelog run: | - cd copy-repo - if ${{ github.event_name == 'pull_request' }}; then - echo "changed_files=$(git diff --name-only -r HEAD^1 HEAD | xargs)" >> $GITHUB_OUTPUT + PR_DESCRIPTION="${{ github.event.pull_request.body }}" + # Check if "changelog:" exists in PR description + if echo "$PR_DESCRIPTION" | grep -q "VERSION:" && echo "$PR_DESCRIPTION" | grep -q "CHANGELOG:"; then + # Extract text after "changelog:" + CHANGELOG_TEXT=$(echo $PR_DESCRIPTION | sed -n 's/.*CHANGELOG: \(.*\)/\1/p') + # Extract VERSION: from PR description + VERSION=$(echo "$PR_DESCRIPTION" | grep -oP 'VERSION:\s*\Kv\d+\.\d+\.\d+') + echo "Extracted changelog: $CHANGELOG_TEXT" + echo "::set-output name=changelog::$CHANGELOG_TEXT" + echo "::set-output name=version::$VERSION" + else + echo -e "No changelog and version information found in PR description please add them.\n Expected Format:\n VERSION:vX.XX.X\n CHANGELOG:This is changelog note.\n + To re-run the action, just make a push or commit after updating the PR description or updating the changelog via a manual file changing commit." + exit 1 + fi + - name: Check PR body against changelog + if: steps.check-changelog.outputs.check_commit == 'false' + run: | + ESCAPED_CHANGELOG="${{ steps.extract-changelog.outputs.changelog }}" + ESCAPED_CHANGELOG=$(echo "$ESCAPED_CHANGELOG" | sed "s/'/\\\\'/g") + VERSION="${{ steps.extract-changelog.outputs.version }}" + + if ! grep -Fq "$ESCAPED_CHANGELOG" CHANGELOG.md; then + # Check if version exists in CHANGELOG.md + if grep -q "^## $VERSION" CHANGELOG.md; then + # Append PR description to existing version + sed -i "/^## $VERSION/a - $ESCAPED_CHANGELOG (#${{ github.event.pull_request.number }})" CHANGELOG.md else - echo "changed_files=$(git diff --name-only ${{ github.event.before }} ${{ github.event.after }} | xargs)" >> $GITHUB_OUTPUT + # Append new version and PR description + ANCHOR_LINE=$(awk '/All notable changes to the Zlux App Server package will be documented in this file\./ {print NR}' CHANGELOG.md) + sed -i "$ANCHOR_LINE a\\ + \n## $VERSION\n- $ESCAPED_CHANGELOG (#${{ github.event.pull_request.number }})\n" CHANGELOG.md fi - - - name: List changed files - id: set-flag + git config --global user.email "zowe-robot@users.noreply.github.com" + git config --global user.name "Zowe Robot" + git add CHANGELOG.md + git commit -s -m "Update changelog with PR #${{ github.event.pull_request.number }} description" + git push + fi + - name: check for changes + id: check-change run: | - cd copy-repo - for file in ${{ steps.changed-files.outputs.changed_files }}; do - echo "$file was changed" - if [[ $file == "CHANGELOG.md" ]] - then - echo "file-flag=true" >> $GITHUB_OUTPUT - break; - else - echo "file-flag=false" >> $GITHUB_OUTPUT - fi - done + if git diff --name-only HEAD^ HEAD | grep 'changelog.md'; then + echo "No Changes detected, setting flag to false" + echo "::set-output name=change_detected::false" + else + echo "::set-output name=change_detected::true" + fi - - name: Check if CHANGELOG is Updated and Abort if not updated - if: steps.set-flag.outputs.file-flag != 'true' - run: | - echo "CHANGELOG.md not updated, please update CHANGELOG.md with the changes made in the pull request" - exit 1 + check_changelog: + if: github.event_name == 'pull_request' + needs: update-changelog + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Verify Changelog update + run: | + if [ "${{ needs.update-changelog.outputs.was_updated }}" != "true" ]; then + echo "CHANGELOG.md not updated, please update CHANGELOG.md with the changes made in the pull request" + exit 1 + else + echo "changelog was updated successfully." + fi - - name: Remove copy-repo - if: always() - run: rm -r copy-repo - build: runs-on: ubuntu-latest needs: check-permission @@ -103,7 +152,7 @@ jobs: key: ${{ runner.os }}-build-cache-node-modules-${{ hashFiles('**/package-lock.json') }} restore-keys: | ${{ runner.os }}-build-cache-node-modules- - + - name: '[Prep 2] Setup Node' uses: actions/setup-node@v2 with: @@ -139,6 +188,7 @@ jobs: pax-ssh-username: ${{ secrets.SSH_MARIST_USERNAME }} pax-ssh-password: ${{ secrets.SSH_MARIST_RACF_PASSWORD }} pax-name: zlux-core - + - name: '[Prep 7] deploy' uses: zowe-actions/zlux-builds/core/deploy@v2.x/main + diff --git a/CHANGELOG.md b/CHANGELOG.md index 0ec16a5..face090 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,10 @@ # Zlux App Server Changelog All notable changes to the Zlux App Server package will be documented in this file. + +## v2.12.0 +- enhancement: new versions of components can change the location of their plugins, as the app-server will now re-inspect the plugin locations on each startup. (#280) + ## v2.11.0 diff --git a/README.md b/README.md index 74639a5..a503e9b 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -This program and the accompanying materials are + This program and the accompanying materials are made available under the terms of the Eclipse Public License v2.0 which accompanies this distribution, and is available at https://www.eclipse.org/legal/epl-v20.html diff --git a/bin/init/plugins-init.js b/bin/init/plugins-init.js index 15e5e58..d99e7de 100644 --- a/bin/init/plugins-init.js +++ b/bin/init/plugins-init.js @@ -38,33 +38,27 @@ function deleteFile(path) { } function registerPlugin(pluginPath, pluginDefinition) { - const pointerPath = `${pluginPointerDirectory}/${pluginDefinition.identifier}.json`; - if (fs.fileExists(pointerPath)) { - //in case of upgrade - registerApp2App(pluginPath, pluginDefinition.identifier, pluginDefinition.pluginVersion); - return true; - } else { - let location, relativeTo; - if (pluginPath.startsWith(runtimeDirectory)) { - relativeTo = "$ZWE_zowe_runtimeDirectory"; - location = pluginPath.substring(runtimeDirectory.length); - if (location.startsWith('/')) { - location = location.substring(1); - } - - xplatform.storeFileUTF8(pointerPath, xplatform.AUTO_DETECT, JSON.stringify({ - "identifier": pluginDefinition.identifier, - "pluginLocation": location, - "relativeTo": relativeTo - }, null, 2)); - } else { - xplatform.storeFileUTF8(pointerPath, xplatform.AUTO_DETECT, JSON.stringify({ - "identifier": pluginDefinition.identifier, - "pluginLocation": pluginPath - }, null, 2)); + const pointerPath = `${pluginPointerDirectory}/${pluginDefinition.identifier}.json`; + let location, relativeTo; + if (pluginPath.startsWith(runtimeDirectory)) { + relativeTo = "$ZWE_zowe_runtimeDirectory"; + location = pluginPath.substring(runtimeDirectory.length); + if (location.startsWith('/')) { + location = location.substring(1); } - registerApp2App(pluginPath, pluginDefinition.identifier, pluginDefinition.pluginVersion); + + xplatform.storeFileUTF8(pointerPath, xplatform.AUTO_DETECT, JSON.stringify({ + "identifier": pluginDefinition.identifier, + "pluginLocation": location, + "relativeTo": relativeTo + }, null, 2)); + } else { + xplatform.storeFileUTF8(pointerPath, xplatform.AUTO_DETECT, JSON.stringify({ + "identifier": pluginDefinition.identifier, + "pluginLocation": pluginPath + }, null, 2)); } + registerApp2App(pluginPath, pluginDefinition.identifier, pluginDefinition.pluginVersion); }