]> source.dussan.org Git - gitea.git/commitdiff
fix: allow actions artifacts storage migration to complete succesfully (#31251) ...
authorGiteabot <teabot@gitea.io>
Wed, 5 Jun 2024 08:25:48 +0000 (16:25 +0800)
committerGitHub <noreply@github.com>
Wed, 5 Jun 2024 08:25:48 +0000 (11:25 +0300)
Backport #31251 by @bohde

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.

Co-authored-by: Rowan Bohde <rowan.bohde@gmail.com>
cmd/migrate_storage.go

index 357416fc339fd297de1c2ac9f558425502247f4a..0ca719dd5432e04b71e8b0238fb4be95359020ec 100644 (file)
@@ -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
        })
 }