name: release on: workflow_dispatch: inputs: tag: description: "Tag to (re)release (e.g. v0.1.0)" required: true type: string permissions: contents: write jobs: release: runs-on: macos-latest steps: - name: Checkout uses: actions/checkout@v6 with: fetch-depth: 0 - name: Determine tag id: tag shell: bash run: | if [[ "${GITHUB_EVENT_NAME}" == "workflow_dispatch" ]]; then echo "tag=${{ inputs.tag }}" >> "$GITHUB_OUTPUT" else echo "tag=${GITHUB_REF_NAME}" >> "$GITHUB_OUTPUT" fi - name: Checkout release tag if: ${{ github.event_name == 'workflow_dispatch' }} run: git checkout ${{ inputs.tag }} - name: Resolve packages run: swift package resolve - name: Sync version run: scripts/generate-version.sh - name: Build run: swift build -c release --product remindctl - name: Codesign run: codesign --force --sign - --identifier com.steipete.remindctl .build/release/remindctl - name: Package artifact run: | mkdir -p dist cp .build/release/remindctl dist/remindctl ( cd dist zip -r remindctl-macos.zip remindctl ) - name: Publish release assets uses: softprops/action-gh-release@v3 with: files: dist/remindctl-macos.zip env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Update GitHub release notes from CHANGELOG shell: bash env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} TAG: ${{ steps.tag.outputs.tag }} run: | version="${TAG#v}" notes_file="/tmp/release-notes.md" awk -v v="$version" ' $0 ~ ("^## " v "($|[[:space:]]-)") { in_section=1; next } in_section && $0 ~ "^## " { exit } in_section { print } ' CHANGELOG.md > "$notes_file" if ! grep -q '[^[:space:]]' "$notes_file"; then echo "No CHANGELOG.md section found for version $version" >&2 exit 1 fi gh release edit "$TAG" --notes-file "$notes_file" update-homebrew-tap: runs-on: ubuntu-latest needs: release steps: - name: Resolve release tag run: echo "RELEASE_TAG=${{ inputs.tag }}" >> "$GITHUB_ENV" - name: Dispatch tap formula update env: GH_TOKEN: ${{ secrets.HOMEBREW_TAP_TOKEN }} run: | if [ -z "$GH_TOKEN" ]; then echo "::error::Set HOMEBREW_TAP_TOKEN with workflow access to steipete/homebrew-tap" exit 1 fi request_id="remindctl-${RELEASE_TAG}-${GITHUB_RUN_ID}-${GITHUB_RUN_ATTEMPT}" expected_title="Update remindctl for ${RELEASE_TAG} (${request_id})" gh workflow run update-formula.yml \ --repo steipete/homebrew-tap \ --ref main \ -f formula=remindctl \ -f tag="$RELEASE_TAG" \ -f repository=steipete/remindctl \ -f macos_artifact=remindctl-macos.zip \ -f request_id="$request_id" run_id="" for _ in {1..30}; do run_id=$(gh run list \ --repo steipete/homebrew-tap \ --workflow update-formula.yml \ --branch main \ --event workflow_dispatch \ --limit 20 \ --json databaseId,displayTitle \ --jq ".[] | select(.displayTitle == \"$expected_title\") | .databaseId" | head -n1) if [ -n "$run_id" ]; then break fi sleep 5 done if [ -z "$run_id" ]; then echo "::error::Could not find tap workflow run with title: $expected_title" exit 1 fi gh run watch "$run_id" \ --repo steipete/homebrew-tap \ --exit-status \ --interval 10