From 25860b000e7562ac5d8a795a59c375d7d0d19195 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E6=99=93=E4=BC=9F?= Date: Tue, 16 Jan 2024 10:21:14 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20=E9=A1=B9=E7=9B=AE=E7=BA=A7?= =?UTF-8?q?=E5=88=AB=20CI/CD=20=E5=8F=98=E9=87=8F=20API=EF=BC=9A=E5=88=9B?= =?UTF-8?q?=E5=BB=BA=E5=8F=98=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 23 ++-- constant/common.go | 73 ++++++----- flag/flag.go | 56 +++++++++ project_level_variables/create.go | 114 ++++++++++++++++++ .../project_level_variables.go | 6 +- 5 files changed, 231 insertions(+), 41 deletions(-) create mode 100644 project_level_variables/create.go diff --git a/README.md b/README.md index 1718e3e..8ae44b0 100644 --- a/README.md +++ b/README.md @@ -503,16 +503,25 @@ COPYRIGHT: COMMANDS: list 列出项目变量 + create 创建变量 help, h Shows a list of commands or help for one command OPTIONS: - --base-url value 实例地址,例如:https://gitlab.xuxiaowei.com.cn/api/v4 (default: "https://gitlab.com/api/v4") [%CI_API_V4_URL%] - --token value your_access_token - --page value 页码(默认:1),中文文档 https://docs.gitlab.cn/jh/api/rest/index.html#pagination (default: 1) - --per-page value 每页列出的项目数(默认:20;最大:100),中文文档 https://docs.gitlab.cn/jh/api/rest/index.html#pagination (default: 20) - --print-json 打印 JSON (default: false) - --print-time 打印时间 (default: false) - --help, -h show help + --base-url value 实例地址,例如:https://gitlab.xuxiaowei.com.cn/api/v4 (default: "https://gitlab.com/api/v4") [%CI_API_V4_URL%] + --token value your_access_token + --id value 项目 ID 或 URL 编码的路径 + --key value 变量的 key。不能超过 255 个字符。仅支持 A-Z、a-z、0-9 和 _ + --value value 变量的 value + --variableType value 变量类型。可用类型为:env_var 和 file (default: "env_var") + --protected 变量是否受保护。 (default: false) + --masked 变量是否隐藏。 (default: false) + --raw 变量是否被视为原始字符串。当为 true 时,值中的变量不会扩展 (default: false) + --environmentScope value 变量的 environment_scope。 (default: "*") + --page value 页码(默认:1),中文文档 https://docs.gitlab.cn/jh/api/rest/index.html#pagination (default: 1) + --per-page value 每页列出的项目数(默认:20;最大:100),中文文档 https://docs.gitlab.cn/jh/api/rest/index.html#pagination (default: 20) + --print-json 打印 JSON (default: false) + --print-time 打印时间 (default: false) + --help, -h show help ``` - [project - 项目 API](https://docs.gitlab.cn/jh/api/projects.html) diff --git a/constant/common.go b/constant/common.go index 83bab55..af41bd1 100644 --- a/constant/common.go +++ b/constant/common.go @@ -1,37 +1,44 @@ package constant const ( - Token = "token" - BaseUrl = "base-url" - BaseUrlDefault = "https://gitlab.com/api/v4" - Id = "id" - JobIdRange = "job-id-range" - IIdRange = "iid-range" - Repository = "repository" - TagName = "tag-name" - JobId = "job-id" - ArtifactsName = "artifacts-name" - Sort = "sort" - SortDefault = "desc" - Page = "page" - PerPage = "per-page" - PrintJson = "print-json" - PrintJsonDefault = false - PrintTime = "print-time" - PrintTimeDefault = false - Scope = "scope" - IssueId = "issue-id" - IssueIdRange = "issue-id-range" - Recursion = "recursion" - Owned = "owned" - NamespaceSource = "namespace-source" - NamespaceTarget = "namespace-target" - ExportFolder = "export-folder" - SkipProjectPath = "skip-project-path" - SkipProjectWikiPath = "skip-project-wiki-path" - AutoSkipExistFolder = "auto-skip-exist-folder" - AllowFailure = "allow-failure" - EnvName = "name" - EnvExternalUrl = "external_url" - EnvTier = "tier" + Token = "token" + BaseUrl = "base-url" + BaseUrlDefault = "https://gitlab.com/api/v4" + Id = "id" + JobIdRange = "job-id-range" + IIdRange = "iid-range" + Repository = "repository" + TagName = "tag-name" + JobId = "job-id" + ArtifactsName = "artifacts-name" + Sort = "sort" + SortDefault = "desc" + Page = "page" + PerPage = "per-page" + PrintJson = "print-json" + PrintJsonDefault = false + PrintTime = "print-time" + PrintTimeDefault = false + Scope = "scope" + IssueId = "issue-id" + IssueIdRange = "issue-id-range" + Recursion = "recursion" + Owned = "owned" + NamespaceSource = "namespace-source" + NamespaceTarget = "namespace-target" + ExportFolder = "export-folder" + SkipProjectPath = "skip-project-path" + SkipProjectWikiPath = "skip-project-wiki-path" + AutoSkipExistFolder = "auto-skip-exist-folder" + AllowFailure = "allow-failure" + EnvName = "name" + EnvExternalUrl = "external_url" + EnvTier = "tier" + VariableKey = "key" + VariableValue = "value" + VariableType = "variableType" + VariableProtected = "protected" + VariableMasked = "masked" + VariableRaw = "raw" + VariableEnvironmentScope = "environmentScope" ) diff --git a/flag/flag.go b/flag/flag.go index e130159..0b04227 100644 --- a/flag/flag.go +++ b/flag/flag.go @@ -271,3 +271,59 @@ func EnvTier() cli.Flag { Usage: "新环境的层级。允许设置的值为 production, staging, testing, development 和 other", } } + +func VariableKey(required bool) cli.Flag { + return &cli.StringFlag{ + Name: constant.VariableKey, + Usage: "变量的 key。不能超过 255 个字符。仅支持 A-Z、a-z、0-9 和 _", + Required: required, + } +} + +func VariableValue(required bool) cli.Flag { + return &cli.StringFlag{ + Name: constant.VariableValue, + Usage: "变量的 value", + Required: required, + } +} + +func VariableType() cli.Flag { + return &cli.StringFlag{ + Name: constant.VariableType, + Usage: "变量类型。可用类型为:env_var 和 file", + Value: "env_var", + } +} + +func VariableProtected() cli.Flag { + return &cli.BoolFlag{ + Name: constant.VariableProtected, + Usage: "变量是否受保护。", + Value: false, + } +} + +func VariableMasked() cli.Flag { + return &cli.BoolFlag{ + Name: constant.VariableMasked, + Usage: "变量是否隐藏。", + Value: false, + } +} + +func VariableRaw() cli.Flag { + return &cli.BoolFlag{ + Name: constant.VariableRaw, + Usage: "变量是否被视为原始字符串。当为 true 时,值中的变量不会扩展", + Value: false, + } +} + +func VariableEnvironmentScope() cli.Flag { + return &cli.StringFlag{ + Name: constant.VariableEnvironmentScope, + Usage: "变量的 environment_scope。", + Value: "*", + } +} diff --git a/project_level_variables/create.go b/project_level_variables/create.go new file mode 100644 index 0000000..8b51014 --- /dev/null +++ b/project_level_variables/create.go @@ -0,0 +1,114 @@ +package project_level_variables + +import ( + "encoding/json" + "fmt" + "github.com/urfave/cli/v2" + "github.com/xanzy/go-gitlab" + "github.com/xuxiaowei-com-cn/gitlab-go/constant" + "github.com/xuxiaowei-com-cn/gitlab-go/flag" + "log" +) + +// Create 创建变量 https://docs.gitlab.cn/jh/api/project_level_variables.html#%E5%88%9B%E5%BB%BA%E5%8F%98%E9%87%8F +func Create() *cli.Command { + return &cli.Command{ + Name: "create", + Usage: "创建变量", + Flags: append(flag.CommonTokenRequired(), flag.Id(true), + flag.VariableKey(true), flag.VariableValue(true), flag.VariableType(), flag.VariableProtected(), + flag.VariableMasked(), flag.VariableRaw(), flag.VariableEnvironmentScope(), + flag.PrintJson(), flag.PrintTime()), + Action: func(context *cli.Context) error { + var baseUrl = context.String(constant.BaseUrl) + var token = context.String(constant.Token) + var id = context.String(constant.Id) + + var key = context.String(constant.VariableKey) + var value = context.String(constant.VariableValue) + var variableType = context.String(constant.VariableType) + var protected = context.Bool(constant.VariableProtected) + var masked = context.Bool(constant.VariableMasked) + var raw = context.Bool(constant.VariableRaw) + var environmentScope = context.String(constant.VariableEnvironmentScope) + + var printJson = context.Bool(constant.PrintJson) + var printTime = context.Bool(constant.PrintTime) + + gitClient, err := gitlab.NewClient(token, gitlab.WithBaseURL(baseUrl)) + if err != nil { + return err + } + + opt := &gitlab.CreateProjectVariableOptions{ + Key: &key, + Value: &value, + Protected: &protected, + Masked: &masked, + Raw: &raw, + EnvironmentScope: &environmentScope, + } + if variableType == "env_var" { + opt.VariableType = gitlab.Ptr(gitlab.EnvVariableType) + } else if variableType == "file" { + opt.VariableType = gitlab.Ptr(gitlab.FileVariableType) + } + + projectVariable, response, err := gitClient.ProjectVariables.CreateVariable(id, opt) + if err != nil { + return err + } + log.Printf("Response StatusCode: %d\n", response.Response.StatusCode) + + fmt.Println("") + + if printJson { + if printTime { + jsonData, err := json.Marshal(projectVariable) + if err != nil { + panic(err) + } + + log.Printf("\n%s\n", string(jsonData)) + fmt.Println("") + + } else { + jsonData, err := json.Marshal(projectVariable) + if err != nil { + panic(err) + } + + fmt.Printf("%s\n", string(jsonData)) + fmt.Println("") + + } + } else { + if printTime { + log.Printf("Key: %s\n", projectVariable.Key) + log.Printf("Value: %s\n", projectVariable.Value) + log.Printf("VariableType: %s\n", projectVariable.VariableType) + log.Printf("Protected: %t\n", projectVariable.Protected) + log.Printf("Masked: %t\n", projectVariable.Masked) + log.Printf("Raw: %t\n", projectVariable.Raw) + log.Printf("EnvironmentScope: %s\n", projectVariable.EnvironmentScope) + + fmt.Println("") + + } else { + fmt.Printf("Key: %s\n", projectVariable.Key) + fmt.Printf("Value: %s\n", projectVariable.Value) + fmt.Printf("VariableType: %s\n", projectVariable.VariableType) + fmt.Printf("Protected: %t\n", projectVariable.Protected) + fmt.Printf("Masked: %t\n", projectVariable.Masked) + fmt.Printf("Raw: %t\n", projectVariable.Raw) + fmt.Printf("EnvironmentScope: %s\n", projectVariable.EnvironmentScope) + + fmt.Println("") + + } + } + + return nil + }, + } +} diff --git a/project_level_variables/project_level_variables.go b/project_level_variables/project_level_variables.go index c28aaae..1a4b77d 100644 --- a/project_level_variables/project_level_variables.go +++ b/project_level_variables/project_level_variables.go @@ -11,9 +11,13 @@ func ProjectLevelVariables() *cli.Command { Name: "project-level-variables", Aliases: []string{"project-level-variable", "plv"}, Usage: "项目级别 CI/CD 变量 API,中文文档:https://docs.gitlab.cn/jh/api/project_level_variables.html", - Flags: append(flag.Common(), flag.Page(), flag.PerPage(), flag.PrintJson(), flag.PrintTime()), + Flags: append(flag.Common(), flag.Id(false), + flag.VariableKey(false), flag.VariableValue(false), flag.VariableType(), flag.VariableProtected(), + flag.VariableMasked(), flag.VariableRaw(), flag.VariableEnvironmentScope(), + flag.Page(), flag.PerPage(), flag.PrintJson(), flag.PrintTime()), Subcommands: []*cli.Command{ List(), + Create(), }, } } -- GitLab