@@ -0,0 +1,21 @@
|
||||
{
|
||||
labelsSynonyms: {
|
||||
bug: ['error', 'need fix', 'not working', 'failure', 'crash', 'problem', 'issue', 'defect', 'glitch', 'fault', 'anomaly'],
|
||||
enhancement: ['upgrade', 'update', 'improve', 'feature request', 'new feature', 'enhance', 'extension', 'add-on', 'improvement'],
|
||||
"help wanted": ['help', 'how can i', 'assistance needed', 'support needed', 'question', 'guidance', 'aid', 'need assistance', 'advice', 'instruction'],
|
||||
documentation: ['docs', 'Readme', 'documentation', 'guide', 'manual', 'instructions', 'how-to', 'reference', 'tutorial', 'specification'],
|
||||
docker: ['compose', 'Dockerfile', 'container', 'docker-compose', 'image', 'docker setup', 'kubernetes', 'docker swarm', 'containerization'],
|
||||
performance: ['slow', 'lag', 'performance', 'speed', 'optimization', 'tuning', 'efficiency', 'latency', 'improve performance', 'boost', 'performance issue'],
|
||||
security: ['vulnerability', 'exploit', 'attack', 'breach', 'security', 'protection', 'patch', 'secure', 'threat', 'risk', 'malware'],
|
||||
ui: ['user interface', 'ui', 'ux', 'design', 'layout', 'front-end', 'visual', 'interface', 'experience', 'aesthetic', 'theme', 'style'],
|
||||
test: ['test', 'testing', 'unit test', 'integration test', 'e2e test', 'automated test', 'test case', 'test suite', 'qa', 'quality assurance'],
|
||||
compatibility: ['compatible', 'incompatible', 'version', 'compatibility', 'interop', 'support', 'versioning', 'cross-platform', 'integration', 'compatibility issue']
|
||||
},
|
||||
labelsNotAllowed: [
|
||||
'duplicate',
|
||||
'good first issue',
|
||||
'invalid'
|
||||
],
|
||||
//defaultLabels: ['triage'],
|
||||
ignoreComments: true
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
# .github/labeler.yml
|
||||
|
||||
# Label for documentation changes
|
||||
documentation:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- 'docs/**'
|
||||
- 'README.md'
|
||||
- 'CHANGELOG.md'
|
||||
- 'CONTRIBUTING.md'
|
||||
- 'Makefile'
|
||||
- 'Pictures'
|
||||
|
||||
|
||||
# Label for Docker changes
|
||||
docker:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- '*docker*'
|
||||
- 'Docker*'
|
||||
|
||||
# Label for release-related changes
|
||||
release:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- 'scraibe/**'
|
||||
- 'pyproject.toml'
|
||||
- 'LICENCE'
|
||||
|
||||
tests:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- 'test/**'
|
||||
|
||||
workflows:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- '.github/workflows/*'
|
||||
- '.github/*'
|
||||
|
||||
github:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- '.gitignore'
|
||||
|
||||
dependencies:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- 'requirements.txt'
|
||||
- 'environment.yml'
|
||||
- 'pyproject.toml'
|
||||
- head-branch: ['^dependencies', 'dependencies', '^dependency', 'dependency']
|
||||
|
||||
feature:
|
||||
- head-branch: ['^feature', 'feature']
|
||||
|
||||
patch:
|
||||
- head-branch: ['^patch', 'patch', '^bug', 'bug']
|
||||
|
||||
ignore-pr-title-for-release:
|
||||
- head-branch: ['develop']
|
||||
- base-branch: ['main']
|
||||
@@ -0,0 +1,47 @@
|
||||
#Automatically generated release notes from GIthub used by softprops/action-gh-release@v2 in .github/workflows/release.yaml
|
||||
|
||||
changelog:
|
||||
exclude:
|
||||
labels:
|
||||
- ignore-for-release
|
||||
- ignore-pr-title-for-release
|
||||
- workflows
|
||||
- github
|
||||
- documentation
|
||||
authors:
|
||||
- octocat
|
||||
- github-actions[bot]
|
||||
|
||||
categories:
|
||||
- title: New Features 🎉
|
||||
labels:
|
||||
- enhancement
|
||||
- feature
|
||||
- Semver-Minor
|
||||
|
||||
- title: Bug Fixes 🐛
|
||||
labels:
|
||||
- bug
|
||||
- fix
|
||||
- patch
|
||||
|
||||
- title: Dependency Updates 📦
|
||||
labels:
|
||||
- dependency
|
||||
- dependencies
|
||||
- dependency-update
|
||||
|
||||
- title: Breaking Changes 🛠
|
||||
labels:
|
||||
- breaking-change
|
||||
- Semver-Major
|
||||
|
||||
- title: Container and Compose Updates 🐳
|
||||
labels:
|
||||
- docker
|
||||
- compose
|
||||
- docker-compose
|
||||
|
||||
- title: Other Changes 🔧
|
||||
labels:
|
||||
- "*"
|
||||
@@ -0,0 +1,18 @@
|
||||
name: Labeling new issue
|
||||
on:
|
||||
issues:
|
||||
types: ['opened', 'reopened']
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
sparse-checkout: |
|
||||
.github/auto-label.json5
|
||||
sparse-checkout-cone-mode: false
|
||||
- uses: Renato66/auto-label@v3
|
||||
with:
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
configuration-file: .github/auto-label.json5
|
||||
@@ -0,0 +1,22 @@
|
||||
name: Auto Label PRs
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
types: [opened, synchronize, reopened, edited]
|
||||
|
||||
jobs:
|
||||
label:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
pull-requests: write
|
||||
outputs:
|
||||
all-labels: ${{ steps.label-the-PR.outputs.all-labels }}
|
||||
steps:
|
||||
- name: Apply Labels
|
||||
id: label-the-PR
|
||||
uses: actions/labeler@v5
|
||||
with:
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
configuration-path: .github/auto_label_pr.yml
|
||||
sync-labels: true
|
||||
@@ -1,29 +0,0 @@
|
||||
name: Manual Publish to PyPI
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
branch:
|
||||
description: 'Branch to check out (main or develop)'
|
||||
required: true
|
||||
type: choice
|
||||
options:
|
||||
- main
|
||||
- develop
|
||||
|
||||
jobs:
|
||||
publish-to-pypi:
|
||||
name: Publish to PyPI
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout Repository
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: '0'
|
||||
ref: ${{ github.event.inputs.branch }}
|
||||
- name: Set up Poetry 📦
|
||||
uses: JRubics/poetry-publish@v1.16
|
||||
with:
|
||||
pypi_token: ${{ secrets.PYPI_API_TOKEN }}
|
||||
plugins: "poetry-dynamic-versioning"
|
||||
repository_name: "scraibe"
|
||||
+34
-13
@@ -1,24 +1,35 @@
|
||||
name: Publish Python 🐍 distribution 📦 to PyPI and TestPyPI
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
types: [closed]
|
||||
pull_request_target:
|
||||
branches:
|
||||
- develop
|
||||
- main
|
||||
types:
|
||||
- closed
|
||||
push:
|
||||
tags:
|
||||
- 'v*.*.*'
|
||||
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
job:
|
||||
description: "Select job to run"
|
||||
required: true
|
||||
type: choice
|
||||
options:
|
||||
- Build-and-publish-to-Test-PyPI
|
||||
- test-install
|
||||
- publish-to-pypi
|
||||
test:
|
||||
description: "Run tests"
|
||||
default: true
|
||||
type: boolean
|
||||
publish_to_pypi:
|
||||
description: "Publish to PyPI"
|
||||
default: false
|
||||
type: boolean
|
||||
|
||||
jobs:
|
||||
Build-and-publish-to-Test-PyPI:
|
||||
if: |
|
||||
(github.event_name == 'workflow_dispatch' &&
|
||||
github.event.inputs.test == 'true') ||
|
||||
(github.event_name == 'pull_request_target' &&
|
||||
github.event.pull_request.merged &&
|
||||
contains(github.event.pull_request.labels.*.name, 'release')) ||
|
||||
(github.event_name == 'push' && startsWith(github.ref, 'refs/tags/'))
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
@@ -32,7 +43,7 @@ jobs:
|
||||
repository_name: "scraibe"
|
||||
repository_url: "https://test.pypi.org/legacy/"
|
||||
|
||||
test-install:
|
||||
Test-PyPi-install:
|
||||
name: Test Installation from TestPyPI
|
||||
needs: Build-and-publish-to-Test-PyPI
|
||||
runs-on: ubuntu-latest
|
||||
@@ -54,8 +65,18 @@ jobs:
|
||||
|
||||
publish-to-pypi:
|
||||
name: Publish to PyPI
|
||||
needs: test-install
|
||||
needs: Test-PyPi-install
|
||||
runs-on: ubuntu-latest
|
||||
if: |
|
||||
always() &&
|
||||
(( needs.Build-and-publish-to-Test-PyPI.result != 'failure' &&
|
||||
needs.Test-PyPi-install.result != 'failure' ) &&
|
||||
((github.event_name == 'workflow_dispatch' &&
|
||||
github.event.inputs.publish_to_pypi == 'true') ||
|
||||
(github.event_name == 'pull_request_target' &&
|
||||
github.event.pull_request.merged &&
|
||||
contains(github.event.pull_request.labels.*.name, 'release')) ||
|
||||
(github.event_name == 'push' && startsWith(github.ref, 'refs/tags/'))))
|
||||
steps:
|
||||
- name: Checkout Repository Tags
|
||||
uses: actions/checkout@v4
|
||||
|
||||
@@ -0,0 +1,72 @@
|
||||
name: release
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- 'v*.*.*'
|
||||
|
||||
jobs:
|
||||
build-on-workflow:
|
||||
runs-on: ubuntu-latest
|
||||
if: |
|
||||
github.event_name == 'workflow_run' &&
|
||||
github.event.workflow_run.conclusion == 'success'
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0 # Ensure all history is fetched
|
||||
ref: main
|
||||
|
||||
- name: Get Latest Tag
|
||||
id: get-latest-tag
|
||||
if:
|
||||
run: |
|
||||
git fetch --tags
|
||||
latest_tag=$(git describe --tags `git rev-list --tags --max-count=1`)
|
||||
echo "latest_tag=$latest_tag" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Release from Workflow Run
|
||||
if: |
|
||||
github.event_name == 'workflow_run' &&
|
||||
github.event.workflow_run.conclusion == 'success'
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
generate_release_notes: true
|
||||
append_body: true
|
||||
tag_name: ${{ steps.get-latest-tag.outputs.latest_tag }}
|
||||
|
||||
build-on-tag:
|
||||
runs-on: ubuntu-latest
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0 # Ensure all history is fetched
|
||||
ref: main
|
||||
- name: Release from Tag Push
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
generate_release_notes: true
|
||||
append_body: true
|
||||
|
||||
write_changelog:
|
||||
runs-on: ubuntu-latest
|
||||
needs: [build-on-workflow, build-on-tag]
|
||||
if: |
|
||||
always() &&
|
||||
(needs.build-on-workflow.result == 'success' || needs.build-on-tag.result == 'success' )
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0 # Ensure all history is fetched
|
||||
ref: main
|
||||
|
||||
- name: Write CHANGELOG.md
|
||||
uses: rhysd/changelog-from-release/action@v3
|
||||
with:
|
||||
file: CHANGELOG.md
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -1,111 +0,0 @@
|
||||
name: Semantic Versioning for Tags
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
types: [closed]
|
||||
branches:
|
||||
- main
|
||||
|
||||
jobs:
|
||||
bump-version:
|
||||
if: ${{ github.event.pull_request.merged == true && github.event.pull_request.base.ref == 'main' }}
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout Repository
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Check if Source Branch is docs
|
||||
id: check_docs_branch
|
||||
run: |
|
||||
pr_head_ref="${{ github.event.pull_request.head.ref }}"
|
||||
if [[ "$pr_head_ref" == "docs" ]]; then
|
||||
echo "is_docs_branch=true" >> $GITHUB_ENV
|
||||
echo "This is a docs branch merge. Exiting without creating a tag."
|
||||
exit 0
|
||||
else
|
||||
echo "is_docs_branch=false" >> $GITHUB_ENV
|
||||
fi
|
||||
|
||||
- name: Bump Version and Tag
|
||||
if: env.is_docs_branch != 'true'
|
||||
id: bump_version
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GH_TOKEN }}
|
||||
run: |
|
||||
# Fetch the latest tags from the remote
|
||||
git fetch --tags
|
||||
|
||||
# Get the latest tag, or initialize to v0.0.0 if no tags are found
|
||||
latest_tag=$(git describe --tags `git rev-list --tags --max-count=1` 2>/dev/null || echo "v0.0.0")
|
||||
|
||||
# Extract version from PR title or body
|
||||
pr_body="${{ github.event.pull_request.body }}"
|
||||
pr_title="${{ github.event.pull_request.title }}"
|
||||
version_regex="v([0-9]+)\.([0-9]+)\.([0-9]+)"
|
||||
|
||||
if [[ $pr_body =~ $version_regex ]]; then
|
||||
major=${BASH_REMATCH[1]}
|
||||
minor=${BASH_REMATCH[2]}
|
||||
patch=${BASH_REMATCH[3]}
|
||||
new_tag="v$major.$minor.$patch"
|
||||
elif [[ $pr_title =~ $version_regex ]]; then
|
||||
major=${BASH_REMATCH[1]}
|
||||
minor=${BASH_REMATCH[2]}
|
||||
patch=${BASH_REMATCH[3]}
|
||||
new_tag="v$major.$minor.$patch"
|
||||
else
|
||||
# Split the latest tag into parts
|
||||
IFS='.' read -r -a parts <<< "${latest_tag#v}"
|
||||
major=${parts[0]}
|
||||
minor=${parts[1]}
|
||||
patch=${parts[2]}
|
||||
patch=$((patch + 1))
|
||||
new_tag="v$major.$minor.$patch"
|
||||
fi
|
||||
|
||||
echo "Bumping version from $latest_tag to $new_tag"
|
||||
|
||||
# Set the new tag as an environment variable
|
||||
echo "new_tag=$new_tag" >> $GITHUB_ENV
|
||||
|
||||
# Tag the new version
|
||||
git tag $new_tag
|
||||
|
||||
# Configure GitHub token authentication
|
||||
git remote set-url origin https://x-access-token:${{ secrets.GH_TOKEN }}@github.com/${{ github.repository }}.git
|
||||
|
||||
# Push the new tag to the remote repository
|
||||
git push origin $new_tag
|
||||
|
||||
- name: Extract Release Notes
|
||||
if: env.is_docs_branch != 'true'
|
||||
id: extract_notes
|
||||
run: |
|
||||
version="${{ env.new_tag }}"
|
||||
clean_version="${version#v}"
|
||||
release_notes=$(awk -v version="$clean_version" '
|
||||
BEGIN { flag=0 }
|
||||
# Start flagging when the version section is found
|
||||
/^## \[.*\]/ {
|
||||
if (flag) exit # Exit when the next section starts
|
||||
}
|
||||
/^## \['"$clean_version"'\]/ { flag=1; next } # Start printing after the header
|
||||
flag { print } # Print lines while flag is 1
|
||||
' CHANGELOG.md)
|
||||
echo "RELEASE_NOTES<<EOF" >> $GITHUB_ENV
|
||||
echo "$release_notes" >> $GITHUB_ENV
|
||||
echo "EOF" >> $GITHUB_ENV
|
||||
|
||||
- name: Create Release
|
||||
if: env.is_docs_branch != 'true'
|
||||
uses: actions/create-release@v1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GH_TOKEN }}
|
||||
with:
|
||||
tag_name: ${{ env.new_tag }}
|
||||
release_name: Release ${{ env.new_tag }}
|
||||
body: ${{ env.RELEASE_NOTES }}
|
||||
draft: false
|
||||
prerelease: false
|
||||
Reference in New Issue
Block a user