summaryrefslogtreecommitdiffstats
path: root/models/issues
diff options
context:
space:
mode:
authorJason Song <i@wolfogre.com>2023-01-31 09:45:19 +0800
committerGitHub <noreply@github.com>2023-01-31 09:45:19 +0800
commit4011821c946e8db032be86266dd9364ccb204118 (patch)
treea8a1cf1b8f088df583f316c8233bc18a89881099 /models/issues
parentb5b3e0714e624cea3ce4d5368aa1266f7639d0eb (diff)
downloadgitea-4011821c946e8db032be86266dd9364ccb204118.tar.gz
gitea-4011821c946e8db032be86266dd9364ccb204118.zip
Implement actions (#21937)
Close #13539. Co-authored by: @lunny @appleboy @fuxiaohei and others. Related projects: - https://gitea.com/gitea/actions-proto-def - https://gitea.com/gitea/actions-proto-go - https://gitea.com/gitea/act - https://gitea.com/gitea/act_runner ### Summary The target of this PR is to bring a basic implementation of "Actions", an internal CI/CD system of Gitea. That means even though it has been merged, the state of the feature is **EXPERIMENTAL**, and please note that: - It is disabled by default; - It shouldn't be used in a production environment currently; - It shouldn't be used in a public Gitea instance currently; - Breaking changes may be made before it's stable. **Please comment on #13539 if you have any different product design ideas**, all decisions reached there will be adopted here. But in this PR, we don't talk about **naming, feature-creep or alternatives**. ### ⚠️ Breaking `gitea-actions` will become a reserved user name. If a user with the name already exists in the database, it is recommended to rename it. ### Some important reviews - What is `DEFAULT_ACTIONS_URL` in `app.ini` for? - https://github.com/go-gitea/gitea/pull/21937#discussion_r1055954954 - Why the api for runners is not under the normal `/api/v1` prefix? - https://github.com/go-gitea/gitea/pull/21937#discussion_r1061173592 - Why DBFS? - https://github.com/go-gitea/gitea/pull/21937#discussion_r1061301178 - Why ignore events triggered by `gitea-actions` bot? - https://github.com/go-gitea/gitea/pull/21937#discussion_r1063254103 - Why there's no permission control for actions? - https://github.com/go-gitea/gitea/pull/21937#discussion_r1090229868 ### What it looks like <details> #### Manage runners <img width="1792" alt="image" src="https://user-images.githubusercontent.com/9418365/205870657-c72f590e-2e08-4cd4-be7f-2e0abb299bbf.png"> #### List runs <img width="1792" alt="image" src="https://user-images.githubusercontent.com/9418365/205872794-50fde990-2b45-48c1-a178-908e4ec5b627.png"> #### View logs <img width="1792" alt="image" src="https://user-images.githubusercontent.com/9418365/205872501-9b7b9000-9542-4991-8f55-18ccdada77c3.png"> </details> ### How to try it <details> #### 1. Start Gitea Clone this branch and [install from source](https://docs.gitea.io/en-us/install-from-source). Add additional configurations in `app.ini` to enable Actions: ```ini [actions] ENABLED = true ``` Start it. If all is well, you'll see the management page of runners: <img width="1792" alt="image" src="https://user-images.githubusercontent.com/9418365/205877365-8e30a780-9b10-4154-b3e8-ee6c3cb35a59.png"> #### 2. Start runner Clone the [act_runner](https://gitea.com/gitea/act_runner), and follow the [README](https://gitea.com/gitea/act_runner/src/branch/main/README.md) to start it. If all is well, you'll see a new runner has been added: <img width="1792" alt="image" src="https://user-images.githubusercontent.com/9418365/205878000-216f5937-e696-470d-b66c-8473987d91c3.png"> #### 3. Enable actions for a repo Create a new repo or open an existing one, check the `Actions` checkbox in settings and submit. <img width="1792" alt="image" src="https://user-images.githubusercontent.com/9418365/205879705-53e09208-73c0-4b3e-a123-2dcf9aba4b9c.png"> <img width="1792" alt="image" src="https://user-images.githubusercontent.com/9418365/205879383-23f3d08f-1a85-41dd-a8b3-54e2ee6453e8.png"> If all is well, you'll see a new tab "Actions": <img width="1792" alt="image" src="https://user-images.githubusercontent.com/9418365/205881648-a8072d8c-5803-4d76-b8a8-9b2fb49516c1.png"> #### 4. Upload workflow files Upload some workflow files to `.gitea/workflows/xxx.yaml`, you can follow the [quickstart](https://docs.github.com/en/actions/quickstart) of GitHub Actions. Yes, Gitea Actions is compatible with GitHub Actions in most cases, you can use the same demo: ```yaml name: GitHub Actions Demo run-name: ${{ github.actor }} is testing out GitHub Actions 🚀 on: [push] jobs: Explore-GitHub-Actions: runs-on: ubuntu-latest steps: - run: echo "🎉 The job was automatically triggered by a ${{ github.event_name }} event." - run: echo "🐧 This job is now running on a ${{ runner.os }} server hosted by GitHub!" - run: echo "🔎 The name of your branch is ${{ github.ref }} and your repository is ${{ github.repository }}." - name: Check out repository code uses: actions/checkout@v3 - run: echo "💡 The ${{ github.repository }} repository has been cloned to the runner." - run: echo "🖥️ The workflow is now ready to test your code on the runner." - name: List files in the repository run: | ls ${{ github.workspace }} - run: echo "🍏 This job's status is ${{ job.status }}." ``` If all is well, you'll see a new run in `Actions` tab: <img width="1792" alt="image" src="https://user-images.githubusercontent.com/9418365/205884473-79a874bc-171b-4aaf-acd5-0241a45c3b53.png"> #### 5. Check the logs of jobs Click a run and you'll see the logs: <img width="1792" alt="image" src="https://user-images.githubusercontent.com/9418365/205884800-994b0374-67f7-48ff-be9a-4c53f3141547.png"> #### 6. Go on You can try more examples in [the documents](https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions) of GitHub Actions, then you might find a lot of bugs. Come on, PRs are welcome. </details> See also: [Feature Preview: Gitea Actions](https://blog.gitea.io/2022/12/feature-preview-gitea-actions/) --------- Co-authored-by: a1012112796 <1012112796@qq.com> Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com> Co-authored-by: delvh <dev.lh@web.de> Co-authored-by: ChristopherHX <christopher.homberger@web.de> Co-authored-by: John Olheiser <john.olheiser@gmail.com>
Diffstat (limited to 'models/issues')
-rw-r--r--models/issues/comment.go2
-rw-r--r--models/issues/comment_list.go27
-rw-r--r--models/issues/issue.go2
-rw-r--r--models/issues/issue_list.go37
-rw-r--r--models/issues/pull.go5
-rw-r--r--models/issues/review.go2
6 files changed, 38 insertions, 37 deletions
diff --git a/models/issues/comment.go b/models/issues/comment.go
index 91dc128277..9ad538fcc6 100644
--- a/models/issues/comment.go
+++ b/models/issues/comment.go
@@ -355,7 +355,7 @@ func (c *Comment) LoadPoster(ctx context.Context) (err error) {
return nil
}
- c.Poster, err = user_model.GetUserByID(ctx, c.PosterID)
+ c.Poster, err = user_model.GetPossibleUserByID(ctx, c.PosterID)
if err != nil {
if user_model.IsErrUserNotExist(err) {
c.PosterID = -1
diff --git a/models/issues/comment_list.go b/models/issues/comment_list.go
index 2b55bc212f..0411d44531 100644
--- a/models/issues/comment_list.go
+++ b/models/issues/comment_list.go
@@ -29,32 +29,13 @@ func (comments CommentList) LoadPosters(ctx context.Context) error {
return nil
}
- posterIDs := comments.getPosterIDs()
- posterMaps := make(map[int64]*user_model.User, len(posterIDs))
- left := len(posterIDs)
- for left > 0 {
- limit := db.DefaultMaxInSize
- if left < limit {
- limit = left
- }
- err := db.GetEngine(ctx).
- In("id", posterIDs[:limit]).
- Find(&posterMaps)
- if err != nil {
- return err
- }
- left -= limit
- posterIDs = posterIDs[limit:]
+ posterMaps, err := getPosters(ctx, comments.getPosterIDs())
+ if err != nil {
+ return err
}
for _, comment := range comments {
- if comment.PosterID <= 0 {
- continue
- }
- var ok bool
- if comment.Poster, ok = posterMaps[comment.PosterID]; !ok {
- comment.Poster = user_model.NewGhostUser()
- }
+ comment.Poster = getPoster(comment.PosterID, posterMaps)
}
return nil
}
diff --git a/models/issues/issue.go b/models/issues/issue.go
index 50c9b77119..78cac90052 100644
--- a/models/issues/issue.go
+++ b/models/issues/issue.go
@@ -235,7 +235,7 @@ func (issue *Issue) LoadLabels(ctx context.Context) (err error) {
// LoadPoster loads poster
func (issue *Issue) LoadPoster(ctx context.Context) (err error) {
if issue.Poster == nil {
- issue.Poster, err = user_model.GetUserByID(ctx, issue.PosterID)
+ issue.Poster, err = user_model.GetPossibleUserByID(ctx, issue.PosterID)
if err != nil {
issue.PosterID = -1
issue.Poster = user_model.NewGhostUser()
diff --git a/models/issues/issue_list.go b/models/issues/issue_list.go
index e22e48c0bb..6ddadd27ed 100644
--- a/models/issues/issue_list.go
+++ b/models/issues/issue_list.go
@@ -86,7 +86,18 @@ func (issues IssueList) loadPosters(ctx context.Context) error {
return nil
}
- posterIDs := issues.getPosterIDs()
+ posterMaps, err := getPosters(ctx, issues.getPosterIDs())
+ if err != nil {
+ return err
+ }
+
+ for _, issue := range issues {
+ issue.Poster = getPoster(issue.PosterID, posterMaps)
+ }
+ return nil
+}
+
+func getPosters(ctx context.Context, posterIDs []int64) (map[int64]*user_model.User, error) {
posterMaps := make(map[int64]*user_model.User, len(posterIDs))
left := len(posterIDs)
for left > 0 {
@@ -98,22 +109,26 @@ func (issues IssueList) loadPosters(ctx context.Context) error {
In("id", posterIDs[:limit]).
Find(&posterMaps)
if err != nil {
- return err
+ return nil, err
}
left -= limit
posterIDs = posterIDs[limit:]
}
+ return posterMaps, nil
+}
- for _, issue := range issues {
- if issue.PosterID <= 0 {
- continue
- }
- var ok bool
- if issue.Poster, ok = posterMaps[issue.PosterID]; !ok {
- issue.Poster = user_model.NewGhostUser()
- }
+func getPoster(posterID int64, posterMaps map[int64]*user_model.User) *user_model.User {
+ if posterID == user_model.ActionsUserID {
+ return user_model.NewActionsUser()
}
- return nil
+ if posterID <= 0 {
+ return nil
+ }
+ poster, ok := posterMaps[posterID]
+ if !ok {
+ return user_model.NewGhostUser()
+ }
+ return poster
}
func (issues IssueList) getIssueIDs() []int64 {
diff --git a/models/issues/pull.go b/models/issues/pull.go
index 93b227f3fd..6ff6502e4e 100644
--- a/models/issues/pull.go
+++ b/models/issues/pull.go
@@ -394,6 +394,11 @@ func (pr *PullRequest) IsAncestor() bool {
return pr.Status == PullRequestStatusAncestor
}
+// IsFromFork return true if this PR is from a fork.
+func (pr *PullRequest) IsFromFork() bool {
+ return pr.HeadRepoID != pr.BaseRepoID
+}
+
// SetMerged sets a pull request to merged and closes the corresponding issue
func (pr *PullRequest) SetMerged(ctx context.Context) (bool, error) {
if pr.HasMerged {
diff --git a/models/issues/review.go b/models/issues/review.go
index 7e1a39bb5b..fe123d7398 100644
--- a/models/issues/review.go
+++ b/models/issues/review.go
@@ -158,7 +158,7 @@ func (r *Review) LoadReviewer(ctx context.Context) (err error) {
if r.ReviewerID == 0 || r.Reviewer != nil {
return
}
- r.Reviewer, err = user_model.GetUserByID(ctx, r.ReviewerID)
+ r.Reviewer, err = user_model.GetPossibleUserByID(ctx, r.ReviewerID)
return err
}