From 4afbfd39467c558a06781c7cccf735df592a4bab Mon Sep 17 00:00:00 2001 From: Rowan Bohde Date: Tue, 4 Jun 2024 23:00:56 -0500 Subject: [PATCH] fix: allow actions artifacts storage migration to complete succesfully (#31251) Change the copy to use `ActionsArtifact.StoragePath` instead of the `ArtifactPath`. Skip artifacts that are expired, and don't error if the file to copy does not exist. --- When trying to migrate actions artifact storage from local to MinIO, we encountered errors that prevented the process from completing successfully: * The migration tries to copy the files using the per-run `ArtifactPath`, instead of the unique `StoragePath`. * Artifacts that have been marked expired and had their files deleted would throw an error * Artifacts that are pending, but don't have a file uploaded yet will throw an error. This PR addresses these cases, and allow the process to complete successfully. (cherry picked from commit 8de8972baf5d82ff7b58ed77d78e8e1869e64eb5) --- cmd/migrate_storage.go | 18 ++++++++++++++++-- release-notes/8.0.0/fix/4085.md | 1 + 2 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 release-notes/8.0.0/fix/4085.md diff --git a/cmd/migrate_storage.go b/cmd/migrate_storage.go index 1a8a37543d..69fdb90f33 100644 --- a/cmd/migrate_storage.go +++ b/cmd/migrate_storage.go @@ -5,7 +5,9 @@ package cmd import ( "context" + "errors" "fmt" + "io/fs" "strings" actions_model "code.gitea.io/gitea/models/actions" @@ -162,8 +164,20 @@ func migrateActionsLog(ctx context.Context, dstStorage storage.ObjectStorage) er func migrateActionsArtifacts(ctx context.Context, dstStorage storage.ObjectStorage) error { return db.Iterate(ctx, nil, func(ctx context.Context, artifact *actions_model.ActionArtifact) error { - _, err := storage.Copy(dstStorage, artifact.ArtifactPath, storage.ActionsArtifacts, artifact.ArtifactPath) - return err + if artifact.Status == int64(actions_model.ArtifactStatusExpired) { + return nil + } + + _, err := storage.Copy(dstStorage, artifact.StoragePath, storage.ActionsArtifacts, artifact.StoragePath) + if err != nil { + // ignore files that do not exist + if errors.Is(err, fs.ErrNotExist) { + return nil + } + return err + } + + return nil }) } diff --git a/release-notes/8.0.0/fix/4085.md b/release-notes/8.0.0/fix/4085.md new file mode 100644 index 0000000000..6112b2f920 --- /dev/null +++ b/release-notes/8.0.0/fix/4085.md @@ -0,0 +1 @@ +- `forgejo migrate-storage --type actions-artifacts` always fails because it picks the wrong path