From fd37b96687c20bd04646c026b7efa95fe25eea1d Mon Sep 17 00:00:00 2001 From: miroslavpojer Date: Fri, 23 Aug 2024 13:35:07 +0200 Subject: [PATCH] Prepared: (#2) - Issue templates. - Added CODEOWNERS, CODEOWNERS and CONTRIBUTING md files. - .gitignore. - Expected structure for code and tests with init files. - GH workflows for build, PR comment presence check and Release draft generation. - Expected requirements for python libraries. - Initial structure of README to follow team format. --- .github/CODEOWNERS | 1 + .github/ISSUE_TEMPLATE/bug_report.md | 25 ++++ .github/ISSUE_TEMPLATE/feature_request.md | 21 +++ .github/ISSUE_TEMPLATE/question.md | 13 ++ .github/ISSUE_TEMPLATE/spike_task.md | 36 +++++ .github/workflows/build.yml | 85 +++++++++++ .../check_pr_release_note_comment.yml | 59 ++++++++ .github/workflows/release_draft.yml | 139 ++++++++++++++++++ .gitignore | 2 +- CONTRIBUTING.md | 37 +++++ README.md | 91 +++++++++++- action.yml | 25 ++++ jacoco_report/__init__.py | 0 requirements.txt | 4 + tests/__init__.py | 0 15 files changed, 536 insertions(+), 2 deletions(-) create mode 100644 .github/CODEOWNERS create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/ISSUE_TEMPLATE/question.md create mode 100644 .github/ISSUE_TEMPLATE/spike_task.md create mode 100644 .github/workflows/build.yml create mode 100644 .github/workflows/check_pr_release_note_comment.yml create mode 100644 .github/workflows/release_draft.yml create mode 100644 CONTRIBUTING.md create mode 100644 action.yml create mode 100644 jacoco_report/__init__.py create mode 100644 requirements.txt create mode 100644 tests/__init__.py diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000..6664c76 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1 @@ +* @miroslavpojer @Zejnilovic diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..3aa610b --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,25 @@ +--- +name: Bug report +about: Create a report to help us improve +labels: 'bug' + +--- + +## Describe the bug +A clear and concise description of what the bug is. + +## To Reproduce +Steps to reproduce the behavior OR commands run: +1. Go to '...' +2. Click on '....' +3. Enter value '...' +4. See error + +## Expected behavior +A clear and concise description of what you expected to happen. + +## Screenshots +If applicable, add screenshots to help explain your problem. + +## Additional context +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..74a56c3 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,21 @@ +--- +name: Feature request +about: Suggest an idea for this project +labels: 'enhancement' + +--- + +## Background +A clear and concise description of where the limitation lies. + +## Feature +A description of the requested feature. + +## Example [Optional] +A simple example if applicable. + +## Proposed Solution [Optional] +Solution Ideas: +1. +2. +3. diff --git a/.github/ISSUE_TEMPLATE/question.md b/.github/ISSUE_TEMPLATE/question.md new file mode 100644 index 0000000..24ba89d --- /dev/null +++ b/.github/ISSUE_TEMPLATE/question.md @@ -0,0 +1,13 @@ +--- +name: Question +about: Ask a question +labels: 'question' + +--- + +## Background [Optional] +A clear explanation of the reason for raising the question. +This gives us a better understanding of your use cases and how we might accommodate them. + +## Question +A clear and concise inquiry diff --git a/.github/ISSUE_TEMPLATE/spike_task.md b/.github/ISSUE_TEMPLATE/spike_task.md new file mode 100644 index 0000000..d071e81 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/spike_task.md @@ -0,0 +1,36 @@ +--- +name: Spike +about: Issue template for spikes, research and investigation tasks +labels: 'spike' + +--- + +## Background +A clear and concise description of the problem or a topic we need to understand. + +Feel free to add information about why it's needed and what assumptions you have at the moment. + +## Questions To Answer + +1. +2. +3. + +## Desired Outcome + +The list of desired outcomes of this spike ticket. + +```[tasklist] +### Tasks +- [ ] Questions have been answered or we have a clearer idea of how to get to our goal +- [ ] Discussion with the team +- [ ] Documentation +- [ ] Create recommendations and new implementation tickets +- [ ] item here.. +``` + +## Additional Info/Resources [Optional] + +1. +2. +3. diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..b273ba5 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,85 @@ +# +# Copyright 2024 ABSA Group Limited +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +name: Build and Test +on: + pull_request: + branches: + - '**' + types: [ opened, synchronize, reopened ] + +jobs: + test: + name: Test + runs-on: ubuntu-latest + + defaults: + run: + shell: bash + + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - uses: actions/setup-python@v5.1.1 + with: + python-version: '3.11' + cache: 'pip' + + - name: Install Python dependencies + run: | + pip install -r requirements.txt + + - name: Set PYTHONPATH environment variable + run: echo "PYTHONPATH=${GITHUB_WORKSPACE}/jacoco-report/jacoco-report" >> $GITHUB_ENV + + - name: Build and run unit tests + run: pytest --cov=jacoco-report --cov-report html tests/ -vv + + - name: Check overall coverage + run: | + coverage report --fail-under=80 + coverage xml -o coverage_overall.xml + + - name: Check changed files coverage + run: | + # Get the list of changed Python files + CHANGED_FILES=$(git diff --name-only --diff-filter=AMR ${{ github.event.pull_request.base.sha }} ${{ github.sha }} | grep '.py$') + echo "Changed Python files: $CHANGED_FILES" + + # Convert list to comma-delimited string + CHANGED_FILES=$(echo "$CHANGED_FILES" | awk '{printf "%s,", $0} END {print ""}' | sed 's/,$//') + + # Generate coverage report for changed files + coverage report --include="$CHANGED_FILES" > coverage_report.txt + echo -e "\nChanged Python files report:\n\n" + cat coverage_report.txt + + # Fail if the coverage for changed files is below threshold + COVERAGE_TOTAL=$(awk '/TOTAL/ {print $4}' coverage_report.txt) + echo "Total coverage for changed files: $COVERAGE_TOTAL" + + if (( $(echo "$COVERAGE_TOTAL < 80.0" | bc -l) )); then + echo "Coverage is below 80%" + exit 1 + fi + + - name: Upload coverage report + uses: actions/upload-artifact@v3 + with: + name: coverage-report + path: coverage_overall.xml diff --git a/.github/workflows/check_pr_release_note_comment.yml b/.github/workflows/check_pr_release_note_comment.yml new file mode 100644 index 0000000..7d2afbc --- /dev/null +++ b/.github/workflows/check_pr_release_note_comment.yml @@ -0,0 +1,59 @@ +# +# Copyright 2024 ABSA Group Limited +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +name: Check Release Notes in PR comment + +on: + pull_request: + types: [opened, synchronize, reopened, edited, labeled, unlabeled] + branches: [ master ] + +jobs: + check-release-notes-comments: + runs-on: ubuntu-latest + steps: + - name: Fetch all PR comments + id: get-comments + uses: actions/github-script@v7 + with: + github-token: ${{secrets.GITHUB_TOKEN}} + script: | + const issueNumber = context.issue.number; + const repoName = context.repo.repo; + const repoOwner = context.repo.owner; + + const comments = await github.rest.issues.listComments({ + owner: repoOwner, + repo: repoName, + issue_number: issueNumber, + }); + + return comments.data.map(comment => comment.body); + + - name: Check for 'Release Notes' in comments + uses: actions/github-script@v7 + with: + script: | + const comments = ${{ steps.get-comments.outputs.result }}; + const releaseNotesRegex = /release notes/i; + const hasReleaseNotes = comments.some(comment => releaseNotesRegex.test(comment)); + + if (!hasReleaseNotes) { + console.log('No "Release notes" found in PR comments'); + core.setFailed('No "Release notes" found in PR comments') + } else { + console.log('"Release notes" found in comments'); + } diff --git a/.github/workflows/release_draft.yml b/.github/workflows/release_draft.yml new file mode 100644 index 0000000..72bee14 --- /dev/null +++ b/.github/workflows/release_draft.yml @@ -0,0 +1,139 @@ +# +# Copyright 2024 ABSA Group Limited +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +name: Release - create draft release +on: + workflow_dispatch: + inputs: + tag-name: + description: 'Name of git tag to be created, and then draft release created. Syntax: "v[0-9]+.[0-9]+.[0-9]+".' + required: true + +jobs: + check-tag: + runs-on: ubuntu-latest + name: Check tag + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Validate format of received tag + uses: actions/github-script@v7 + with: + script: | + const newTag = core.getInput('tag-name'); + const regex = /^v[0-9]+\.[0-9]+\.[0-9]+$/; + + if (!regex.test(newTag)) { + core.setFailed('Tag does not match the required format "v[0-9]+.[0-9]+.[0-9]+"'); + return; + } + tag-name: ${{ github.event.inputs.tag-name }} + + - name: Check tag's correct version increment + uses: actions/github-script@v7 + with: + script: | + const newTag = core.getInput('tag-name'); + + // get latest tag + const { data: refs } = await github.rest.git.listMatchingRefs({ + owner: context.repo.owner, + repo: context.repo.repo, + ref: 'tags/' + }); + + if (refs.length === 0) { + // No existing tags, so any new tag is valid + console.log('No existing tags found. Any new tag is considered valid.'); + return; + } else { + console.log(`Existing tags: ${refs.map(ref => ref.ref.replace('refs/tags/', '')).join(', ')}`); + } + + const latestTag = refs.sort((a, b) => new Date(b.object.date) - new Date(a.object.date))[0].ref.replace('refs/tags/', ''); + const latestVersion = latestTag.replace('v', '').split('.').map(Number); + const newVersion = newTag.replace('v', '').split('.').map(Number); + + // check tag's correct version increase + const isValid = (latestVersion[0] === newVersion[0] && latestVersion[1] === newVersion[1] && newVersion[2] === latestVersion[2] + 1) || + (latestVersion[0] === newVersion[0] && newVersion[1] === latestVersion[1] + 1 && newVersion[2] === 0) || + (newVersion[0] === latestVersion[0] + 1 && newVersion[1] === 0 && newVersion[2] === 0); + + if (!isValid) { + core.setFailed('New tag is not one version higher than the latest tag'); + return; + } + + tag-name: ${{ github.event.inputs.tag-name }} + + generate-release-notes: + needs: check-tag + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - uses: actions/setup-python@v5.1.1 + with: + python-version: '3.11' + + - name: Generate release notes + id: generate_release_notes + uses: AbsaOSS/generate-release-notes@master + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag-name: ${{ github.event.inputs.tag-name }} + chapters: '[ + {"title": "Breaking Changes ๐Ÿ’ฅ", "label": "breaking-change"}, + {"title": "New Features ๐ŸŽ‰", "label": "feature"}, + {"title": "New Features ๐ŸŽ‰", "label": "enhancement"}, + {"title": "Bugfixes ๐Ÿ› ", "label": "bug"} + ]' + warnings: true + + - name: Create and Push Tag + uses: actions/github-script@v7 + with: + script: | + const tag = core.getInput('tag-name') + const ref = `refs/tags/${tag}`; + const sha = context.sha; // The SHA of the commit to tag + + await github.rest.git.createRef({ + owner: context.repo.owner, + repo: context.repo.repo, + ref: ref, + sha: sha + }); + + console.log(`Tag created: ${tag}`); + github-token: ${{ secrets.GITHUB_TOKEN }} + tag-name: ${{ github.event.inputs.tag-name }} + + - name: Create Draft Release + uses: softprops/action-gh-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + name: ${{ github.event.inputs.tag-name }} + body: ${{ steps.generate_release_notes.outputs.release-notes }} + tag_name: ${{ github.event.inputs.tag-name }} + draft: true + prerelease: false diff --git a/.gitignore b/.gitignore index 82f9275..7b6caf3 100644 --- a/.gitignore +++ b/.gitignore @@ -159,4 +159,4 @@ cython_debug/ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore # and can be added to the global gitignore or merged into this file. For a more nuclear # option (not recommended) you can uncomment the following to ignore the entire idea folder. -#.idea/ +.idea/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..04087fc --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,37 @@ +# How to Contribute? + +## **Identifying and Reporting Bugs** +* **Ensure the bug has not already been reported** by searching our **[GitHub Issues](https://github.com/AbsaOSS/jacoco-report/issues)**. +* If you cannot find an open issue describing the problem, use the **Bug report** template to open a new one. Tag it with the **bug** label. + +## **Proposing New Features** + +* **Check if the feature has already been requested** by searching through our **[GitHub Issues](https://github.com/AbsaOSS/jacoco-report/issues)**. +* If the feature request doesn't exist, feel free to create a new one. Tag it with the **request** label. + +## **Contributing to Development** + +* Check _Issues_ logs for the desired feature or bug. Ensure that no one else is already working on it. + * If the feature/bug is not yet filed, please create a detailed issue first: + * **"Detail Your Idea or Issue"** +* Fork the repository. +* Begin coding. Feel free to ask questions and collaborate with us. + * Commit messages should reference the GitHub Issue and provide a concise description: + * **"#34 - Implement Feature X"** + * Remember to include tests for your code. +* Once done, push to your fork and submit a Pull Request to our `master` branch: + * Pull Request titles should begin with the GitHub Issue number: + * **"45 - Implementing New Analytics Feature"** + * Ensure the Pull Request description clearly outlines your solution. + * Add Release Notes comment describing implemented changes. + * Link your PR to the relevant _Issue_. + +### Community and Communication + +If you have any questions or need help, don't hesitate to reach out through our GitHub discussion section. We're here to help! + +#### Thanks! + +Your contributions are invaluable to us. Thank you for being part of the AbsaOSS community and helping us grow and improve! + +The AbsaOSS Team diff --git a/README.md b/README.md index 3c4a15e..dc92522 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,91 @@ -# jacoco-report +# JaCoCo Report Github action that publishes the JaCoCo report as a comment in the Pull Request. + +## Description +The **JaCoCo Report** GitHub Action is designed to publish the JaCoCo code coverage report as a comment in the Pull Request. It provides a detailed overview of the code coverage, highlighting the percentage of lines, branches, and methods covered by the tests. This action helps developers and reviewers assess the quality of the codebase and identify areas that require additional testing. + +## How It Works +TODO + +## Inputs +### `TODO` +- **Description**: TODO +- **Required**: Yes +- **Example**: `TODO` + +### `verbose-logging` +- **Description**: Enable verbose logging to provide detailed output during the actionโ€™s execution, aiding in troubleshooting and setup. +- **Required**: No +- **Default**: `false` +- **Note**: If workflow run in debug mode, 'verbose-logging' is set to 'true.' + +### `fail-on-violation` +- **Description**: Set to true to fail the action if any convention violations are detected. Set false to continue without failure. +- **Required**: No +- **Default**: `false` + +## Usage Example +### Default +```yaml +TODO +``` + +### Full example +```yaml +TODO +``` + +## How to build + +Clone the repository and navigate to the project directory: + +```bash +git clone https://github.com/AbsaOSS/jacoco-report.git +cd jacoco-report +``` + +Install the dependencies: +```bash +pip install -r requirements.txt +``` + + +## Running Unit Tests +Unit tests are written using pytest. To run the tests, use the following command: + +```bash +pytest +``` + +This will execute all tests located in the __tests__ directory and generate a code coverage report. + +## Code Coverage +Code coverage is collected using pytest-cov coverage tool. To run the tests and collect coverage information, use the following command: + +```bash +pytest --cov=jacoco_report --cov-report html tests/ +``` +See the coverage report on the path: +```bash +htmlcov/index.html +``` + +## Run Action Locally +Create *.sh file and place it in the project root. +```bash +#!/bin/bash + +# Set environment variables based on the action inputs +export INPUT_TODO="TODO" + +# Run the Python script +python3 ./jacoco_report/todo.py +``` + + +## Contributing +Feel free to submit issues or pull requests. For major changes, please open an issue first to discuss what you would like to change. + +## License + +This project is licensed under the Apache 2.0 License - see the [LICENSE](LICENSE) file for details. diff --git a/action.yml b/action.yml new file mode 100644 index 0000000..ec8e51e --- /dev/null +++ b/action.yml @@ -0,0 +1,25 @@ +name: 'jacoco-report' +description: 'Publish JaCoCo report as comment in the PR' +inputs: + input-name: + description: 'TODO' + required: true +outputs: + output-name: + description: 'TODO' + value: ${{ steps.filename-inspector.outputs.output-name }} + +branding: + icon: 'bookmark' + color: 'yellow' + +runs: + using: 'composite' + steps: + - name: Publish JaCoCo report as comment in the PR + id: jacoco-report + env: + INPUT_NAME: ${{ inputs.name }} + run: | + python ${{ github.action_path }}/jacoco-report/TODO.py + shell: bash diff --git a/jacoco_report/__init__.py b/jacoco_report/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..8d8bb57 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,4 @@ +coverage==7.5.2 +pytest==7.4.3 +pytest-cov==5.0.0 +pytest-mock==3.14.0 diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29