-
-
Notifications
You must be signed in to change notification settings - Fork 5.8k
Implement actions artifacts #22738
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Implement actions artifacts #22738
Changes from all commits
Commits
Show all changes
44 commits
Select commit
Hold shift + click to select a range
c41709d
feat: add upload-artifact http api
fuxiaohei 93cd14b
feat: add action artifact table
fuxiaohei 74f186a
feat(actions-artifacts): finish download artifacts apis
fuxiaohei 7a40012
fix(actions-artifacts): merge conflicts
fuxiaohei e40901f
feat(actions-artifacts): use uniform pipeline api url for artifact, f…
fuxiaohei 45fc039
feat(actions-artifacts): add artifacts view page
fuxiaohei 8787632
feat(actions-artifacts): delete artifacts in storage after repo is de…
fuxiaohei ed76a1a
fix(actions-artifacts): drop 'localhost' check, the runner should che…
fuxiaohei c1e08de
fix(actions-artifacts): need create file when upload first time
fuxiaohei 163b7af
feat(artifacts): save artifact chunks
fuxiaohei 6524437
feat(artifacts): add token auth for runner api, fix lint
fuxiaohei 63047a6
feat(artifacts): update db index and details, add table migration
fuxiaohei b5ef300
feat(artifacts): use hashReader to avoid read chunk totally, and some…
fuxiaohei 1691fa4
feat(artifacts): update artifact title in i18n for vue component
fuxiaohei 05f7f63
update util.PathJoinRel to make path operations safe
fuxiaohei 0b7d74f
clean useless code
fuxiaohei 4f7aa96
use NewNotExistErrorf to format no artifact error
fuxiaohei cc3e961
fix: artifact md5 and task id checking incorrect
fuxiaohei cfe4bcc
refactor: rename artifact taskID to jobID. artifact is running with e…
fuxiaohei 3baf84f
update artifact list style
fuxiaohei c2dfc92
doc: add artifact upload and download api desc
fuxiaohei 23e9462
artifact use run-id as index, not job-id
fuxiaohei 4a08b58
add actions.artifacts config ini section
fuxiaohei 431b17f
fix artifact migration, fix artifact api refresh in web page
fuxiaohei c3a2603
update artifact i18n, and table unique defs
fuxiaohei 5faba18
move artifact key to top-level in i18n
fuxiaohei aacd427
merge artifact refresh into job interval in action view
fuxiaohei 967bd69
fix artifact unique index definition
fuxiaohei 5eee187
update artifact response status code, routes defs, typed response
fuxiaohei eb6c55e
update artifact chunk naming params, update buildArtifactURL method
fuxiaohei 65c4153
begin artifact api integration tests
fuxiaohei faacdec
Merge remote-tracking branch 'origin' into feature/bots-artifacts
fuxiaohei 880b249
fix typo, update lint, update actions router response, update migration
fuxiaohei e560d3e
Merge branch 'main' into feature/bots-artifacts
fuxiaohei 6a60390
update artifact integration tests
fuxiaohei 6bb5580
fix artifact integration tests failure
fuxiaohei 1d49f24
Merge remote-tracking branch 'origin' into feature/bots-artifacts
fuxiaohei a682328
update artifact status field name, update tests fixture
fuxiaohei f2a4d87
artifact title in wrong locale field
fuxiaohei 265c882
Merge branch 'main' into feature/bots-artifacts
fuxiaohei b60f970
rename actions storages to LogStorage and ArtifactStorage
fuxiaohei 9cfaf5a
rename artifact route params from camelCase to snake_case
fuxiaohei 63727ff
Merge branch 'main' into feature/bots-artifacts
GiteaBot 2a22a60
Merge branch 'main' into feature/bots-artifacts
GiteaBot File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,122 @@ | ||
// Copyright 2023 The Gitea Authors. All rights reserved. | ||
// SPDX-License-Identifier: MIT | ||
|
||
// This artifact server is inspired by https://github.com/nektos/act/blob/master/pkg/artifacts/server.go. | ||
// It updates url setting and uses ObjectStore to handle artifacts persistence. | ||
|
||
package actions | ||
|
||
import ( | ||
"context" | ||
"errors" | ||
|
||
"code.gitea.io/gitea/models/db" | ||
"code.gitea.io/gitea/modules/timeutil" | ||
"code.gitea.io/gitea/modules/util" | ||
) | ||
|
||
const ( | ||
// ArtifactStatusUploadPending is the status of an artifact upload that is pending | ||
ArtifactStatusUploadPending = 1 | ||
// ArtifactStatusUploadConfirmed is the status of an artifact upload that is confirmed | ||
ArtifactStatusUploadConfirmed = 2 | ||
// ArtifactStatusUploadError is the status of an artifact upload that is errored | ||
ArtifactStatusUploadError = 3 | ||
) | ||
|
||
func init() { | ||
db.RegisterModel(new(ActionArtifact)) | ||
} | ||
|
||
// 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 | ||
RunnerID int64 | ||
RepoID int64 `xorm:"index"` | ||
OwnerID int64 | ||
CommitSHA string | ||
StoragePath string // The path to the artifact in the storage | ||
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 | ||
fuxiaohei marked this conversation as resolved.
Show resolved
Hide resolved
|
||
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 | ||
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) { | ||
if err := t.LoadJob(ctx); err != nil { | ||
return nil, err | ||
} | ||
artifact, err := getArtifactByArtifactName(ctx, t.Job.RunID, artifactName) | ||
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, | ||
} | ||
if _, err := db.GetEngine(ctx).Insert(artifact); err != nil { | ||
return nil, err | ||
} | ||
return artifact, nil | ||
} else if err != nil { | ||
return nil, err | ||
} | ||
return artifact, nil | ||
} | ||
|
||
func getArtifactByArtifactName(ctx context.Context, runID int64, name string) (*ActionArtifact, error) { | ||
var art ActionArtifact | ||
has, err := db.GetEngine(ctx).Where("run_id = ? AND artifact_name = ?", runID, name).Get(&art) | ||
if err != nil { | ||
return nil, err | ||
} else if !has { | ||
return nil, util.ErrNotExist | ||
} | ||
return &art, nil | ||
} | ||
|
||
// GetArtifactByID returns an artifact by id | ||
func GetArtifactByID(ctx context.Context, id int64) (*ActionArtifact, error) { | ||
var art ActionArtifact | ||
has, err := db.GetEngine(ctx).ID(id).Get(&art) | ||
if err != nil { | ||
return nil, err | ||
} else if !has { | ||
return nil, util.ErrNotExist | ||
} | ||
|
||
return &art, nil | ||
} | ||
|
||
// UpdateArtifactByID updates an artifact by id | ||
func UpdateArtifactByID(ctx context.Context, id int64, art *ActionArtifact) error { | ||
art.ID = id | ||
_, err := db.GetEngine(ctx).ID(id).AllCols().Update(art) | ||
return err | ||
} | ||
|
||
// ListArtifactsByRunID returns all artifacts of a run | ||
func ListArtifactsByRunID(ctx context.Context, runID int64) ([]*ActionArtifact, error) { | ||
arts := make([]*ActionArtifact, 0, 10) | ||
return arts, db.GetEngine(ctx).Where("run_id=?", runID).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) | ||
} | ||
|
||
// 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) | ||
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
- | ||
id: 791 | ||
title: "update actions" | ||
repo_id: 4 | ||
owner_id: 1 | ||
workflow_id: "artifact.yaml" | ||
index: 187 | ||
trigger_user_id: 1 | ||
ref: "refs/heads/master" | ||
commit_sha: "c2d72f548424103f01ee1dc02889c1e2bff816b0" | ||
event: "push" | ||
is_fork_pull_request: 0 | ||
status: 1 | ||
started: 1683636528 | ||
stopped: 1683636626 | ||
created: 1683636108 | ||
updated: 1683636626 | ||
need_approval: 0 | ||
approved_by: 0 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
- | ||
id: 192 | ||
run_id: 791 | ||
repo_id: 4 | ||
owner_id: 1 | ||
commit_sha: c2d72f548424103f01ee1dc02889c1e2bff816b0 | ||
is_fork_pull_request: 0 | ||
name: job_2 | ||
attempt: 1 | ||
job_id: job_2 | ||
task_id: 47 | ||
status: 1 | ||
started: 1683636528 | ||
stopped: 1683636626 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
- | ||
id: 47 | ||
job_id: 192 | ||
attempt: 3 | ||
runner_id: 1 | ||
status: 6 # 6 is the status code for "running", running task can upload artifacts | ||
started: 1683636528 | ||
stopped: 1683636626 | ||
repo_id: 4 | ||
owner_id: 1 | ||
commit_sha: c2d72f548424103f01ee1dc02889c1e2bff816b0 | ||
is_fork_pull_request: 0 | ||
token_hash: 6d8ef48297195edcc8e22c70b3020eaa06c52976db67d39b4260c64a69a2cc1508825121b7b8394e48e00b1bf8718b2a867e | ||
token_salt: jVuKnSPGgy | ||
token_last_eight: eeb1a71a | ||
log_filename: artifact-test2/2f/47.log | ||
log_in_storage: 1 | ||
log_length: 707 | ||
log_size: 90179 | ||
log_expired: 0 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
// Copyright 2023 The Gitea Authors. All rights reserved. | ||
// SPDX-License-Identifier: MIT | ||
|
||
package v1_20 //nolint | ||
|
||
import ( | ||
"code.gitea.io/gitea/modules/timeutil" | ||
|
||
"xorm.io/xorm" | ||
) | ||
|
||
func CreateActionArtifactTable(x *xorm.Engine) error { | ||
// 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 | ||
RunnerID int64 | ||
RepoID int64 `xorm:"index"` | ||
OwnerID int64 | ||
CommitSHA string | ||
StoragePath string // The path to the artifact in the storage | ||
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 | ||
CreatedUnix timeutil.TimeStamp `xorm:"created"` | ||
UpdatedUnix timeutil.TimeStamp `xorm:"updated index"` | ||
} | ||
|
||
return x.Sync(new(ActionArtifact)) | ||
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.