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

@@ -22,6 +22,9 @@ var CmdActions = cli.Command{
Commands: []*cli.Command{
&actions.CmdActionsSecrets,
&actions.CmdActionsVariables,
&actions.CmdActionsRuns,
&actions.CmdActionsJobs,
&actions.CmdActionsLogs,
},
Flags: []cli.Flag{
&cli.StringFlag{

56
cmd/actions/jobs.go Normal file
View File

@@ -0,0 +1,56 @@
// Copyright 2024 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package actions
import (
stdctx "context"
"fmt"
"code.gitea.io/tea/cmd/flags"
"code.gitea.io/tea/modules/api"
"code.gitea.io/tea/modules/context"
"code.gitea.io/tea/modules/print"
"code.gitea.io/tea/modules/utils"
"github.com/urfave/cli/v3"
)
// CmdActionsJobs represents the actions jobs command
var CmdActionsJobs = cli.Command{
Name: "jobs",
Aliases: []string{"job"},
Usage: "List jobs for a workflow run",
Description: "List jobs for a specific workflow run",
ArgsUsage: "<run-id>",
Action: RunActionJobs,
Flags: flags.AllDefaultFlags,
}
// RunActionJobs lists jobs for a workflow run
func RunActionJobs(ctx stdctx.Context, cmd *cli.Command) error {
c := context.InitCommand(cmd)
c.Ensure(context.CtxRequirement{RemoteRepo: true})
if cmd.Args().Len() < 1 {
return fmt.Errorf("run ID is required")
}
runID, err := utils.ArgToIndex(cmd.Args().First())
if err != nil {
return fmt.Errorf("invalid run ID: %w", err)
}
client := api.NewClient(c.Login)
path := fmt.Sprintf("/repos/%s/%s/actions/runs/%d/jobs",
c.Owner, c.Repo, runID)
var jobs api.ActionJobList
if _, err := client.Get(path, &jobs); err != nil {
return err
}
print.ActionJobsList(jobs.Jobs, c.Output)
return nil
}

55
cmd/actions/logs.go Normal file
View File

@@ -0,0 +1,55 @@
// Copyright 2024 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package actions
import (
stdctx "context"
"fmt"
"code.gitea.io/tea/cmd/flags"
"code.gitea.io/tea/modules/api"
"code.gitea.io/tea/modules/context"
"code.gitea.io/tea/modules/utils"
"github.com/urfave/cli/v3"
)
// CmdActionsLogs represents the actions logs command
var CmdActionsLogs = cli.Command{
Name: "logs",
Aliases: []string{"log"},
Usage: "Display logs for a job",
Description: "Display logs for a specific job",
ArgsUsage: "<job-id>",
Action: RunActionLogs,
Flags: flags.AllDefaultFlags,
}
// RunActionLogs displays logs for a job
func RunActionLogs(ctx stdctx.Context, cmd *cli.Command) error {
c := context.InitCommand(cmd)
c.Ensure(context.CtxRequirement{RemoteRepo: true})
if cmd.Args().Len() < 1 {
return fmt.Errorf("job ID is required")
}
jobID, err := utils.ArgToIndex(cmd.Args().First())
if err != nil {
return fmt.Errorf("invalid job ID: %w", err)
}
client := api.NewClient(c.Login)
path := fmt.Sprintf("/repos/%s/%s/actions/jobs/%d/logs",
c.Owner, c.Repo, jobID)
logs, err := client.GetRaw(path)
if err != nil {
return err
}
fmt.Print(string(logs))
return nil
}

50
cmd/actions/runs.go Normal file
View File

@@ -0,0 +1,50 @@
// Copyright 2024 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package actions
import (
stdctx "context"
"fmt"
"code.gitea.io/tea/cmd/flags"
"code.gitea.io/tea/modules/api"
"code.gitea.io/tea/modules/context"
"code.gitea.io/tea/modules/print"
"github.com/urfave/cli/v3"
)
// CmdActionsRuns represents the actions runs command
var CmdActionsRuns = cli.Command{
Name: "runs",
Aliases: []string{"run"},
Usage: "List workflow runs",
Description: "List workflow runs for a repository",
Action: RunActionRuns,
Flags: append([]cli.Flag{
&flags.PaginationPageFlag,
&flags.PaginationLimitFlag,
}, flags.AllDefaultFlags...),
}
// RunActionRuns lists workflow runs
func RunActionRuns(ctx stdctx.Context, cmd *cli.Command) error {
c := context.InitCommand(cmd)
c.Ensure(context.CtxRequirement{RemoteRepo: true})
client := api.NewClient(c.Login)
path := fmt.Sprintf("/repos/%s/%s/actions/runs?page=%d&limit=%d",
c.Owner, c.Repo,
flags.GetListOptions().Page,
flags.GetListOptions().PageSize)
var runs api.ActionRunList
if _, err := client.Get(path, &runs); err != nil {
return err
}
print.ActionRunsList(runs.WorkflowRuns, c.Output)
return nil
}