feat(actions): add runs, jobs, and logs commands
Some checks failed
check-and-test / Run govulncheck (pull_request) Successful in 1m43s
check-and-test / check-and-test (pull_request) Failing after 2m29s

Implement tea actions commands to view workflow runs and logs using
the Gitea 1.25 API endpoints directly. This adds:
- `tea actions runs` - list workflow runs for a repository
- `tea actions jobs <run-id>` - list jobs for a specific run
- `tea actions logs <job-id>` - display logs for a specific job

Also adds a new `modules/api` package for making raw authenticated
HTTP requests to Gitea API endpoints not yet supported by the go-sdk.

Closes #1

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Hugo Nijhuis-Mekkelholt
2025-12-30 19:40:19 +01:00
parent 68b9620b8c
commit cea501523e
7 changed files with 412 additions and 0 deletions

View File

@@ -7,6 +7,7 @@ import (
"fmt"
"code.gitea.io/sdk/gitea"
"code.gitea.io/tea/modules/api"
)
// ActionSecretsList prints a list of action secrets
@@ -74,3 +75,94 @@ func ActionVariablesList(variables []*gitea.RepoActionVariable, output string) {
t.sort(0, true)
t.print(output)
}
// ActionRunsList prints a list of workflow runs
func ActionRunsList(runs []*api.ActionRun, output string) {
t := table{
headers: []string{
"ID",
"Title",
"Status",
"Conclusion",
"Event",
"Branch",
"Started",
},
}
for _, run := range runs {
conclusion := run.Conclusion
if conclusion == "" {
conclusion = "-"
}
started := ""
if run.StartedAt != nil {
started = FormatTime(*run.StartedAt, output != "")
}
t.addRow(
fmt.Sprintf("%d", run.ID),
run.Title,
run.Status,
conclusion,
run.Event,
run.HeadBranch,
started,
)
}
if len(runs) == 0 {
fmt.Printf("No workflow runs found\n")
return
}
t.print(output)
}
// ActionJobsList prints a list of jobs
func ActionJobsList(jobs []*api.ActionJob, output string) {
t := table{
headers: []string{
"ID",
"Name",
"Status",
"Conclusion",
"Started",
"Completed",
},
}
for _, job := range jobs {
conclusion := job.Conclusion
if conclusion == "" {
conclusion = "-"
}
started := ""
if job.StartedAt != nil {
started = FormatTime(*job.StartedAt, output != "")
}
completed := ""
if job.CompletedAt != nil {
completed = FormatTime(*job.CompletedAt, output != "")
}
t.addRow(
fmt.Sprintf("%d", job.ID),
job.Name,
job.Status,
conclusion,
started,
completed,
)
}
if len(jobs) == 0 {
fmt.Printf("No jobs found\n")
return
}
t.print(output)
}