Files
guru/scripts/last_successful_commit.py
Dustin Smith 7b6155cb78 Add CI/CD for Forgejo, for use on Codeberg
This commit replicates the CI/CD behavior we currently have on GitHub
by making the following changes:

- Jobs that used Actions were replaced with in-repo scripts. This
  removes the dependency on GitHub and makes the overall pipeline more
  forge-agnostic.

  - rectalogic/notify-irc replaced with ./scripts/irc_notify.py

  - pkgcore/pkgcheck-action replaced with ./scripts/pkgcheck.sh

- Actions that used `gh` (the GitHub CLI) were replaced with in-repo
  scripts that perform the same action but with the Forgejo API.

  - ./scripts/last_status.py to get the last status of a completed job
    (e.g. succeeded, failed, canceled)

  - ./scripts/last_successful_commit.py to get the last commit that had
    a successful job

- Forgejo-specific changes

  - Variables renamed from "github" to "forgejo" where appropriate
    (though Forgejo lets you get away with keeping them as "github" to
    make migration easier)

  - Use ./.forgejo/ instead of ./.github/ -- this will simultaneously
    keep the GitHub actions intact while also disabling the GitHub
    actions from running in Forgejo

- Codeberg-specific changes

  - Use codeberg-tiny-lazy shared runner for {duplicates,emails}.yml

  - Use codeberg-medium-lazy shared runner for pkgcheck.yml

Signed-off-by: Dustin Smith <d.usty360@gmail.com>
Part-of: https://codeberg.org/gentoo/guru/pulls/30
Merges: https://codeberg.org/gentoo/guru/pulls/30
Signed-off-by: Thomas Bracht Laumann Jespersen <laumann@gentoo.org>
2026-08-21 21:40:26 +02:00

41 lines
1.2 KiB
Python
Executable File

#!/usr/bin/env python3
# Similar to last_status.py, this is just a script to replace the `gh`
# cli behavior with the forgejo/codeberg equivalent. Gets the last
# commit that had a successful run for the given job.
import http.client
import json
import os
host = "codeberg.org"
owner = os.getenv("REPO_OWNER")
name = os.getenv("REPO_NAME")
workflow = os.getenv("REPO_WORKFLOW")
path = (
f"/api/v1/repos/{owner}/{name}/actions/runs/?workflow_id={workflow}"
f"&status=success&page=1&limit=1"
)
def main():
conn = http.client.HTTPSConnection(host)
conn.request("GET", path)
response = conn.getresponse()
if response.status != 200:
print(f"Didn't get 200 OK! Got {response.status} instead.")
print(
"The response body may be helpful: "
f"{response.read().decode('utf-8')}"
)
exit(1)
j = json.loads(response.read())
# If run has literally never succeeded before, assume failure
if j["total_count"] == 0:
print("none") # this'll cause VALID=false later?
else:
# The first workflow run should be the most recent one
print(j["workflow_runs"][0]["commit_sha"])
main()