From e1032442e442b82ab62283e0ef85f312c08cd4fb Mon Sep 17 00:00:00 2001 From: Jason Song Date: Thu, 29 Jun 2023 11:45:38 +0800 Subject: [PATCH 1/8] fix: DEFAULT_ACTIONS_URL supports gitea or self only --- modules/setting/actions.go | 38 +++++++++++++++- modules/setting/actions_test.go | 69 +++++++++++++++++++++++++++++ routers/api/actions/runner/utils.go | 2 +- 3 files changed, 106 insertions(+), 3 deletions(-) diff --git a/modules/setting/actions.go b/modules/setting/actions.go index 1c8075cd6cc55..12f9e822bf27d 100644 --- a/modules/setting/actions.go +++ b/modules/setting/actions.go @@ -5,6 +5,9 @@ package setting import ( "fmt" + "strings" + + "code.gitea.io/gitea/modules/log" ) // Actions settings @@ -13,13 +16,36 @@ var ( LogStorage *Storage // how the created logs should be stored ArtifactStorage *Storage // how the created artifacts should be stored Enabled bool - DefaultActionsURL string `ini:"DEFAULT_ACTIONS_URL"` + DefaultActionsURL defaultActionsURL `ini:"DEFAULT_ACTIONS_URL"` }{ Enabled: false, - DefaultActionsURL: "https://gitea.com", + DefaultActionsURL: defaultActionsURLGitHub, } ) +type defaultActionsURL string + +func (url defaultActionsURL) URL() string { + switch url { + case defaultActionsURLGitHub: + return "https://github.com" + case defaultActionsURLSelf: + return strings.TrimSuffix(AppURL, "/") + default: + // This should never happen, but just in case, use GitHub as fallback + return "https://github.com" + } +} + +const ( + defaultActionsURLGitHub = "github" // https://github.com + defaultActionsURLSelf = "self" // the root URL of the self-hosted Gitea instance + // DefaultActionsURL only supports GitHub and the self-hosted Gitea. + // It's intentionally not supported more, so please be cautious before adding more like "gitea" or "gitlab". + // If you get some trouble with `uses: username/action_name@version` in your workflow, + // please consider to use `uses: https://the_url_you_want_to_use/username/action_name@version` instead. +) + func loadActionsFrom(rootCfg ConfigProvider) error { sec := rootCfg.Section("actions") err := sec.MapTo(&Actions) @@ -27,6 +53,14 @@ func loadActionsFrom(rootCfg ConfigProvider) error { return fmt.Errorf("failed to map Actions settings: %v", err) } + if url := string(Actions.DefaultActionsURL); url != defaultActionsURLGitHub && url != defaultActionsURLSelf { + if strings.HasPrefix(url, "https://") || strings.HasPrefix(url, "http://") { + log.Error("[actions] DEFAULT_ACTIONS_URL does not support %q as custom URL any longer, fallback to https://github.com", url) + } else { + return fmt.Errorf("unsupported [actions] DEFAULT_ACTIONS_URL: %q", url) + } + } + // don't support to read configuration from [actions] Actions.LogStorage, err = getStorage(rootCfg, "actions_log", "", nil) if err != nil { diff --git a/modules/setting/actions_test.go b/modules/setting/actions_test.go index a1cc8fe333b0f..3fbe1cdbe05d7 100644 --- a/modules/setting/actions_test.go +++ b/modules/setting/actions_test.go @@ -8,6 +8,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func Test_getStorageInheritNameSectionTypeForActions(t *testing.T) { @@ -95,3 +96,71 @@ STORAGE_TYPE = minio assert.EqualValues(t, "local", Actions.ArtifactStorage.Type) assert.EqualValues(t, "actions_artifacts", filepath.Base(Actions.ArtifactStorage.Path)) } + +func Test_getDefaultActionsURLForActions(t *testing.T) { + tests := []struct { + name string + iniStr string + wantErr assert.ErrorAssertionFunc + wantURL string + }{ + { + name: "default", + iniStr: ` +[actions] +`, + wantErr: assert.NoError, + wantURL: "https://github.com", + }, + { + name: "github", + iniStr: ` +[actions] +DEFAULT_ACTIONS_URL = github +`, + wantErr: assert.NoError, + wantURL: "https://github.com", + }, + { + name: "self", + iniStr: ` +[server] +ROOT_URL = http://localhost:3000 +[actions] +DEFAULT_ACTIONS_URL = self +`, + wantErr: assert.NoError, + wantURL: "http://localhost:3000", + }, + { + name: "custom url", + iniStr: ` +[actions] +DEFAULT_ACTIONS_URL = https://gitea.com +`, + wantErr: assert.NoError, + wantURL: "https://github.com", + }, + { + name: "invalid", + iniStr: ` +[actions] +DEFAULT_ACTIONS_URL = gitea +`, + wantErr: assert.Error, + wantURL: "https://github.com", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + cfg, err := NewConfigProviderFromData(tt.iniStr) + require.NoError(t, err) + loadServerFrom(cfg) + if !tt.wantErr(t, loadActionsFrom(cfg)) { + return + } + assert.EqualValues(t, tt.wantURL, Actions.DefaultActionsURL.URL()) + }) + } +} diff --git a/routers/api/actions/runner/utils.go b/routers/api/actions/runner/utils.go index ab70f622b39b7..3370355f15c75 100644 --- a/routers/api/actions/runner/utils.go +++ b/routers/api/actions/runner/utils.go @@ -174,7 +174,7 @@ func generateTaskContext(t *actions_model.ActionTask) *structpb.Struct { "workspace": "", // string, The default working directory on the runner for steps, and the default location of your repository when using the checkout action. // additional contexts - "gitea_default_actions_url": setting.Actions.DefaultActionsURL, + "gitea_default_actions_url": setting.Actions.DefaultActionsURL.URL(), }) if err != nil { log.Error("structpb.NewStruct failed: %v", err) From 4a26ade88a927fa226f08430d43162181367452a Mon Sep 17 00:00:00 2001 From: Jason Song Date: Thu, 29 Jun 2023 11:52:21 +0800 Subject: [PATCH 2/8] fix: handle urls --- modules/setting/actions.go | 11 ++++++++--- modules/setting/actions_test.go | 9 +++++++++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/modules/setting/actions.go b/modules/setting/actions.go index 12f9e822bf27d..a13330dcd18a3 100644 --- a/modules/setting/actions.go +++ b/modules/setting/actions.go @@ -53,11 +53,16 @@ func loadActionsFrom(rootCfg ConfigProvider) error { return fmt.Errorf("failed to map Actions settings: %v", err) } - if url := string(Actions.DefaultActionsURL); url != defaultActionsURLGitHub && url != defaultActionsURLSelf { + if urls := string(Actions.DefaultActionsURL); urls != defaultActionsURLGitHub && urls != defaultActionsURLSelf { + url := strings.Split(urls, ",")[0] if strings.HasPrefix(url, "https://") || strings.HasPrefix(url, "http://") { - log.Error("[actions] DEFAULT_ACTIONS_URL does not support %q as custom URL any longer, fallback to https://github.com", url) + log.Error("[actions] DEFAULT_ACTIONS_URL does not support %q as custom URL any longer, fallback to %q", + urls, + defaultActionsURLGitHub, + ) + Actions.DefaultActionsURL = defaultActionsURLGitHub } else { - return fmt.Errorf("unsupported [actions] DEFAULT_ACTIONS_URL: %q", url) + return fmt.Errorf("unsupported [actions] DEFAULT_ACTIONS_URL: %q", urls) } } diff --git a/modules/setting/actions_test.go b/modules/setting/actions_test.go index 3fbe1cdbe05d7..8dd2386acf836 100644 --- a/modules/setting/actions_test.go +++ b/modules/setting/actions_test.go @@ -137,6 +137,15 @@ DEFAULT_ACTIONS_URL = self iniStr: ` [actions] DEFAULT_ACTIONS_URL = https://gitea.com +`, + wantErr: assert.NoError, + wantURL: "https://github.com", + }, + { + name: "custom urls", + iniStr: ` +[actions] +DEFAULT_ACTIONS_URL = https://gitea.com,https://github.com `, wantErr: assert.NoError, wantURL: "https://github.com", From 9f8919dfd3f8c27ac84310087e761c3b70ee16c4 Mon Sep 17 00:00:00 2001 From: Jason Song Date: Thu, 29 Jun 2023 12:21:07 +0800 Subject: [PATCH 3/8] docs: update --- .../config-cheat-sheet.en-us.md | 37 ++++--------------- 1 file changed, 8 insertions(+), 29 deletions(-) diff --git a/docs/content/doc/administration/config-cheat-sheet.en-us.md b/docs/content/doc/administration/config-cheat-sheet.en-us.md index 2b9511034994b..2c2dd9df3385c 100644 --- a/docs/content/doc/administration/config-cheat-sheet.en-us.md +++ b/docs/content/doc/administration/config-cheat-sheet.en-us.md @@ -1376,39 +1376,18 @@ PROXY_HOSTS = *.github.com ## Actions (`actions`) - `ENABLED`: **false**: Enable/Disable actions capabilities -- `DEFAULT_ACTIONS_URL`: **https://gitea.com**: Default address to get action plugins, e.g. the default value means downloading from "" for "uses: actions/checkout@v3" +- `DEFAULT_ACTIONS_URL`: **github**: Default platform to get action plugins, `github` for `https://github.com`, `self` for the current Gitea instance. - `STORAGE_TYPE`: **local**: Storage type for actions logs, `local` for local disk or `minio` for s3 compatible object storage service, default is `local` or other name defined with `[storage.xxx]` - `MINIO_BASE_PATH`: **actions_log/**: Minio base path on the bucket only available when STORAGE_TYPE is `minio` -`DEFAULT_ACTIONS_URL` indicates where should we find the relative path action plugin. i.e. when use an action in a workflow file like - -```yaml -name: versions -on: - push: - branches: - - main - - releases/* -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 -``` - -Now we need to know how to get actions/checkout, this configuration is the default git server to get it. That means we will get the repository via git clone ${DEFAULT_ACTIONS_URL}/actions/checkout and fetch tag v3. - -To help people who don't want to mirror these actions in their git instances, the default value is https://gitea.com -To help people run actions totally in their network, they can change the value and copy all necessary action repositories into their git server. - -Of course we should support the form in future PRs like - -```yaml -steps: - - uses: gitea.com/actions/checkout@v3 -``` +`DEFAULT_ACTIONS_URL` indicates where the Gitea Actions runners should find the actions with relative path. +For example, `uses: actions/checkout@v3` means `https://github.com/actions/checkout@v3` since the value of `DEFAULT_ACTIONS_URL` is `github`. +And it can be changed to `self` to make it `root_url_of_your_gitea/actions/checkout@v3`. -although Github don't support this form. +In earlier versions (<= 1.19), `DEFAULT_ACTIONS_URL` cound be set to any custom URLs like `https://gitea.com` or `http://your-git-server,https://gitea.com`, and the default value was `https://gitea.com`. +However, later updates removed those options, and now the only options are `github` and `self`, with the default value being `github`. +However, if you want to use actions from other git server, you can use a complete URL in `uses` field, it's supported by Gitea (but not GitHub). +Like `uses: https://gitea.com/actions/checkout@v3` or `uses: http://your-git-server/actions/checkout@v3`. ## Other (`other`) From f6ddd7528a9e75e6ade686f9501c2619e6e66571 Mon Sep 17 00:00:00 2001 From: Jason Song Date: Thu, 29 Jun 2023 14:56:01 +0800 Subject: [PATCH 4/8] docs: warning for `self` --- docs/content/doc/administration/config-cheat-sheet.en-us.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/content/doc/administration/config-cheat-sheet.en-us.md b/docs/content/doc/administration/config-cheat-sheet.en-us.md index 2c2dd9df3385c..9dea8a3b6e751 100644 --- a/docs/content/doc/administration/config-cheat-sheet.en-us.md +++ b/docs/content/doc/administration/config-cheat-sheet.en-us.md @@ -1384,6 +1384,9 @@ PROXY_HOSTS = *.github.com For example, `uses: actions/checkout@v3` means `https://github.com/actions/checkout@v3` since the value of `DEFAULT_ACTIONS_URL` is `github`. And it can be changed to `self` to make it `root_url_of_your_gitea/actions/checkout@v3`. +Please note that `self` is not recommended for most cases, since it could make the names globally ambiguous. +And you need mirror all the actions you need to your Gitea instance, so use `self` only if you understand what you are doing. + In earlier versions (<= 1.19), `DEFAULT_ACTIONS_URL` cound be set to any custom URLs like `https://gitea.com` or `http://your-git-server,https://gitea.com`, and the default value was `https://gitea.com`. However, later updates removed those options, and now the only options are `github` and `self`, with the default value being `github`. However, if you want to use actions from other git server, you can use a complete URL in `uses` field, it's supported by Gitea (but not GitHub). From fb0629c7190edf7b5931b6e2394c253c88c73ef0 Mon Sep 17 00:00:00 2001 From: Jason Song Date: Thu, 29 Jun 2023 16:27:33 +0800 Subject: [PATCH 5/8] docs: update app.example.ini --- custom/conf/app.example.ini | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/custom/conf/app.example.ini b/custom/conf/app.example.ini index 57adce83c04b1..b2b6739f3808a 100644 --- a/custom/conf/app.example.ini +++ b/custom/conf/app.example.ini @@ -2541,8 +2541,8 @@ LEVEL = Info ;; Enable/Disable actions capabilities ;ENABLED = false ;; -;; Default address to get action plugins, e.g. the default value means downloading from "https://gitea.com/actions/checkout" for "uses: actions/checkout@v3" -;DEFAULT_ACTIONS_URL = https://gitea.com +;; Default platform to get action plugins, `github` for `https://github.com`, `self` for the current Gitea instance. +;DEFAULT_ACTIONS_URL = github ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; From a4378d8021f1553a94deb49d11900747b535194e Mon Sep 17 00:00:00 2001 From: Jason Song Date: Thu, 29 Jun 2023 16:44:39 +0800 Subject: [PATCH 6/8] test: fix case --- modules/setting/actions_test.go | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/modules/setting/actions_test.go b/modules/setting/actions_test.go index 8dd2386acf836..8a1f6ae8021f9 100644 --- a/modules/setting/actions_test.go +++ b/modules/setting/actions_test.go @@ -98,6 +98,15 @@ STORAGE_TYPE = minio } func Test_getDefaultActionsURLForActions(t *testing.T) { + oldActions := Actions + oldAppUrl := AppURL + defer func() { + Actions = oldActions + AppURL = oldAppUrl + }() + + AppURL = "http://test_get_default_actions_url_for_actions:3000/" + tests := []struct { name string iniStr string @@ -124,13 +133,11 @@ DEFAULT_ACTIONS_URL = github { name: "self", iniStr: ` -[server] -ROOT_URL = http://localhost:3000 [actions] DEFAULT_ACTIONS_URL = self `, wantErr: assert.NoError, - wantURL: "http://localhost:3000", + wantURL: "http://test_get_default_actions_url_for_actions:3000", }, { name: "custom url", @@ -165,7 +172,6 @@ DEFAULT_ACTIONS_URL = gitea t.Run(tt.name, func(t *testing.T) { cfg, err := NewConfigProviderFromData(tt.iniStr) require.NoError(t, err) - loadServerFrom(cfg) if !tt.wantErr(t, loadActionsFrom(cfg)) { return } From 8c9d784e643b2f6d58f5f8d4428e57b69b7d52a7 Mon Sep 17 00:00:00 2001 From: Jason Song Date: Thu, 29 Jun 2023 17:19:08 +0800 Subject: [PATCH 7/8] chore: lint --- modules/setting/actions_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/setting/actions_test.go b/modules/setting/actions_test.go index 8a1f6ae8021f9..3645a3f5dadc5 100644 --- a/modules/setting/actions_test.go +++ b/modules/setting/actions_test.go @@ -99,10 +99,10 @@ STORAGE_TYPE = minio func Test_getDefaultActionsURLForActions(t *testing.T) { oldActions := Actions - oldAppUrl := AppURL + oldAppURL := AppURL defer func() { Actions = oldActions - AppURL = oldAppUrl + AppURL = oldAppURL }() AppURL = "http://test_get_default_actions_url_for_actions:3000/" From 6317cf54101dbd60f0f82ab18dc0898abe081bb2 Mon Sep 17 00:00:00 2001 From: Jason Song Date: Thu, 29 Jun 2023 17:25:56 +0800 Subject: [PATCH 8/8] docs: fix tone --- docs/content/doc/administration/config-cheat-sheet.en-us.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/content/doc/administration/config-cheat-sheet.en-us.md b/docs/content/doc/administration/config-cheat-sheet.en-us.md index 9dea8a3b6e751..aefa351ecdc4f 100644 --- a/docs/content/doc/administration/config-cheat-sheet.en-us.md +++ b/docs/content/doc/administration/config-cheat-sheet.en-us.md @@ -1384,8 +1384,9 @@ PROXY_HOSTS = *.github.com For example, `uses: actions/checkout@v3` means `https://github.com/actions/checkout@v3` since the value of `DEFAULT_ACTIONS_URL` is `github`. And it can be changed to `self` to make it `root_url_of_your_gitea/actions/checkout@v3`. -Please note that `self` is not recommended for most cases, since it could make the names globally ambiguous. -And you need mirror all the actions you need to your Gitea instance, so use `self` only if you understand what you are doing. +Please note that using `self` is not recommended for most cases, as it could make names globally ambiguous. +Additionally, it requires you to mirror all the actions you need to your Gitea instance, which may not be worth it. +Therefore, please use `self` only if you understand what you are doing. In earlier versions (<= 1.19), `DEFAULT_ACTIONS_URL` cound be set to any custom URLs like `https://gitea.com` or `http://your-git-server,https://gitea.com`, and the default value was `https://gitea.com`. However, later updates removed those options, and now the only options are `github` and `self`, with the default value being `github`.