diff --git a/.github/workflows/crowdin_upload_strings.yml b/.github/workflows/crowdin_upload_strings.yml new file mode 100644 index 000000000..0d719dbdc --- /dev/null +++ b/.github/workflows/crowdin_upload_strings.yml @@ -0,0 +1,32 @@ +name: Crowdin - Upload strings +on: + push: + branches: + - V3/develop + +jobs: + deploy: + if: github.repository == 'Cog-Creators/Red-DiscordBot' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: '3.8' + - name: Install dependencies + run: | + curl https://artifacts.crowdin.com/repo/GPG-KEY-crowdin | sudo apt-key add - + echo "deb https://artifacts.crowdin.com/repo/deb/ /" | sudo tee -a /etc/apt/sources.list + sudo apt-get update -qq + sudo apt-get install -y crowdin + pip install redgettext==3.3 + - name: Generate source files + run: | + make gettext + - name: Upload source files + run: | + make upload_translations + env: + CROWDIN_API_KEY: ${{ secrets.crowdin_token}} + CROWDIN_PROJECT_ID: ${{ secrets.crowdin_identifier }} diff --git a/.github/workflows/prepare_release.yml b/.github/workflows/prepare_release.yml new file mode 100644 index 000000000..0492fb714 --- /dev/null +++ b/.github/workflows/prepare_release.yml @@ -0,0 +1,104 @@ +name: Prepare release +on: + workflow_dispatch: + inputs: + new_stable_version: + description: Version number for the new stable release (leave empty to just strip `.dev1`) + required: false + default: 'auto' + +jobs: + crowdin_download_translations: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: '3.8' + - name: Install dependencies + run: | + curl https://artifacts.crowdin.com/repo/GPG-KEY-crowdin | sudo apt-key add - + echo "deb https://artifacts.crowdin.com/repo/deb/ /" | sudo tee -a /etc/apt/sources.list + sudo apt-get update -qq + sudo apt-get install -y crowdin + + - name: Download translations + run: | + make download_translations + env: + CROWDIN_API_KEY: ${{ secrets.crowdin_token}} + CROWDIN_PROJECT_ID: ${{ secrets.crowdin_identifier }} + + - name: Create Pull Request + id: cpr_crowdin + uses: peter-evans/create-pull-request@v3 + with: + token: ${{ secrets.GITHUB_TOKEN }} + commit-message: Automated Crowdin downstream + title: "[i18n] Automated Crowdin downstream" + body: | + This is an automated PR. + Please ensure that there are no errors or invalid files are in the PR. + labels: "Automated PR, Category: i18n, Changelog Entry: Skipped" + branch: "automated/i18n" + author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> + + - name: Close and reopen the PR with different token to trigger CI + uses: actions/github-script@v3 + env: + PR_NUMBER: ${{ steps.cpr_crowdin.outputs.pull-request-number }} + PR_OPERATION: ${{ steps.cpr_crowdin.outputs.pull-request-operation }} + with: + github-token: ${{ secrets.cogcreators_bot_repo_scoped }} + script: | + const script = require( + `${process.env.GITHUB_WORKSPACE}/.github/workflows/scripts/close_and_reopen_pr.js` + ); + console.log(script({github, context})); + + pr_stable_bump: + runs-on: ubuntu-latest + steps: + # Checkout repository and install Python + - uses: actions/checkout@v2 + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: '3.8' + + # Create PR for stable version bump + - name: Update Red version number from input + id: bump_version_stable + run: | + python .github/workflows/scripts/bump_version.py + env: + PYTHONPATH: ${{ github.workspace }}:${{ env.PYTHONPATH }} + NEW_STABLE_VERSION: ${{ github.event.inputs.new_stable_version }} + + - name: Create Pull Request + id: cpr_bump_stable + uses: peter-evans/create-pull-request@v3 + with: + token: ${{ secrets.GITHUB_TOKEN }} + commit-message: Version bump to ${{ steps.bump_version_stable.outputs.new_version }} + title: Version bump to ${{ steps.bump_version_stable.outputs.new_version }} + body: | + This is an automated PR. + Please ensure that there are no errors or invalid files are in the PR. + labels: "Automated PR, Changelog Entry: Skipped" + branch: "automated/pr_bumps/${{ steps.bump_version_stable.outputs.new_version }}" + author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> + + - name: Close and reopen the PR with different token to trigger CI + uses: actions/github-script@v3 + env: + PR_NUMBER: ${{ steps.cpr_bump_stable.outputs.pull-request-number }} + PR_OPERATION: ${{ steps.cpr_bump_stable.outputs.pull-request-operation }} + with: + github-token: ${{ secrets.cogcreators_bot_repo_scoped }} + script: | + const script = require( + `${process.env.GITHUB_WORKSPACE}/.github/workflows/scripts/close_and_reopen_pr.js` + ); + console.log(await script({github, context})); diff --git a/.github/workflows/publish_crowdin.yml b/.github/workflows/publish_crowdin.yml deleted file mode 100644 index d95c52a0e..000000000 --- a/.github/workflows/publish_crowdin.yml +++ /dev/null @@ -1,50 +0,0 @@ -name: Publish to Crowdin -on: - schedule: - - cron: '0 12 * * THU' - workflow_dispatch: - repository_dispatch: - types: crowdin - -env: - CROWDIN_API_KEY: ${{ secrets.crowdin_token}} - CROWDIN_PROJECT_ID: ${{ secrets.crowdin_identifier }} - -jobs: - deploy: - if: github.repository == 'Cog-Creators/Red-DiscordBot' - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up Python - uses: actions/setup-python@v2 - with: - python-version: '3.8' - - name: Install dependencies - run: | - curl https://artifacts.crowdin.com/repo/GPG-KEY-crowdin | sudo apt-key add - - echo "deb https://artifacts.crowdin.com/repo/deb/ /" | sudo tee -a /etc/apt/sources.list - sudo apt-get update -qq - sudo apt-get install -y crowdin - pip install redgettext==3.3 - - name: Generate source files - run: | - make gettext - - name: Upload source files - run: | - make upload_translations - - name: Download translations - run: | - make download_translations - - name: Create Pull Request - uses: peter-evans/create-pull-request@v3 - with: - token: ${{ secrets.GITHUB_TOKEN }} - commit-message: Automated Crowdin downstream - title: "[i18n] Automated Crowdin downstream" - body: | - This is an automated PR. - Please ensure that there are no errors or invalid files are in the PR. - labels: "Automated PR, Category: i18n, Changelog Entry: Skipped" - branch: "automated/i18n" - author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> diff --git a/.github/workflows/publish_pypi.yml b/.github/workflows/publish_pypi.yml deleted file mode 100644 index 6a2f7c224..000000000 --- a/.github/workflows/publish_pypi.yml +++ /dev/null @@ -1,27 +0,0 @@ -name: Publish to PyPI -on: - push: - tags: - - "*" - -jobs: - deploy: - if: github.repository == 'Cog-Creators/Red-DiscordBot' - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up Python - uses: actions/setup-python@v2 - with: - python-version: '3.8' - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install setuptools wheel twine - - name: Build and publish - env: - TWINE_USERNAME: __token__ - TWINE_PASSWORD: ${{ secrets.pypi_token }} - run: | - python setup.py sdist bdist_wheel - twine upload dist/* diff --git a/.github/workflows/publish_release.yml b/.github/workflows/publish_release.yml new file mode 100644 index 000000000..c6e8431c5 --- /dev/null +++ b/.github/workflows/publish_release.yml @@ -0,0 +1,67 @@ +name: Publish the release +on: + push: + tags: + - "*" + +jobs: + release_to_pypi: + if: github.repository == 'Cog-Creators/Red-DiscordBot' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: '3.8' + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install setuptools wheel twine + - name: Build and publish + env: + TWINE_USERNAME: __token__ + TWINE_PASSWORD: ${{ secrets.pypi_token }} + run: | + python setup.py sdist bdist_wheel + twine upload dist/* + + pr_dev_bump: + needs: release_to_pypi + runs-on: ubuntu-latest + steps: + # Version bump to development version + - name: Update Red version number to dev + id: bump_version_dev + run: | + python .github/workflows/scripts/bump_version.py + env: + PYTHONPATH: ${{ github.workspace }}:${{ env.PYTHONPATH }} + DEV_BUMP: '1' + + - name: Create Pull Request + id: cpr_bump_dev + uses: peter-evans/create-pull-request@v3 + with: + token: ${{ secrets.GITHUB_TOKEN }} + commit-message: Version bump to ${{ steps.bump_version_dev.outputs.new_version }} + title: Version bump to ${{ steps.bump_version_dev.outputs.new_version }} + body: | + This is an automated PR. + Please ensure that there are no errors or invalid files are in the PR. + labels: "Automated PR, Changelog Entry: Skipped" + branch: "automated/pr_bumps/${{ steps.bump_version_dev.outputs.new_version }}" + author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> + + - name: Close and reopen the PR with different token to trigger CI + uses: actions/github-script@v3 + env: + PR_NUMBER: ${{ steps.cpr_bump_dev.outputs.pull-request-number }} + PR_OPERATION: ${{ steps.cpr_bump_dev.outputs.pull-request-operation }} + with: + github-token: ${{ secrets.cogcreators_bot_repo_scoped }} + script: | + const script = require( + `${process.env.GITHUB_WORKSPACE}/.github/workflows/scripts/close_and_reopen_pr.js` + ); + console.log(await script({github, context})); diff --git a/.github/workflows/scripts/bump_version.py b/.github/workflows/scripts/bump_version.py new file mode 100644 index 000000000..b6d1d98d0 --- /dev/null +++ b/.github/workflows/scripts/bump_version.py @@ -0,0 +1,45 @@ +import os +import re +import sys +from typing import Match + +import redbot + + +version_info = None + + +def repl(match: Match[str]) -> str: + global version_info + + new_stable_version = os.environ.get("NEW_STABLE_VERSION", "auto") + if new_stable_version == "auto": + version_info = redbot.VersionInfo.from_str(match.group("version")) + version_info.dev_release = None + else: + version_info = redbot.VersionInfo.from_str(new_stable_version) + + if int(os.environ.get("DEV_BUMP", 0)): + version_info.micro += 1 + version_info.dev_release = 1 + + return f'__version__ = "{version_info}"' + + +with open("redbot/__init__.py", encoding="utf-8") as fp: + new_contents, found = re.subn( + pattern=r'^__version__ = "(?P[^"]*)"$', + repl=repl, + string=fp.read(), + count=1, + flags=re.MULTILINE, + ) + +if not found: + print("Couldn't find `__version__` line!") + sys.exit(1) + +with open("redbot/__init__.py", "w", encoding="utf-8", newline="\n") as fp: + fp.write(new_contents) + +print(f"::set-output name=new_version::{version_info}") diff --git a/.github/workflows/scripts/close_and_reopen_pr.js b/.github/workflows/scripts/close_and_reopen_pr.js new file mode 100644 index 000000000..25dc25123 --- /dev/null +++ b/.github/workflows/scripts/close_and_reopen_pr.js @@ -0,0 +1,25 @@ +module.exports = (async function ({github, context}) { + const pr_number = process.env.PR_NUMBER; + const pr_operation = process.env.PR_OPERATION; + let sleep_time = 0; + + if (!['created', 'updated'].includes(pr_operation)) { + console.log('PR was not created as there were no changes.') + return; + } + + for (const new_state of ['closed', 'open']) { + // some sleep time needed to make sure API handles open after close + if (sleep_time) + await new Promise(r => setTimeout(r, sleep_time)); + + github.issues.update({ + issue_number: pr_number, + owner: context.repo.owner, + repo: context.repo.repo, + state: new_state + }); + + sleep_time = 2000; + } +})