diff --git a/.github/workflows/build_test.yml b/.github/workflows/build_test.yml index 643f338..78d2efd 100644 --- a/.github/workflows/build_test.yml +++ b/.github/workflows/build_test.yml @@ -22,49 +22,89 @@ jobs: with: 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: | - cd copy-repo - if ${{ github.event_name == 'pull_request' }}; then - echo "changed_files=$(git diff --name-only -r HEAD^1 HEAD | xargs)" >> $GITHUB_OUTPUT - else - echo "changed_files=$(git diff --name-only ${{ github.event.before }} ${{ github.event.after }} | xargs)" >> $GITHUB_OUTPUT - fi + 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: Compare PR description with template + if: steps.check-changelog.outputs.check_commit == 'false' + env: + PR_DESCRIPTION: ${{ github.event.pull_request.body }} + run: | + # Safely print the PR description using Node.js + + node -e "const fs=require('fs'); fs.writeFileSync('/tmp/pr_description.txt', process.env.PR_DESCRIPTION);" + # Use diff to compare the two files + if diff -wB /tmp/pr_description.txt .github/pull_request_template.md > /dev/null; then + echo "ERROR: PR description is identical to the template." + exit 1 + else + echo "PR description and template are different." + fi - - name: List changed files - id: set-flag + - name: Check PR body against changelog + if: steps.check-changelog.outputs.check_commit == 'false' + id: extract-changelog 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 + result=$(node .github/workflows/set-changelog.js ${{ github.event.pull_request.number }}) + if [ "$result" = "Success" ]; then + 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 + echo "Updated CHANGELOG from description" + else + echo $result + echo -e "No changelog and version information found in PR description. Please add them.\nExpected Format:\nVERSION:X.XX.X\nCHANGELOG:This is changelog note.\nTo 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 if CHANGELOG is Updated and Abort if not updated - if: steps.set-flag.outputs.file-flag != 'true' + - name: check for changes + id: check-change run: | - echo "CHANGELOG.md not updated, please update CHANGELOG.md with the changes made in the pull request" - exit 1 + 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: Remove copy-repo - if: always() - run: rm -r copy-repo + 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 build-test: runs-on: ubuntu-latest diff --git a/.github/workflows/set-changelog.js b/.github/workflows/set-changelog.js new file mode 100644 index 0000000..9cd4f8e --- /dev/null +++ b/.github/workflows/set-changelog.js @@ -0,0 +1,59 @@ +/* +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 + +SPDX-License-Identifier: EPL-2.0 + +Copyright Contributors to the Zowe Project. +*/ + +const fs=require('fs'); + +//Must run with args: PR_NUMBER +const PR_NUMBER = process.argv[2]; + +const description = fs.readFileSync('/tmp/pr_description.txt', 'utf8'); +let changelogMsg, version; + +if (description.includes('VERSION:') && description.includes('CHANGELOG:')) { + let lines = description.split('\n'); + lines.forEach((line)=> { + if (line.startsWith('CHANGELOG:')) { + changelogMsg = line.substring('CHANGELOG:'.length+1).trim(); + } else if (line.startsWith('VERSION:')) { + version = line.substring('VERSION:'.length+1).trim(); + } + }); + if (changelogMsg && version) { + let changelog = fs.readFileSync('CHANGELOG.md', 'utf8'); + let changelogLines = changelog.split('\n'); + let versionIndex = -1; + let anchorIndex = 0; + for (let i = 0; i < changelogLines.length; i++) { + if (changelogLines[i].includes('This repo is part of the app-server Zowe Component, and the change logs here may appear on Zowe.org in that section.')) { + anchorIndex = i; + } else if (changelogLines[i].startsWith('## v'+version)) { + versionIndex = i; + break; + } + } + if (versionIndex != -1) { + changelogLines.splice(versionIndex+2, 0, `- ${changelogMsg} (#${PR_NUMBER})`); + } else { + changelogLines.splice(anchorIndex+1, 0, `\n## ${version}\n- ${changelogMsg} (#${PR_NUMBER})`); + } + const newChangelog = changelogLines.join('\n'); + fs.writeFileSync('CHANGELOG.md', newChangelog); + console.log('Success'); + } else { + if (!changelogMsg) { + console.log('Missing CHANGELOG'); + } + if (!version) { + console.log('Missing VERSION'); + } + } +} else { + console.log('Missing CHANGELOG or VERSION'); +} \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..899746d --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,7 @@ +# Zlux Server Framework Changelog + +All notable changes to the Zlux Server Framework package will be documented in this file.. +This repo is part of the app-server Zowe Component, and the change logs here may appear on Zowe.org in that section. + +## 2.14.0 +- Added a wrapper for wtoPrintf3 \ No newline at end of file