feat: artifact push and pull actions
All checks were successful
default / test artifact actions (push) Successful in 26s

This commit is contained in:
Louis Seubert 2026-09-13 19:10:04 +02:00
commit ae8d20e174
Signed by: louis9902
GPG key ID: 4B9DB28F826553BD
15 changed files with 1319 additions and 0 deletions

76
internal/e2e_test.go Normal file
View file

@ -0,0 +1,76 @@
package internal
import (
"context"
"fmt"
"os"
"path/filepath"
"testing"
"time"
"code.geekeey.de/actions/artifacts/internal/pull"
"code.geekeey.de/actions/artifacts/internal/push"
"code.geekeey.de/actions/sdk"
"code.geekeey.de/actions/sdk/artifact"
)
// TestE2E_PushPullRoundTrip runs the push and pull actions against the real
// results service. It only runs inside a CI pipeline (GITHUB_ACTIONS=true) and
// is skipped locally. Its purpose is to detect drift in the artifact actions.
func TestE2E_PushPullRoundTrip(t *testing.T) {
if os.Getenv("GITHUB_ACTIONS") != "true" {
t.Skip("e2e test only runs in CI")
}
if os.Getenv("ACTIONS_RESULTS_URL") == "" || os.Getenv("ACTIONS_RUNTIME_TOKEN") == "" {
t.Skip("ACTIONS_RESULTS_URL and ACTIONS_RUNTIME_TOKEN are required")
}
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute)
defer cancel()
name := fmt.Sprintf("e2e-%d-%d", os.Getpid(), time.Now().UnixNano())
t.Cleanup(func() {
run, job, err := artifact.JobInfo()
if err != nil {
return
}
client := artifact.NewClientFromEnv(os.Getenv)
_, _ = client.DeleteArtifact(context.Background(), artifact.DeleteArtifactRequest{RunID: run, JobRunID: job, Name: name})
})
const want = "hello e2e"
src := t.TempDir()
if err := os.MkdirAll(filepath.Join(src, "nested"), 0o755); err != nil {
t.Fatal(err)
}
if err := os.WriteFile(filepath.Join(src, "file.txt"), []byte(want), 0o644); err != nil {
t.Fatal(err)
}
if err := os.WriteFile(filepath.Join(src, "nested", "deep.txt"), []byte(want), 0o644); err != nil {
t.Fatal(err)
}
t.Setenv("INPUT_NAME", name)
t.Setenv("INPUT_PATH", src)
t.Setenv("INPUT_PATTERN", "**/*")
if err := push.New(sdk.New()).Run(ctx); err != nil {
t.Fatalf("push: %v", err)
}
dst := t.TempDir()
t.Setenv("INPUT_PATH", dst)
if err := pull.New(sdk.New()).Run(ctx); err != nil {
t.Fatalf("pull: %v", err)
}
for _, file := range []string{"file.txt", filepath.Join("nested", "deep.txt")} {
got, err := os.ReadFile(filepath.Join(dst, file))
if err != nil {
t.Fatal(err)
}
if string(got) != want {
t.Errorf("expected %q to contain %q, got %q", file, want, got)
}
}
}