rob thijssen 5f27687438 fix: emit a heartbeat while waiting so the step is not killed as idle
v1.0.2 moved the verdict off watch-build's exit code, but left the step
silent for the whole build: COPR emits nothing between state transitions,
and the poller only spoke at the end.

That silence is itself the failure. Two monsoon releases died after ~24-27
minutes of no output at all — run 48 at 08:35:50 with COPR having succeeded
at 08:30:30, and run 50 at 09:35:50, 66 seconds *before* COPR reported
success at 09:36:56. A build finishing either side of the kill rules out a
build-duration timeout and points at an inactivity timeout on the runner.

Print a line on every poll with elapsed time and current state. It keeps the
step producing output for as long as the build runs, and makes the log show
progress instead of a 25-minute gap. Heartbeats go to stderr because stdout
carries wait_for_terminal_state's return value.

Test covers a build that stays running across several polls before
succeeding, asserting the heartbeat appears.
2026-08-07 12:39:51 +03:00

copr-publish

Gitea composite action that submits a source RPM to Fedora COPR, watches the build, and dumps each chroot's builder-live.log into the CI output as collapsible groups.

Why use this

copr-cli build by itself only prints status transitions (pending / importing / running / succeeded). When a build fails you have to click through to the COPR web UI to see the actual log. This action:

  • Submits with --nowait and captures the build ID.
  • Prints a clickable https://copr.fedorainfracloud.org/coprs/build/... link so you can follow live.
  • Streams status transitions from copr-cli watch-build while polling COPR for the build's actual state, so the job's verdict comes from the build rather than from the health of a long-lived connection.
  • On completion, fetches each chroot's builder-live.log via copr-cli download-build and emits them as ::group:: blocks.
  • Fails CI if the build fails, but always dumps logs first.
  • Gives up after COPR_BUILD_TIMEOUT (default 7200s) and says so, rather than hanging until the runner kills the job.

Environment overrides

Variable Default Purpose
COPR_BUILD_TIMEOUT 7200 Seconds to wait for a build to reach a terminal state.
COPR_POLL_INTERVAL 30 Seconds between build-state polls.

Requirements

The runner must already have:

  • copr-cli on PATH (provided by the copr-cli RPM on Fedora runners).
  • grep -P (PCRE, default on Fedora).

Inputs

Input Required Description
project yes COPR project in the form <owner>/<project>, e.g. helexa/cortex.
srpm yes Path or glob to the source RPM(s) to submit, e.g. *.src.rpm.
copr-config yes Contents of ~/.config/copr. Fetch from https://copr.fedorainfracloud.org/api/ and store as a repo or org secret.

Usage

jobs:
  publish:
    runs-on: fedora
    steps:
      - uses: actions/download-artifact@v3
        with:
          name: my-srpm

      - name: Publish to COPR
        uses: https://git.lair.cafe/actions/copr-publish@v1
        with:
          project: helexa/cortex
          srpm: '*.src.rpm'
          copr-config: ${{ secrets.COPR_CONFIG }}

Note the fully-qualified URL in uses: — the Gitea instance's DEFAULT_ACTIONS_URL points at github.com, so internal actions must be referenced by absolute URL.

Versioning

Pin to a major version tag (@v1) for automatic patch/minor updates. Pin to an exact tag (@v1.0.3) to freeze.

Obtaining COPR_CONFIG

  1. Log in to https://copr.fedorainfracloud.org/.
  2. Visit https://copr.fedorainfracloud.org/api/.
  3. Copy the entire [copr-cli] config block.
  4. Save as a Gitea secret named COPR_CONFIG in the consuming repo (or at org level to share across all org repos).
Description
No description provided
Readme 102 KiB
Languages
Shell 100%