2017-02-04 10:53:46 -05:00
|
|
|
// Copyright 2017 The Gitea Authors. All rights reserved.
|
2022-11-27 13:20:29 -05:00
|
|
|
// SPDX-License-Identifier: MIT
|
2017-02-04 10:53:46 -05:00
|
|
|
|
2021-11-09 14:57:58 -05:00
|
|
|
package unit
|
2017-02-04 10:53:46 -05:00
|
|
|
|
2018-11-10 14:45:32 -05:00
|
|
|
import (
|
2023-05-06 05:39:06 -04:00
|
|
|
"errors"
|
2019-04-22 16:40:51 -04:00
|
|
|
"fmt"
|
2018-11-10 14:45:32 -05:00
|
|
|
"strings"
|
2024-05-20 00:35:38 -04:00
|
|
|
"sync/atomic"
|
2019-04-22 16:40:51 -04:00
|
|
|
|
2022-01-04 22:37:00 -05:00
|
|
|
"code.gitea.io/gitea/models/perm"
|
2023-08-30 02:55:25 -04:00
|
|
|
"code.gitea.io/gitea/modules/container"
|
2019-04-22 16:40:51 -04:00
|
|
|
"code.gitea.io/gitea/modules/log"
|
2020-01-17 02:34:37 -05:00
|
|
|
"code.gitea.io/gitea/modules/setting"
|
2018-11-10 14:45:32 -05:00
|
|
|
)
|
|
|
|
|
2021-11-09 14:57:58 -05:00
|
|
|
// Type is Unit's Type
|
|
|
|
type Type int
|
2017-02-04 10:53:46 -05:00
|
|
|
|
|
|
|
// Enumerate all the unit types
|
|
|
|
const (
|
2022-01-04 22:37:00 -05:00
|
|
|
TypeInvalid Type = iota // 0 invalid
|
|
|
|
TypeCode // 1 code
|
|
|
|
TypeIssues // 2 issues
|
|
|
|
TypePullRequests // 3 PRs
|
|
|
|
TypeReleases // 4 Releases
|
|
|
|
TypeWiki // 5 Wiki
|
|
|
|
TypeExternalWiki // 6 ExternalWiki
|
|
|
|
TypeExternalTracker // 7 ExternalTracker
|
2024-05-27 04:59:54 -04:00
|
|
|
TypeProjects // 8 Projects
|
2022-05-08 11:51:50 -04:00
|
|
|
TypePackages // 9 Packages
|
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>
2023-01-30 20:45:19 -05:00
|
|
|
TypeActions // 10 Actions
|
2017-02-04 10:53:46 -05:00
|
|
|
)
|
|
|
|
|
2019-04-25 05:00:34 -04:00
|
|
|
// Value returns integer value for unit type
|
2021-11-09 14:57:58 -05:00
|
|
|
func (u Type) Value() int {
|
2019-04-25 05:00:34 -04:00
|
|
|
return int(u)
|
|
|
|
}
|
|
|
|
|
2021-11-09 14:57:58 -05:00
|
|
|
func (u Type) String() string {
|
2019-04-22 16:40:51 -04:00
|
|
|
switch u {
|
2021-11-09 14:57:58 -05:00
|
|
|
case TypeCode:
|
|
|
|
return "TypeCode"
|
|
|
|
case TypeIssues:
|
|
|
|
return "TypeIssues"
|
|
|
|
case TypePullRequests:
|
|
|
|
return "TypePullRequests"
|
|
|
|
case TypeReleases:
|
|
|
|
return "TypeReleases"
|
|
|
|
case TypeWiki:
|
|
|
|
return "TypeWiki"
|
|
|
|
case TypeExternalWiki:
|
|
|
|
return "TypeExternalWiki"
|
|
|
|
case TypeExternalTracker:
|
|
|
|
return "TypeExternalTracker"
|
|
|
|
case TypeProjects:
|
|
|
|
return "TypeProjects"
|
2022-05-08 11:51:50 -04:00
|
|
|
case TypePackages:
|
|
|
|
return "TypePackages"
|
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>
2023-01-30 20:45:19 -05:00
|
|
|
case TypeActions:
|
|
|
|
return "TypeActions"
|
2019-04-22 16:40:51 -04:00
|
|
|
}
|
2021-11-09 14:57:58 -05:00
|
|
|
return fmt.Sprintf("Unknown Type %d", u)
|
2019-04-22 16:40:51 -04:00
|
|
|
}
|
|
|
|
|
Rewrite logger system (#24726)
## ⚠️ Breaking
The `log.<mode>.<logger>` style config has been dropped. If you used it,
please check the new config manual & app.example.ini to make your
instance output logs as expected.
Although many legacy options still work, it's encouraged to upgrade to
the new options.
The SMTP logger is deleted because SMTP is not suitable to collect logs.
If you have manually configured Gitea log options, please confirm the
logger system works as expected after upgrading.
## Description
Close #12082 and maybe more log-related issues, resolve some related
FIXMEs in old code (which seems unfixable before)
Just like rewriting queue #24505 : make code maintainable, clear legacy
bugs, and add the ability to support more writers (eg: JSON, structured
log)
There is a new document (with examples): `logging-config.en-us.md`
This PR is safer than the queue rewriting, because it's just for
logging, it won't break other logic.
## The old problems
The logging system is quite old and difficult to maintain:
* Unclear concepts: Logger, NamedLogger, MultiChannelledLogger,
SubLogger, EventLogger, WriterLogger etc
* Some code is diffuclt to konw whether it is right:
`log.DelNamedLogger("console")` vs `log.DelNamedLogger(log.DEFAULT)` vs
`log.DelLogger("console")`
* The old system heavily depends on ini config system, it's difficult to
create new logger for different purpose, and it's very fragile.
* The "color" trick is difficult to use and read, many colors are
unnecessary, and in the future structured log could help
* It's difficult to add other log formats, eg: JSON format
* The log outputer doesn't have full control of its goroutine, it's
difficult to make outputer have advanced behaviors
* The logs could be lost in some cases: eg: no Fatal error when using
CLI.
* Config options are passed by JSON, which is quite fragile.
* INI package makes the KEY in `[log]` section visible in `[log.sub1]`
and `[log.sub1.subA]`, this behavior is quite fragile and would cause
more unclear problems, and there is no strong requirement to support
`log.<mode>.<logger>` syntax.
## The new design
See `logger.go` for documents.
## Screenshot
<details>
![image](https://github.com/go-gitea/gitea/assets/2114189/4462d713-ba39-41f5-bb08-de912e67e1ff)
![image](https://github.com/go-gitea/gitea/assets/2114189/b188035e-f691-428b-8b2d-ff7b2199b2f9)
![image](https://github.com/go-gitea/gitea/assets/2114189/132e9745-1c3b-4e00-9e0d-15eaea495dee)
</details>
## TODO
* [x] add some new tests
* [x] fix some tests
* [x] test some sub-commands (manually ....)
---------
Co-authored-by: Jason Song <i@wolfogre.com>
Co-authored-by: delvh <dev.lh@web.de>
Co-authored-by: Giteabot <teabot@gitea.io>
2023-05-21 18:35:11 -04:00
|
|
|
func (u Type) LogString() string {
|
|
|
|
return fmt.Sprintf("<UnitType:%d:%s>", u, u.String())
|
2019-04-22 16:40:51 -04:00
|
|
|
}
|
|
|
|
|
2017-05-18 10:54:24 -04:00
|
|
|
var (
|
2019-05-30 11:09:05 -04:00
|
|
|
// AllRepoUnitTypes contains all the unit types
|
2021-11-09 14:57:58 -05:00
|
|
|
AllRepoUnitTypes = []Type{
|
|
|
|
TypeCode,
|
|
|
|
TypeIssues,
|
|
|
|
TypePullRequests,
|
|
|
|
TypeReleases,
|
|
|
|
TypeWiki,
|
|
|
|
TypeExternalWiki,
|
|
|
|
TypeExternalTracker,
|
|
|
|
TypeProjects,
|
2022-05-08 11:51:50 -04:00
|
|
|
TypePackages,
|
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>
2023-01-30 20:45:19 -05:00
|
|
|
TypeActions,
|
2017-05-18 10:54:24 -04:00
|
|
|
}
|
|
|
|
|
2019-05-30 11:09:05 -04:00
|
|
|
// DefaultRepoUnits contains the default unit types
|
2021-11-09 14:57:58 -05:00
|
|
|
DefaultRepoUnits = []Type{
|
|
|
|
TypeCode,
|
|
|
|
TypeIssues,
|
|
|
|
TypePullRequests,
|
|
|
|
TypeReleases,
|
|
|
|
TypeWiki,
|
|
|
|
TypeProjects,
|
2022-05-08 11:51:50 -04:00
|
|
|
TypePackages,
|
2023-10-10 10:45:31 -04:00
|
|
|
TypeActions,
|
2017-05-18 10:54:24 -04:00
|
|
|
}
|
|
|
|
|
2023-02-04 01:48:38 -05:00
|
|
|
// ForkRepoUnits contains the default unit types for forks
|
|
|
|
DefaultForkRepoUnits = []Type{
|
|
|
|
TypeCode,
|
|
|
|
TypePullRequests,
|
|
|
|
}
|
|
|
|
|
2020-01-17 02:34:37 -05:00
|
|
|
// NotAllowedDefaultRepoUnits contains units that can't be default
|
2021-11-09 14:57:58 -05:00
|
|
|
NotAllowedDefaultRepoUnits = []Type{
|
|
|
|
TypeExternalWiki,
|
|
|
|
TypeExternalTracker,
|
2020-01-17 02:34:37 -05:00
|
|
|
}
|
|
|
|
|
2024-05-20 00:35:38 -04:00
|
|
|
disabledRepoUnitsAtomic atomic.Pointer[[]Type] // the units that have been globally disabled
|
2024-01-23 04:57:49 -05:00
|
|
|
|
|
|
|
// AllowedRepoUnitGroups contains the units that have been globally enabled,
|
|
|
|
// with mutually exclusive units grouped together.
|
|
|
|
AllowedRepoUnitGroups = [][]Type{}
|
2017-05-18 10:54:24 -04:00
|
|
|
)
|
|
|
|
|
2024-05-20 00:35:38 -04:00
|
|
|
// DisabledRepoUnitsGet returns the globally disabled units, it is a quick patch to fix data-race during testing.
|
|
|
|
// Because the queue worker might read when a test is mocking the value. FIXME: refactor to a clear solution later.
|
|
|
|
func DisabledRepoUnitsGet() []Type {
|
|
|
|
v := disabledRepoUnitsAtomic.Load()
|
|
|
|
if v == nil {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
return *v
|
|
|
|
}
|
|
|
|
|
|
|
|
func DisabledRepoUnitsSet(v []Type) {
|
|
|
|
disabledRepoUnitsAtomic.Store(&v)
|
|
|
|
}
|
|
|
|
|
2023-02-04 01:48:38 -05:00
|
|
|
// Get valid set of default repository units from settings
|
|
|
|
func validateDefaultRepoUnits(defaultUnits, settingDefaultUnits []Type) []Type {
|
|
|
|
units := defaultUnits
|
|
|
|
|
|
|
|
// Use setting if not empty
|
|
|
|
if len(settingDefaultUnits) > 0 {
|
2023-05-06 05:39:06 -04:00
|
|
|
units = make([]Type, 0, len(settingDefaultUnits))
|
2023-02-04 01:48:38 -05:00
|
|
|
for _, settingUnit := range settingDefaultUnits {
|
|
|
|
if !settingUnit.CanBeDefault() {
|
|
|
|
log.Warn("Not allowed as default unit: %s", settingUnit.String())
|
2020-01-17 02:34:37 -05:00
|
|
|
continue
|
|
|
|
}
|
2023-05-06 05:39:06 -04:00
|
|
|
units = append(units, settingUnit)
|
2020-01-17 02:34:37 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-02-04 01:48:38 -05:00
|
|
|
// Remove disabled units
|
2024-05-20 00:35:38 -04:00
|
|
|
for _, disabledUnit := range DisabledRepoUnitsGet() {
|
2023-02-04 01:48:38 -05:00
|
|
|
for i, unit := range units {
|
|
|
|
if unit == disabledUnit {
|
|
|
|
units = append(units[:i], units[i+1:]...)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return units
|
|
|
|
}
|
|
|
|
|
|
|
|
// LoadUnitConfig load units from settings
|
2023-05-06 05:39:06 -04:00
|
|
|
func LoadUnitConfig() error {
|
2024-05-20 00:35:38 -04:00
|
|
|
disabledRepoUnits, invalidKeys := FindUnitTypes(setting.Repository.DisabledRepoUnits...)
|
2023-04-03 04:42:38 -04:00
|
|
|
if len(invalidKeys) > 0 {
|
|
|
|
log.Warn("Invalid keys in disabled repo units: %s", strings.Join(invalidKeys, ", "))
|
|
|
|
}
|
2024-05-20 00:35:38 -04:00
|
|
|
DisabledRepoUnitsSet(disabledRepoUnits)
|
2023-02-04 01:48:38 -05:00
|
|
|
|
2023-04-03 04:42:38 -04:00
|
|
|
setDefaultRepoUnits, invalidKeys := FindUnitTypes(setting.Repository.DefaultRepoUnits...)
|
|
|
|
if len(invalidKeys) > 0 {
|
|
|
|
log.Warn("Invalid keys in default repo units: %s", strings.Join(invalidKeys, ", "))
|
|
|
|
}
|
2023-02-04 01:48:38 -05:00
|
|
|
DefaultRepoUnits = validateDefaultRepoUnits(DefaultRepoUnits, setDefaultRepoUnits)
|
2023-05-06 05:39:06 -04:00
|
|
|
if len(DefaultRepoUnits) == 0 {
|
|
|
|
return errors.New("no default repository units found")
|
|
|
|
}
|
2023-04-03 04:42:38 -04:00
|
|
|
setDefaultForkRepoUnits, invalidKeys := FindUnitTypes(setting.Repository.DefaultForkRepoUnits...)
|
|
|
|
if len(invalidKeys) > 0 {
|
|
|
|
log.Warn("Invalid keys in default fork repo units: %s", strings.Join(invalidKeys, ", "))
|
|
|
|
}
|
2023-02-04 01:48:38 -05:00
|
|
|
DefaultForkRepoUnits = validateDefaultRepoUnits(DefaultForkRepoUnits, setDefaultForkRepoUnits)
|
2023-05-06 05:39:06 -04:00
|
|
|
if len(DefaultForkRepoUnits) == 0 {
|
|
|
|
return errors.New("no default fork repository units found")
|
|
|
|
}
|
2024-01-23 04:57:49 -05:00
|
|
|
|
|
|
|
// Collect the allowed repo unit groups. Mutually exclusive units are
|
|
|
|
// grouped together.
|
|
|
|
AllowedRepoUnitGroups = [][]Type{}
|
|
|
|
for _, unit := range []Type{
|
|
|
|
TypeCode,
|
|
|
|
TypePullRequests,
|
|
|
|
TypeProjects,
|
|
|
|
TypePackages,
|
|
|
|
TypeActions,
|
|
|
|
} {
|
|
|
|
// If unit is globally disabled, ignore it.
|
|
|
|
if unit.UnitGlobalDisabled() {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
|
|
|
// If it is allowed, add it to the group list.
|
|
|
|
AllowedRepoUnitGroups = append(AllowedRepoUnitGroups, []Type{unit})
|
|
|
|
}
|
|
|
|
|
|
|
|
addMutuallyExclusiveGroup := func(unit1, unit2 Type) {
|
|
|
|
var list []Type
|
|
|
|
|
|
|
|
if !unit1.UnitGlobalDisabled() {
|
|
|
|
list = append(list, unit1)
|
|
|
|
}
|
|
|
|
|
|
|
|
if !unit2.UnitGlobalDisabled() {
|
|
|
|
list = append(list, unit2)
|
|
|
|
}
|
|
|
|
|
|
|
|
if len(list) > 0 {
|
|
|
|
AllowedRepoUnitGroups = append(AllowedRepoUnitGroups, list)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
addMutuallyExclusiveGroup(TypeIssues, TypeExternalTracker)
|
|
|
|
addMutuallyExclusiveGroup(TypeWiki, TypeExternalWiki)
|
|
|
|
|
2023-05-06 05:39:06 -04:00
|
|
|
return nil
|
2020-01-17 02:34:37 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
// UnitGlobalDisabled checks if unit type is global disabled
|
2021-11-09 14:57:58 -05:00
|
|
|
func (u Type) UnitGlobalDisabled() bool {
|
2024-05-20 00:35:38 -04:00
|
|
|
for _, ud := range DisabledRepoUnitsGet() {
|
2020-01-17 02:34:37 -05:00
|
|
|
if u == ud {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
// CanBeDefault checks if the unit type can be a default repo unit
|
2021-11-09 14:57:58 -05:00
|
|
|
func (u *Type) CanBeDefault() bool {
|
2020-01-17 02:34:37 -05:00
|
|
|
for _, nadU := range NotAllowedDefaultRepoUnits {
|
|
|
|
if *u == nadU {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
2017-07-16 22:04:43 -04:00
|
|
|
// Unit is a section of one repository
|
2017-02-04 10:53:46 -05:00
|
|
|
type Unit struct {
|
2022-01-04 22:37:00 -05:00
|
|
|
Type Type
|
2024-09-22 15:21:54 -04:00
|
|
|
Name string
|
2022-01-04 22:37:00 -05:00
|
|
|
NameKey string
|
|
|
|
URI string
|
|
|
|
DescKey string
|
|
|
|
Idx int
|
|
|
|
MaxAccessMode perm.AccessMode // The max access mode of the unit. i.e. Read means this unit can only be read.
|
2017-02-04 10:53:46 -05:00
|
|
|
}
|
|
|
|
|
2017-10-01 09:50:56 -04:00
|
|
|
// IsLessThan compares order of two units
|
|
|
|
func (u Unit) IsLessThan(unit Unit) bool {
|
2021-11-09 14:57:58 -05:00
|
|
|
if (u.Type == TypeExternalTracker || u.Type == TypeExternalWiki) && unit.Type != TypeExternalTracker && unit.Type != TypeExternalWiki {
|
2017-10-01 09:50:56 -04:00
|
|
|
return false
|
|
|
|
}
|
|
|
|
return u.Idx < unit.Idx
|
|
|
|
}
|
|
|
|
|
2022-01-08 10:19:36 -05:00
|
|
|
// MaxPerm returns the max perms of this unit
|
|
|
|
func (u Unit) MaxPerm() perm.AccessMode {
|
|
|
|
if u.Type == TypeExternalTracker || u.Type == TypeExternalWiki {
|
|
|
|
return perm.AccessModeRead
|
|
|
|
}
|
|
|
|
return perm.AccessModeAdmin
|
|
|
|
}
|
|
|
|
|
2017-02-04 10:53:46 -05:00
|
|
|
// Enumerate all the units
|
|
|
|
var (
|
|
|
|
UnitCode = Unit{
|
2021-11-09 14:57:58 -05:00
|
|
|
TypeCode,
|
2024-09-22 15:21:54 -04:00
|
|
|
"code",
|
2017-02-04 10:53:46 -05:00
|
|
|
"repo.code",
|
|
|
|
"/",
|
2017-05-18 10:54:24 -04:00
|
|
|
"repo.code.desc",
|
2017-02-04 10:53:46 -05:00
|
|
|
0,
|
2022-01-04 22:37:00 -05:00
|
|
|
perm.AccessModeOwner,
|
2017-02-04 10:53:46 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
UnitIssues = Unit{
|
2021-11-09 14:57:58 -05:00
|
|
|
TypeIssues,
|
2024-09-22 15:21:54 -04:00
|
|
|
"issues",
|
2017-02-04 10:53:46 -05:00
|
|
|
"repo.issues",
|
|
|
|
"/issues",
|
2017-05-18 10:54:24 -04:00
|
|
|
"repo.issues.desc",
|
2017-02-04 10:53:46 -05:00
|
|
|
1,
|
2022-01-04 22:37:00 -05:00
|
|
|
perm.AccessModeOwner,
|
2017-02-04 10:53:46 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
UnitExternalTracker = Unit{
|
2021-11-09 14:57:58 -05:00
|
|
|
TypeExternalTracker,
|
2024-09-22 15:21:54 -04:00
|
|
|
"ext_issues",
|
2017-05-18 10:54:24 -04:00
|
|
|
"repo.ext_issues",
|
2017-02-04 10:53:46 -05:00
|
|
|
"/issues",
|
2017-05-18 10:54:24 -04:00
|
|
|
"repo.ext_issues.desc",
|
2017-02-04 10:53:46 -05:00
|
|
|
1,
|
2022-01-04 22:37:00 -05:00
|
|
|
perm.AccessModeRead,
|
2017-02-04 10:53:46 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
UnitPullRequests = Unit{
|
2021-11-09 14:57:58 -05:00
|
|
|
TypePullRequests,
|
2024-09-22 15:21:54 -04:00
|
|
|
"pulls",
|
2017-02-04 10:53:46 -05:00
|
|
|
"repo.pulls",
|
|
|
|
"/pulls",
|
2017-05-18 10:54:24 -04:00
|
|
|
"repo.pulls.desc",
|
2017-02-04 10:53:46 -05:00
|
|
|
2,
|
2022-01-04 22:37:00 -05:00
|
|
|
perm.AccessModeOwner,
|
2017-02-04 10:53:46 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
UnitReleases = Unit{
|
2021-11-09 14:57:58 -05:00
|
|
|
TypeReleases,
|
2024-09-22 15:21:54 -04:00
|
|
|
"releases",
|
2017-02-04 10:53:46 -05:00
|
|
|
"repo.releases",
|
|
|
|
"/releases",
|
2017-05-18 10:54:24 -04:00
|
|
|
"repo.releases.desc",
|
2017-07-16 22:04:43 -04:00
|
|
|
3,
|
2022-01-04 22:37:00 -05:00
|
|
|
perm.AccessModeOwner,
|
2017-02-04 10:53:46 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
UnitWiki = Unit{
|
2021-11-09 14:57:58 -05:00
|
|
|
TypeWiki,
|
2024-09-22 15:21:54 -04:00
|
|
|
"wiki",
|
2017-02-04 10:53:46 -05:00
|
|
|
"repo.wiki",
|
|
|
|
"/wiki",
|
2017-05-18 10:54:24 -04:00
|
|
|
"repo.wiki.desc",
|
2017-07-16 22:04:43 -04:00
|
|
|
4,
|
2022-01-04 22:37:00 -05:00
|
|
|
perm.AccessModeOwner,
|
2017-02-04 10:53:46 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
UnitExternalWiki = Unit{
|
2021-11-09 14:57:58 -05:00
|
|
|
TypeExternalWiki,
|
2024-09-22 15:21:54 -04:00
|
|
|
"ext_wiki",
|
2017-05-18 10:54:24 -04:00
|
|
|
"repo.ext_wiki",
|
2017-02-04 10:53:46 -05:00
|
|
|
"/wiki",
|
2017-05-18 10:54:24 -04:00
|
|
|
"repo.ext_wiki.desc",
|
2017-07-16 22:04:43 -04:00
|
|
|
4,
|
2022-01-04 22:37:00 -05:00
|
|
|
perm.AccessModeRead,
|
2017-02-04 10:53:46 -05:00
|
|
|
}
|
|
|
|
|
2020-08-16 23:07:38 -04:00
|
|
|
UnitProjects = Unit{
|
2021-11-09 14:57:58 -05:00
|
|
|
TypeProjects,
|
2024-09-22 15:21:54 -04:00
|
|
|
"projects",
|
2020-08-16 23:07:38 -04:00
|
|
|
"repo.projects",
|
|
|
|
"/projects",
|
|
|
|
"repo.projects.desc",
|
|
|
|
5,
|
2022-01-04 22:37:00 -05:00
|
|
|
perm.AccessModeOwner,
|
2020-08-16 23:07:38 -04:00
|
|
|
}
|
|
|
|
|
2022-05-08 11:51:50 -04:00
|
|
|
UnitPackages = Unit{
|
|
|
|
TypePackages,
|
2024-09-22 15:21:54 -04:00
|
|
|
"packages",
|
2022-05-08 11:51:50 -04:00
|
|
|
"repo.packages",
|
|
|
|
"/packages",
|
2022-05-18 21:59:28 -04:00
|
|
|
"packages.desc",
|
2022-05-08 11:51:50 -04:00
|
|
|
6,
|
|
|
|
perm.AccessModeRead,
|
|
|
|
}
|
|
|
|
|
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>
2023-01-30 20:45:19 -05:00
|
|
|
UnitActions = Unit{
|
|
|
|
TypeActions,
|
2024-09-22 15:21:54 -04:00
|
|
|
"actions",
|
2023-04-03 00:05:37 -04:00
|
|
|
"repo.actions",
|
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>
2023-01-30 20:45:19 -05:00
|
|
|
"/actions",
|
|
|
|
"actions.unit.desc",
|
|
|
|
7,
|
|
|
|
perm.AccessModeOwner,
|
|
|
|
}
|
|
|
|
|
2017-02-04 10:53:46 -05:00
|
|
|
// Units contains all the units
|
2021-11-09 14:57:58 -05:00
|
|
|
Units = map[Type]Unit{
|
|
|
|
TypeCode: UnitCode,
|
|
|
|
TypeIssues: UnitIssues,
|
|
|
|
TypeExternalTracker: UnitExternalTracker,
|
|
|
|
TypePullRequests: UnitPullRequests,
|
|
|
|
TypeReleases: UnitReleases,
|
|
|
|
TypeWiki: UnitWiki,
|
|
|
|
TypeExternalWiki: UnitExternalWiki,
|
|
|
|
TypeProjects: UnitProjects,
|
2022-05-08 11:51:50 -04:00
|
|
|
TypePackages: UnitPackages,
|
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>
2023-01-30 20:45:19 -05:00
|
|
|
TypeActions: UnitActions,
|
2017-02-04 10:53:46 -05:00
|
|
|
}
|
|
|
|
)
|
2018-11-10 14:45:32 -05:00
|
|
|
|
2023-04-03 04:42:38 -04:00
|
|
|
// FindUnitTypes give the unit key names and return valid unique units and invalid keys
|
|
|
|
func FindUnitTypes(nameKeys ...string) (res []Type, invalidKeys []string) {
|
2023-08-30 02:55:25 -04:00
|
|
|
m := make(container.Set[Type])
|
2018-11-10 14:45:32 -05:00
|
|
|
for _, key := range nameKeys {
|
2023-04-03 04:42:38 -04:00
|
|
|
t := TypeFromKey(key)
|
|
|
|
if t == TypeInvalid {
|
|
|
|
invalidKeys = append(invalidKeys, key)
|
2023-08-30 02:55:25 -04:00
|
|
|
} else if m.Add(t) {
|
2023-04-03 04:42:38 -04:00
|
|
|
res = append(res, t)
|
2022-01-04 22:37:00 -05:00
|
|
|
}
|
2018-11-10 14:45:32 -05:00
|
|
|
}
|
2023-04-03 04:42:38 -04:00
|
|
|
return res, invalidKeys
|
2018-11-10 14:45:32 -05:00
|
|
|
}
|
2022-01-04 22:37:00 -05:00
|
|
|
|
|
|
|
// TypeFromKey give the unit key name and return unit
|
|
|
|
func TypeFromKey(nameKey string) Type {
|
|
|
|
for t, u := range Units {
|
|
|
|
if strings.EqualFold(nameKey, u.NameKey) {
|
|
|
|
return t
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return TypeInvalid
|
|
|
|
}
|
|
|
|
|
|
|
|
// AllUnitKeyNames returns all unit key names
|
|
|
|
func AllUnitKeyNames() []string {
|
|
|
|
res := make([]string, 0, len(Units))
|
|
|
|
for _, u := range Units {
|
|
|
|
res = append(res, u.NameKey)
|
|
|
|
}
|
|
|
|
return res
|
|
|
|
}
|
|
|
|
|
|
|
|
// MinUnitAccessMode returns the minial permission of the permission map
|
|
|
|
func MinUnitAccessMode(unitsMap map[Type]perm.AccessMode) perm.AccessMode {
|
|
|
|
res := perm.AccessModeNone
|
2022-02-08 16:16:17 -05:00
|
|
|
for t, mode := range unitsMap {
|
|
|
|
// Don't allow `TypeExternal{Tracker,Wiki}` to influence this as they can only be set to READ perms.
|
|
|
|
if t == TypeExternalTracker || t == TypeExternalWiki {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
2022-01-04 22:37:00 -05:00
|
|
|
// get the minial permission great than AccessModeNone except all are AccessModeNone
|
|
|
|
if mode > perm.AccessModeNone && (res == perm.AccessModeNone || mode < res) {
|
|
|
|
res = mode
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return res
|
|
|
|
}
|