diff --git a/.github/workflows/lint-pr-title.yml b/.github/workflows/lint-pr-title.yml new file mode 100644 index 00000000..45b45d3a --- /dev/null +++ b/.github/workflows/lint-pr-title.yml @@ -0,0 +1,20 @@ +name: "[lint] Commit is conventional" + +on: + pull_request_target: + types: + - edited + - opened + - ready_for_review + - reopened + - synchronize + +permissions: + contents: read + id-token: write + pull-requests: write + +jobs: + lint: + name: Lint + uses: kolonialno/actions/.github/workflows/pr-conventional-commit.yml@main diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml new file mode 100644 index 00000000..36239169 --- /dev/null +++ b/.github/workflows/release-please.yml @@ -0,0 +1,33 @@ +--- +name: "[release] Please" + +on: + workflow_dispatch: + push: + branches: + - main + - ci/test-release-please** + +permissions: + id-token: write + contents: write + pull-requests: write + +jobs: + release: + name: Release + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: google-github-actions/release-please-action@v4 + id: release + with: + # When you use the repository's GITHUB_TOKEN to perform tasks, events such as 'on.release' + # use in the Upload artifacts workflow wont be triggered. + # This prevents you from accidentally creating recursive workflow runs. + # We needed to use either a PAT og a GitHub App. + # https://docs.github.com/en/actions/using-workflows/triggering-a-workflow#triggering-a-workflow-from-a-workflow + token: ${{ secrets.TIENDABOT_ACCESS_TOKEN }} + config-file: release-please-config.json + manifest-file: .release-please-manifest.json diff --git a/.github/workflows/release-upload-artifacts.yml b/.github/workflows/release-upload-artifacts.yml new file mode 100644 index 00000000..f70dadbd --- /dev/null +++ b/.github/workflows/release-upload-artifacts.yml @@ -0,0 +1,133 @@ +--- +name: "[release] Upload artifacts" + +on: + # Manually triggering this from main branch + # will upload artifacts to current release. + workflow_dispatch: + inputs: + tag: + type: string + description: Tag to checkout. View tags at https://github.com/kolonialno/troncos/tags + default: "" + push: + branches: + - release-test-** + release: + types: + # Trigger on creation of a draft is not possible + # https://github.com/orgs/community/discussions/7118 + # ref https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#release + # This will trigger when a pre-release is created, but not when published. + - prereleased + +permissions: + id-token: write + contents: write + pull-requests: write + +env: + PYPI_TOKEN: "${{ secrets.PYPI_TOKEN }}" + +jobs: + tag: + runs-on: ubuntu-latest + name: Tag on commit + outputs: + upload: ${{ steps.tag.outputs.upload }} + tag: ${{ steps.tag.outputs.tag }} + steps: + - name: Checkout + uses: actions/checkout@v4 + if: ${{ github.event.inputs.tag == '' }} + + - name: Checkout tag (workflow_dispatch) + uses: actions/checkout@v4 + if: ${{ github.event.inputs.tag != '' }} + with: + ref: ${{ github.event.inputs.tag }} + + - name: Read .tool-versions + uses: marocchino/tool-versions-action@v1 + id: versions + + - name: Setup Python + uses: ./.github/actions/setup-python + with: + python-version: ${{ steps.versions.outputs.python }} + poetry-version: ${{ steps.versions.outputs.poetry }} + + # Only upload if current commit has a tag that match the version in + # Pyproject. This will only be the case for a troncos tag that has format + # x.y.z + # The other releases have component name prefixed. Eaxmple: component-x.y.z. + - name: Verify semVer tag on commit + id: tag + run: | + set -ex + if [ "${{ github.event.inputs.tag }}" == '' ]; then + + tag=$(git tag --points-at ${{ github.sha }}) + echo tag=$tag + echo "tag=$tag" >> $GITHUB_OUTPUT; + + project_version=$(poetry version -s) + echo project_version=$project_version + + if [ "$tag" == "$project_version" ]; then + echo "upload=true" >> $GITHUB_OUTPUT; + else + echo "upload=false" >> $GITHUB_OUTPUT; + fi + else + echo "upload=true" >> $GITHUB_OUTPUT; + fi + + python_package: + runs-on: ubuntu-latest + name: Python package + needs: tag + steps: + - name: Checkout + uses: actions/checkout@v4 + if: ${{ github.event.inputs.tag == '' }} + + - name: Checkout tag (workflow_dispatch) + uses: actions/checkout@v4 + if: ${{ github.event.inputs.tag != '' }} + with: + ref: ${{ github.event.inputs.tag }} + + - name: Read .tool-versions + uses: marocchino/tool-versions-action@v1 + id: versions + + - name: Setup Python + uses: ./.github/actions/setup-python + with: + python-version: ${{ steps.versions.outputs.python }} + poetry-version: ${{ steps.versions.outputs.poetry }} + + - name: Publish Troncos Python package + if: ${{ needs.tag.outputs.upload == 'true' }} + run: | + set -ex + make release + + publish: + runs-on: ubuntu-latest + name: Publish + needs: + - python_package + - tag + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Publish pre-release + if: ${{ needs.tag.outputs.upload == 'true' }} + run: | + set -ex + gh release edit ${{ needs.tag.outputs.tag }} --prerelease=false --latest + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 00000000..13ce2bf4 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,11 @@ +--- +default_install_hook_types: [pre-commit, commit-msg] +repos: +- repo: https://github.com/alessandrojcm/commitlint-pre-commit-hook + rev: "v9.11.0" + hooks: + - id: commitlint + stages: [commit-msg] + additional_dependencies: ["@commitlint/config-conventional"] + args: + - "--config=commitlint.config.js" diff --git a/.release-please-manifest.json b/.release-please-manifest.json new file mode 100644 index 00000000..2276f3d2 --- /dev/null +++ b/.release-please-manifest.json @@ -0,0 +1,3 @@ +{ + ".": "4.3.1" +} diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..b56d51e3 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,21 @@ +# CONTRIBUTING + +## Set-up + +```shell +pre-commit install +poetry install +``` + +## Release + +We use [release-please](https://github.com/googleapis/release-please) to automate release including semver version based on [conventional-commits](https://www.conventionalcommits.org/en/v1.0.0/). + +Manually create a release PR from main branch + +```bash +release-please release-pr \ +--token=$(gh auth token) \ +--repo-url=kolonialno/troncos +--dry-run +``` diff --git a/commitlint.config.js b/commitlint.config.js new file mode 100644 index 00000000..362c11b3 --- /dev/null +++ b/commitlint.config.js @@ -0,0 +1,6 @@ +module.exports = { + extends: ["@commitlint/config-conventional"], + rules: { + "footer-max-line-length": [0, "always"], // ignore rule + }, +}; diff --git a/release-please-config.json b/release-please-config.json new file mode 100644 index 00000000..8a149cb5 --- /dev/null +++ b/release-please-config.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json", + "bootstrap-sha": "3c032c809f68f677d12fdac5557351cde40bffd7", + "include-v-in-tag": false, + "separate-pull-requests": true, + "prerelease": true, + "packages": { + ".": { + "component": "troncos", + "bump-minor-pre-major": true, + "include-component-in-tag": false, + "release-type": "python" + } + } +}