vole
Clone
Read only, no credentials:
https://rodent.software/git/vole.git
Write over SSH with a registered key:
git clone ssh://git@0.0.0.0:2222/vole.git
A free and open-source forge that lives in your Git repo.
Make the run list say what triggered each run
57dc79afa8097830de03fc2fc2c19561470b6d36 · Keenan Nemetz · 6d ago · parent 338a19dd
Make the run list say what triggered each run The runs table said only which ref a run used, so a push, an issue event and a manual dispatch looked alike. Give each run a TriggerTitle and show it in a "Triggered by" column; the run page uses the same words. Drop the separate workflows page. The run list is where a job is found, and the run page now links the workflow definition it ran, so a second page listing the same jobs only split the answer. Show the full log viewer only while a run is going. A finished run has per-step logs, and the full log is a download rather than a second copy of every step's output.
server/integration_test.go +26−2
| @@ -2900,6 +2900,25 @@ jobs: | |||
| 2900 | 2900 | if body != string(stored) { | |
| 2901 | 2901 | t.Fatalf("the served log differs from %s", logPath) | |
| 2902 | 2902 | } | |
| 2903 | dlReq, dlErr := http.NewRequest(http.MethodGet, f.http.URL+"/r/"+f.repo+"/runs/"+done.ID+"/log?download=1", nil) | ||
| 2904 | if dlErr != nil { | ||
| 2905 | t.Fatal(dlErr) | ||
| 2906 | } | ||
| 2907 | dlResp, dlErr := http.DefaultClient.Do(dlReq) | ||
| 2908 | if dlErr != nil { | ||
| 2909 | t.Fatal(dlErr) | ||
| 2910 | } | ||
| 2911 | downloaded, dlErr := io.ReadAll(dlResp.Body) | ||
| 2912 | dlResp.Body.Close() | ||
| 2913 | if dlErr != nil { | ||
| 2914 | t.Fatal(dlErr) | ||
| 2915 | } | ||
| 2916 | if cd := dlResp.Header.Get("Content-Disposition"); !strings.Contains(cd, "attachment") || !strings.Contains(cd, done.ID) { | ||
| 2917 | t.Fatalf("downloaded log Content-Disposition = %q", cd) | ||
| 2918 | } | ||
| 2919 | if string(downloaded) != string(stored) { | ||
| 2920 | t.Fatalf("the downloaded log differs from %s", logPath) | ||
| 2921 | } | ||
| 2903 | 2922 | ||
| 2904 | 2923 | // The result is stored in the database, not on the branch: the record names this | |
| 2905 | 2924 | // job, its log and its outcome, and the queue records who reported it. Attribution | |
| @@ -2949,9 +2968,14 @@ jobs: | |||
| 2949 | 2968 | t.Fatalf("range request = %d, Content-Range %q", resp.StatusCode, resp.Header.Get("Content-Range")) | |
| 2950 | 2969 | } | |
| 2951 | 2970 | // Attribution is the boundary's, and the page says who it accepted the result from. | |
| 2971 | // A finished run shows each step once; the whole log is a download, not a second | ||
| 2972 | // copy of every step's output in an accordion above them. | ||
| 2952 | 2973 | if _, page := f.get("/r/" + f.repo + "/runs/" + done.ID); !strings.Contains(page, "reported by") || | |
| 2953 | !strings.Contains(page, "say hello") || !strings.Contains(page, "step=1") { | ||
| 2954 | t.Fatalf("the run page does not show the result, the step, or its log link:\n%s", page) | ||
| 2974 | !strings.Contains(page, "say hello") || !strings.Contains(page, "step=1") || | ||
| 2975 | !strings.Contains(page, "Download full log") || !strings.Contains(page, "download=1") { | ||
| 2976 | t.Fatalf("the run page does not show the result, the step log, or the full-log download:\n%s", page) | ||
| 2977 | } else if strings.Contains(page, "data-log-stream") { | ||
| 2978 | t.Fatalf("the finished run page still shows the full live log viewer:\n%s", page) | ||
| 2955 | 2979 | } | |
| 2956 | 2980 | if done.SHA != mustSHA(t, work) { | |
| 2957 | 2981 | t.Fatalf("run recorded sha %s, want the pushed commit", done.SHA) | |