diff options
author | FuXiaoHei <fuxiaohei@vip.qq.com> | 2023-07-21 10:42:01 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-07-21 10:42:01 +0800 |
commit | f3d293d2bbe0b2eab047bdd403046069cffbc0c4 (patch) | |
tree | 4f7c140152ea2ffce41baed830402cca91fb3e5a /models/actions/artifact.go | |
parent | 3acaaa29dd98c338fca98a3035bd8e95acff91a9 (diff) | |
download | gitea-f3d293d2bbe0b2eab047bdd403046069cffbc0c4.tar.gz gitea-f3d293d2bbe0b2eab047bdd403046069cffbc0c4.zip |
Actions Artifacts support uploading multiple files and directories (#24874)
current actions artifacts implementation only support single file
artifact. To support multiple files uploading, it needs:
- save each file to each db record with same run-id, same artifact-name
and proper artifact-path
- need change artifact uploading url without artifact-id, multiple files
creates multiple artifact-ids
- support `path` in download-artifact action. artifact should download
to `{path}/{artifact-path}`.
- in repo action view, it provides zip download link in artifacts list
in summary page, no matter this artifact contains single or multiple
files.
Diffstat (limited to 'models/actions/artifact.go')
-rw-r--r-- | models/actions/artifact.go | 59 |
1 files changed, 44 insertions, 15 deletions
diff --git a/models/actions/artifact.go b/models/actions/artifact.go index 1b45fce067..800dcd0d50 100644 --- a/models/actions/artifact.go +++ b/models/actions/artifact.go @@ -31,7 +31,7 @@ func init() { // ActionArtifact is a file that is stored in the artifact storage. type ActionArtifact struct { ID int64 `xorm:"pk autoincr"` - RunID int64 `xorm:"index UNIQUE(runid_name)"` // The run id of the artifact + RunID int64 `xorm:"index unique(runid_name_path)"` // The run id of the artifact RunnerID int64 RepoID int64 `xorm:"index"` OwnerID int64 @@ -40,27 +40,28 @@ type ActionArtifact struct { FileSize int64 // The size of the artifact in bytes FileCompressedSize int64 // The size of the artifact in bytes after gzip compression ContentEncoding string // The content encoding of the artifact - ArtifactPath string // The path to the artifact when runner uploads it - ArtifactName string `xorm:"UNIQUE(runid_name)"` // The name of the artifact when runner uploads it - Status int64 `xorm:"index"` // The status of the artifact, uploading, expired or need-delete + ArtifactPath string `xorm:"index unique(runid_name_path)"` // The path to the artifact when runner uploads it + ArtifactName string `xorm:"index unique(runid_name_path)"` // The name of the artifact when runner uploads it + Status int64 `xorm:"index"` // The status of the artifact, uploading, expired or need-delete CreatedUnix timeutil.TimeStamp `xorm:"created"` UpdatedUnix timeutil.TimeStamp `xorm:"updated index"` } -// CreateArtifact create a new artifact with task info or get same named artifact in the same run -func CreateArtifact(ctx context.Context, t *ActionTask, artifactName string) (*ActionArtifact, error) { +func CreateArtifact(ctx context.Context, t *ActionTask, artifactName, artifactPath string) (*ActionArtifact, error) { if err := t.LoadJob(ctx); err != nil { return nil, err } - artifact, err := getArtifactByArtifactName(ctx, t.Job.RunID, artifactName) + artifact, err := getArtifactByNameAndPath(ctx, t.Job.RunID, artifactName, artifactPath) if errors.Is(err, util.ErrNotExist) { artifact := &ActionArtifact{ - RunID: t.Job.RunID, - RunnerID: t.RunnerID, - RepoID: t.RepoID, - OwnerID: t.OwnerID, - CommitSHA: t.CommitSHA, - Status: ArtifactStatusUploadPending, + ArtifactName: artifactName, + ArtifactPath: artifactPath, + RunID: t.Job.RunID, + RunnerID: t.RunnerID, + RepoID: t.RepoID, + OwnerID: t.OwnerID, + CommitSHA: t.CommitSHA, + Status: ArtifactStatusUploadPending, } if _, err := db.GetEngine(ctx).Insert(artifact); err != nil { return nil, err @@ -72,9 +73,9 @@ func CreateArtifact(ctx context.Context, t *ActionTask, artifactName string) (*A return artifact, nil } -func getArtifactByArtifactName(ctx context.Context, runID int64, name string) (*ActionArtifact, error) { +func getArtifactByNameAndPath(ctx context.Context, runID int64, name, fpath string) (*ActionArtifact, error) { var art ActionArtifact - has, err := db.GetEngine(ctx).Where("run_id = ? AND artifact_name = ?", runID, name).Get(&art) + has, err := db.GetEngine(ctx).Where("run_id = ? AND artifact_name = ? AND artifact_path = ?", runID, name, fpath).Get(&art) if err != nil { return nil, err } else if !has { @@ -109,14 +110,42 @@ func ListArtifactsByRunID(ctx context.Context, runID int64) ([]*ActionArtifact, return arts, db.GetEngine(ctx).Where("run_id=?", runID).Find(&arts) } +// ListArtifactsByRunIDAndArtifactName returns an artifacts of a run by artifact name +func ListArtifactsByRunIDAndArtifactName(ctx context.Context, runID int64, artifactName string) ([]*ActionArtifact, error) { + arts := make([]*ActionArtifact, 0, 10) + return arts, db.GetEngine(ctx).Where("run_id=? AND artifact_name=?", runID, artifactName).Find(&arts) +} + // ListUploadedArtifactsByRunID returns all uploaded artifacts of a run func ListUploadedArtifactsByRunID(ctx context.Context, runID int64) ([]*ActionArtifact, error) { arts := make([]*ActionArtifact, 0, 10) return arts, db.GetEngine(ctx).Where("run_id=? AND status=?", runID, ArtifactStatusUploadConfirmed).Find(&arts) } +// ActionArtifactMeta is the meta data of an artifact +type ActionArtifactMeta struct { + ArtifactName string + FileSize int64 +} + +// ListUploadedArtifactsMeta returns all uploaded artifacts meta of a run +func ListUploadedArtifactsMeta(ctx context.Context, runID int64) ([]*ActionArtifactMeta, error) { + arts := make([]*ActionArtifactMeta, 0, 10) + return arts, db.GetEngine(ctx).Table("action_artifact"). + Where("run_id=? AND status=?", runID, ArtifactStatusUploadConfirmed). + GroupBy("artifact_name"). + Select("artifact_name, sum(file_size) as file_size"). + Find(&arts) +} + // ListArtifactsByRepoID returns all artifacts of a repo func ListArtifactsByRepoID(ctx context.Context, repoID int64) ([]*ActionArtifact, error) { arts := make([]*ActionArtifact, 0, 10) return arts, db.GetEngine(ctx).Where("repo_id=?", repoID).Find(&arts) } + +// ListArtifactsByRunIDAndName returns artifacts by name of a run +func ListArtifactsByRunIDAndName(ctx context.Context, runID int64, name string) ([]*ActionArtifact, error) { + arts := make([]*ActionArtifact, 0, 10) + return arts, db.GetEngine(ctx).Where("run_id=? AND artifact_name=?", runID, name).Find(&arts) +} |