name: Release on: workflow_dispatch: inputs: version: description: 'Version (e.g. v2.5, v2.5.1-beta, v2.6-beta2)' required: true include_repo_version: description: 'Update version in repo? (yes/no)' require: true default: yes include_pypi: description: 'Publish to PyPI? (yes/no)' required: true default: yes include_brew: description: 'Publish to Homebrew? (yes/no)' required: true default: yes jobs: validate: name: "Validate version string" runs-on: ubuntu-latest steps: - name: Validate version run: | JRNL_VERSION="${{ github.event.inputs.version }}" echo "::debug::version: $JRNL_VERSION" if [[ ! $JRNL_VERSION =~ ^v[0-9]+(\.[0-9]+){1,2}(-(alpha|beta)([0-9]+)?)?$ ]]; then echo echo "::error::Bad version" echo echo "Version string should match pattern above." echo "Here are some examples of valid version numbers:" echo echo " v2.5" echo " v2.5-alpha" echo " v2.5-beta" echo " v2.5.1" echo " v2.5.1-alpha" echo " v2.5.1-beta" exit 1 fi release_pypi: needs: validate name: "Release to PyPI" runs-on: ubuntu-latest outputs: pypi_version: ${{ steps.pypi-version-getter.outputs.pypi_version }} env: HOME_REPO: ${{ secrets.HOME_REPO }} steps: - name: Get version run: | JRNL_VERSION="${{ github.event.inputs.version }}" echo "::debug::version: $JRNL_VERSION" echo "JRNL_VERSION=$JRNL_VERSION" >> $GITHUB_ENV - name: Set up Python uses: actions/setup-python@v2 with: python-version: 3.9 - name: Checkout repo uses: actions/checkout@v2 with: token: ${{ secrets.JRNL_BOT_TOKEN }} - name: Config git user run: | git config --global user.name "${{ secrets.JRNL_BOT_NAME }}" git config --global user.email "${{ secrets.JRNL_BOT_EMAIL }}" - name: Install dependencies run: pip install poetry - name: Update version in files if: {{ github.event.inputs.include_repo_version == 'yes' }} run: | poetry version "$JRNL_VERSION" echo __version__ = \"$JRNL_VERSION\" > jrnl/__version__.py - name: Commit updated files if: ${{ github.event.inputs.include_repo_version == 'yes' && github.repository == env.HOME_REPO }} run: | git add pyproject.toml jrnl/__version__.py git commit -m "Increment version to ${JRNL_VERSION}" git tag -a -m "$JRNL_VERSION" "$JRNL_VERSION" git push git push --tags - name: Build run: poetry build - name: Deploy to PyPI if: ${{ github.event.inputs.include_pypi == 'yes' && github.repository == env.HOME_REPO }} env: POETRY_PYPI_TOKEN_PYPI: ${{ secrets.PYPI_TOKEN }} run: poetry publish - name: Get PyPI version id: pypi-version-getter run: | pypi_version="$(ls dist/jrnl-*.tar.gz | sed -r 's!dist/jrnl-(.*)\.tar\.gz!\1!')" echo "::set-output name=pypi_version::$pypi_version" release_homebrew: if: ${{ github.event.inputs.include_brew == 'yes' }} needs: release_pypi name: "Release to Homebrew" runs-on: macos-latest env: HOMEBREW_NO_AUTO_UPDATE: 1 HOMEBREW_NO_INSTALL_CLEANUP: 1 HOME_REPO: ${{ secrets.HOME_REPO }} steps: - name: Get version run: | JRNL_VERSION="${{ github.event.inputs.version }}" PYPI_VERSION="${{ needs.release_pypi.outputs.pypi_version }}" echo "::debug::jrnl version: $JRNL_VERSION" echo "::debug::pypi version: $PYPI_VERSION" echo "JRNL_VERSION=$JRNL_VERSION" >> $GITHUB_ENV echo "PYPI_VERSION=$PYPI_VERSION" >> $GITHUB_ENV - name: Determine type of release env: REPO_OWNER: ${{ github.repository_owner }} run: | if [[ $JRNL_VERSION =~ (alpha|beta) ]]; then echo '::debug::Prerelease (not a full release)' { echo "RELEASE_TYPE=pre" echo "FORMULA_REPO=${REPO_OWNER}/homebrew-prerelease" echo "BOT_REPO=jrnl-bot/homebrew-prerelease" echo "FORMULA_NAME=jrnl-beta" } >> $GITHUB_ENV else echo '::debug::Full release (not a prerelease)' if [[ "${{ github.repository }}" == "${HOME_REPO}" ]]; then REPO_OWNER="homebrew" fi { echo "RELEASE_TYPE=full" echo "FORMULA_REPO=${REPO_OWNER}/homebrew-core" echo "BOT_REPO=jrnl-bot/homebrew-core" echo "FORMULA_NAME=jrnl" } >> $GITHUB_ENV fi - name: Checkout homebrew repo uses: actions/checkout@v2 with: token: ${{ secrets.JRNL_BOT_TOKEN }} repository: ${{ env.FORMULA_REPO }} - name: Config git user run: | git config --global user.name "${{ secrets.JRNL_BOT_NAME }}" git config --global user.email "${{ secrets.JRNL_BOT_EMAIL }}" - name: Create branch run: | BRANCH_NAME="jrnl-${JRNL_VERSION}--${RANDOM}" git remote rename origin upstream git remote add origin "https://github.com/${BOT_REPO}.git" git fetch --unshallow upstream git fetch origin git checkout -b $BRANCH_NAME git push -u origin $BRANCH_NAME - name: Install dependencies run: brew install pipgrip - name: Query PyPI API uses: nick-invision/retry@v2 with: timeout_seconds: 10 max_attempts: 30 retry_wait_seconds: 10 command: | curl -Ls https://pypi.org/pypi/jrnl/json > api_response.json # if query doesn't have our version yet, give it some time before trying again if [[ "null" == "$(jq ".releases[\"${PYPI_VERSION}\"][1].url" -r api_response.json)" ]]; then echo "::debug::PYPI_VERSION: $PYPI_VERSION" echo "::debug::JQ VALUE: $(jq ".releases[\"${PYPI_VERSION}\"][1].url" -r api_response.json)" echo "::group::cat api_response.json" cat api_response.json echo "::endgroup::" exit 1 fi - name: Update Homebrew Formula uses: nick-invision/retry@v2 with: timeout_minutes: 8 max_attempts: 6 retry_wait_seconds: 30 command: > brew bump-formula-pr "Formula/${FORMULA_NAME}.rb" --url $(jq ".releases[\"${PYPI_VERSION}\"][1].url" -r api_response.json) --sha256 $(jq ".releases[\"${PYPI_VERSION}\"][1].digests.sha256" -r api_response.json) --version=$PYPI_VERSION --no-audit --write --commit --force --verbose - name: Update commit message run: | git commit --amend \ -m "jrnl ${JRNL_VERSION}" \ -m "Update jrnl to ${JRNL_VERSION}" \ -m '${{ secrets.RELEASE_COAUTHORS }}' - name: Push commit run: | git show head git push - name: Open pull request env: GH_TOKEN: ${{ secrets.JRNL_BOT_TOKEN }} run: > gh pr create --title "jrnl ${JRNL_VERSION}" --body 'Created with `brew bump-formula-pr`.'