aboutsummaryrefslogtreecommitdiffstats
path: root/routers
diff options
context:
space:
mode:
authorVitaliy Filippov <vitalif@mail.ru>2023-06-29 05:58:56 +0300
committerGitHub <noreply@github.com>2023-06-29 10:58:56 +0800
commitf0b773e0ced9110f34326398e5b6c55ad6e25201 (patch)
tree6780cd1292474dbd7ecd4667430acdb299f1d80d /routers
parentb08647f0b9d73db0f0c23dfddadad2a245cb198e (diff)
downloadgitea-f0b773e0ced9110f34326398e5b6c55ad6e25201.tar.gz
gitea-f0b773e0ced9110f34326398e5b6c55ad6e25201.zip
Support downloading raw task logs (#24451)
Hi! This pull request adds support for downloading raw task logs for Gitea Actions, similar to Github Actions It looks like the following: ![image](https://user-images.githubusercontent.com/945339/235376746-405d5019-710b-468b-8113-9e82eab8e752.png)
Diffstat (limited to 'routers')
-rw-r--r--routers/web/repo/actions/view.go50
-rw-r--r--routers/web/web.go1
2 files changed, 51 insertions, 0 deletions
diff --git a/routers/web/repo/actions/view.go b/routers/web/repo/actions/view.go
index 7c2e9d63d6..537bc61807 100644
--- a/routers/web/repo/actions/view.go
+++ b/routers/web/repo/actions/view.go
@@ -8,6 +8,7 @@ import (
"errors"
"fmt"
"net/http"
+ "strings"
"time"
actions_model "code.gitea.io/gitea/models/actions"
@@ -310,6 +311,55 @@ func rerunJob(ctx *context_module.Context, job *actions_model.ActionRunJob) erro
return nil
}
+func Logs(ctx *context_module.Context) {
+ runIndex := ctx.ParamsInt64("run")
+ jobIndex := ctx.ParamsInt64("job")
+
+ job, _ := getRunJobs(ctx, runIndex, jobIndex)
+ if ctx.Written() {
+ return
+ }
+ if job.TaskID == 0 {
+ ctx.Error(http.StatusNotFound, "job is not started")
+ return
+ }
+
+ err := job.LoadRun(ctx)
+ if err != nil {
+ ctx.Error(http.StatusInternalServerError, err.Error())
+ return
+ }
+
+ task, err := actions_model.GetTaskByID(ctx, job.TaskID)
+ if err != nil {
+ ctx.Error(http.StatusInternalServerError, err.Error())
+ return
+ }
+ if task.LogExpired {
+ ctx.Error(http.StatusNotFound, "logs have been cleaned up")
+ return
+ }
+
+ reader, err := actions.OpenLogs(ctx, task.LogInStorage, task.LogFilename)
+ if err != nil {
+ ctx.Error(http.StatusInternalServerError, err.Error())
+ return
+ }
+ defer reader.Close()
+
+ workflowName := job.Run.WorkflowID
+ if p := strings.Index(workflowName, "."); p > 0 {
+ workflowName = workflowName[0:p]
+ }
+ ctx.ServeContent(reader, &context_module.ServeHeaderOptions{
+ Filename: fmt.Sprintf("%v-%v-%v.log", workflowName, job.Name, task.ID),
+ ContentLength: &task.LogSize,
+ ContentType: "text/plain",
+ ContentTypeCharset: "utf-8",
+ Disposition: "attachment",
+ })
+}
+
func Cancel(ctx *context_module.Context) {
runIndex := ctx.ParamsInt64("run")
diff --git a/routers/web/web.go b/routers/web/web.go
index 26ad2d54c3..a5465eb041 100644
--- a/routers/web/web.go
+++ b/routers/web/web.go
@@ -1207,6 +1207,7 @@ func registerRoutes(m *web.Route) {
Get(actions.View).
Post(web.Bind(actions.ViewRequest{}), actions.ViewPost)
m.Post("/rerun", reqRepoActionsWriter, actions.RerunOne)
+ m.Get("/logs", actions.Logs)
})
m.Post("/cancel", reqRepoActionsWriter, actions.Cancel)
m.Post("/approve", reqRepoActionsWriter, actions.Approve)