From 6dfb2dd8460ef72c9cb9c776792132197cefe321 Mon Sep 17 00:00:00 2001 From: justusbunsi <61625851+justusbunsi@users.noreply.github.com> Date: Tue, 22 Jun 2021 11:27:53 +0200 Subject: [PATCH] Properly map projects from SQ and Gitea in config Signed-off-by: Steven Kriegler <61625851+justusbunsi@users.noreply.github.com> --- config/config.example.yaml | 27 +++++--------- internal/settings/settings.go | 16 ++++++-- internal/settings/settings_test.go | 59 ++++++++++++++++-------------- 3 files changed, 53 insertions(+), 49 deletions(-) diff --git a/config/config.example.yaml b/config/config.example.yaml index 76e4c2c..5c845c6 100644 --- a/config/config.example.yaml +++ b/config/config.example.yaml @@ -19,18 +19,6 @@ gitea: # # or path to file containing the plain text secret # secretFile: /path/to/gitea/webhook/secret - # List of repository the used Gitea account has access to and shall be handled by the bot. Other repository webhooks - # will be ignored. - # A repository specification contains the owner name and the repository name itself. The owner can be the name of a - # real account or an organization in which the repository is located. - # If empty array given, don't filter requests for repositories and proceed them all. - repositories: [] - # - owner: justusbunsi - # name: example-repo - # - owner: my-organization - # name: example-repo - - # SonarQube related configuration. Necessary for requesting data from the API and processing the webhook. sonarqube: # API endpoint of your SonarQube instance. @@ -53,8 +41,13 @@ sonarqube: # # or path to file containing the plain text secret # secretFile: /path/to/sonarqube/webhook/secret - # List of project keys from inside SonarQube that should be handled. Webhooks containing other projects will be ignored. - # If empty array given, don't filter requests for repositories and proceed them all. - projects: [] - # - project-1 - # - project-2 +# List of project mappings to take care of. Webhooks for other projects will be ignored. +# At least one must be configured. Otherwise all webhooks (no matter which source) because the bot cannot map on its own. +projects: + - sonarqube: + key: project-1 + # A repository specification contains the owner name and the repository name itself. The owner can be the name of a + # real account or an organization in which the repository is located. + gitea: + owner: justusbunsi + name: example-repo diff --git a/internal/settings/settings.go b/internal/settings/settings.go index 070668f..943251d 100644 --- a/internal/settings/settings.go +++ b/internal/settings/settings.go @@ -27,19 +27,25 @@ type GiteaConfig struct { Url string Token Token Webhook Webhook - Repositories []GiteaRepository } type SonarQubeConfig struct { Url string Token Token Webhook Webhook - Projects []string +} + +type Project struct { + SonarQube struct { + Key string + } `mapstructure:"sonarqube"` + Gitea GiteaRepository } var ( Gitea GiteaConfig SonarQube SonarQubeConfig + Projects []Project ) func init() { @@ -59,14 +65,14 @@ func ApplyConfigDefaults() { viper.SetDefault("gitea.token.file", "") viper.SetDefault("gitea.webhook.secret", "") viper.SetDefault("gitea.webhook.secretFile", "") - viper.SetDefault("gitea.repositories", []GiteaRepository{}) viper.SetDefault("sonarqube.url", "") viper.SetDefault("sonarqube.token.value", "") viper.SetDefault("sonarqube.token.file", "") viper.SetDefault("sonarqube.webhook.secret", "") viper.SetDefault("sonarqube.webhook.secretFile", "") - viper.SetDefault("sonarqube.projects", []string{}) + + viper.SetDefault("projects", []Project{}) } func ReadSecretFile(file string, defaultValue string) (string) { @@ -93,6 +99,7 @@ func Load(configPath string) { var fullConfig struct { Gitea GiteaConfig SonarQube SonarQubeConfig `mapstructure:"sonarqube"` + Projects []Project } err = viper.Unmarshal(&fullConfig) @@ -102,6 +109,7 @@ func Load(configPath string) { Gitea = fullConfig.Gitea SonarQube = fullConfig.SonarQube + Projects = fullConfig.Projects Gitea.Webhook.Secret = ReadSecretFile(Gitea.Webhook.SecretFile, Gitea.Webhook.Secret) Gitea.Token.Value = ReadSecretFile(Gitea.Token.File, Gitea.Token.Value) diff --git a/internal/settings/settings_test.go b/internal/settings/settings_test.go index 6e36a2f..a9e475b 100644 --- a/internal/settings/settings_test.go +++ b/internal/settings/settings_test.go @@ -9,23 +9,25 @@ import ( "github.com/stretchr/testify/assert" ) -var defaultConfigInlineSecrets []byte = []byte( +var defaultConfig []byte = []byte( `gitea: url: https://example.com/gitea token: value: d0fcdeb5eaa99c506831f9eb4e63fc7cc484a565 webhook: secret: haxxor-gitea-secret - repositories: - - owner: some-owner - name: a-repository-name sonarqube: url: https://example.com/sonarqube token: value: a09eb5785b25bb2cbacf48808a677a0709f02d8e webhook: secret: haxxor-sonarqube-secret - projects: [] +projects: + - sonarqube: + key: gitea-sonarqube-pr-bot + gitea: + owner: example-organization + name: pr-bot `) func WriteConfigFile(t *testing.T, content []byte) { @@ -44,13 +46,13 @@ func TestLoadWithMissingFile(t *testing.T) { } func TestLoadWithExistingFile(t *testing.T) { - WriteConfigFile(t, defaultConfigInlineSecrets) + WriteConfigFile(t, defaultConfig) assert.NotPanics(t, func() { Load(os.TempDir()) }, "Unexpected panic while reading existing file") } func TestLoadGiteaStructure(t *testing.T) { - WriteConfigFile(t, defaultConfigInlineSecrets) + WriteConfigFile(t, defaultConfig) Load(os.TempDir()) expected := GiteaConfig{ @@ -61,12 +63,6 @@ func TestLoadGiteaStructure(t *testing.T) { Webhook: Webhook{ Secret: "haxxor-gitea-secret", }, - Repositories: []GiteaRepository{ - GiteaRepository{ - Owner: "some-owner", - Name: "a-repository-name", - }, - }, } assert.EqualValues(t, expected, Gitea) @@ -75,7 +71,7 @@ func TestLoadGiteaStructure(t *testing.T) { func TestLoadGiteaStructureInjectedEnvs(t *testing.T) { os.Setenv("PRBOT_GITEA_WEBHOOK_SECRET", "injected-webhook-secret") os.Setenv("PRBOT_GITEA_TOKEN_VALUE", "injected-token") - WriteConfigFile(t, defaultConfigInlineSecrets) + WriteConfigFile(t, defaultConfig) Load(os.TempDir()) expected := GiteaConfig{ @@ -86,12 +82,6 @@ func TestLoadGiteaStructureInjectedEnvs(t *testing.T) { Webhook: Webhook{ Secret: "injected-webhook-secret", }, - Repositories: []GiteaRepository{ - GiteaRepository{ - Owner: "some-owner", - Name: "a-repository-name", - }, - }, } assert.EqualValues(t, expected, Gitea) @@ -103,7 +93,7 @@ func TestLoadGiteaStructureInjectedEnvs(t *testing.T) { } func TestLoadSonarQubeStructure(t *testing.T) { - WriteConfigFile(t, defaultConfigInlineSecrets) + WriteConfigFile(t, defaultConfig) Load(os.TempDir()) expected := SonarQubeConfig{ @@ -114,7 +104,6 @@ func TestLoadSonarQubeStructure(t *testing.T) { Webhook: Webhook{ Secret: "haxxor-sonarqube-secret", }, - Projects: []string{}, } assert.EqualValues(t, expected, SonarQube) @@ -123,7 +112,7 @@ func TestLoadSonarQubeStructure(t *testing.T) { func TestLoadSonarQubeStructureInjectedEnvs(t *testing.T) { os.Setenv("PRBOT_SONARQUBE_WEBHOOK_SECRET", "injected-webhook-secret") os.Setenv("PRBOT_SONARQUBE_TOKEN_VALUE", "injected-token") - WriteConfigFile(t, defaultConfigInlineSecrets) + WriteConfigFile(t, defaultConfig) Load(os.TempDir()) expected := SonarQubeConfig{ @@ -134,7 +123,6 @@ func TestLoadSonarQubeStructureInjectedEnvs(t *testing.T) { Webhook: Webhook{ Secret: "injected-webhook-secret", }, - Projects: []string{}, } assert.EqualValues(t, expected, SonarQube) @@ -163,12 +151,10 @@ func TestLoadStructureWithFileReferenceResolving(t *testing.T) { url: https://example.com/gitea token: value: fake-gitea-token - repositories: [] sonarqube: url: https://example.com/sonarqube token: value: fake-sonarqube-token - projects: [] `)) os.Setenv("PRBOT_GITEA_WEBHOOK_SECRETFILE", giteaWebhookSecretFile) os.Setenv("PRBOT_GITEA_TOKEN_FILE", giteaTokenFile) @@ -185,7 +171,6 @@ sonarqube: Secret: "gitea-totally-secret", SecretFile: giteaWebhookSecretFile, }, - Repositories: []GiteaRepository{}, } expectedSonarQube := SonarQubeConfig{ @@ -198,7 +183,6 @@ sonarqube: Secret: "sonarqube-totally-secret", SecretFile: sonarqubeWebhookSecretFile, }, - Projects: []string{}, } Load(os.TempDir()) @@ -216,3 +200,22 @@ sonarqube: os.Unsetenv("PRBOT_SONARQUBE_TOKEN_FILE") }) } + +func TestLoadProjectsStructure(t *testing.T) { + WriteConfigFile(t, defaultConfig) + Load(os.TempDir()) + + expectedProjects := []Project{ + Project{ + SonarQube: struct {Key string}{ + Key: "gitea-sonarqube-pr-bot", + }, + Gitea: GiteaRepository{ + Owner: "example-organization", + Name: "pr-bot", + }, + }, + } + + assert.EqualValues(t, expectedProjects, Projects) +}