2023-10-26 16:41:40 +08:00
|
|
|
|
package mix
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"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"
|
|
|
|
|
"github.com/xuxiaowei-com-cn/gitlab-go/pipelines"
|
|
|
|
|
"github.com/xuxiaowei-com-cn/gitlab-go/utils"
|
|
|
|
|
"log"
|
|
|
|
|
"sort"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// DeleteArtifacts 删除产物
|
|
|
|
|
func DeleteArtifacts() *cli.Command {
|
|
|
|
|
return &cli.Command{
|
2023-10-26 17:16:09 +08:00
|
|
|
|
Name: "artifact",
|
|
|
|
|
Aliases: []string{"artifacts"},
|
2023-11-01 18:06:36 +08:00
|
|
|
|
Usage: "根据项目路径/ID、流水线IID范围删除产物(混合命令,多接口命令,立即删除)",
|
2023-10-26 16:41:40 +08:00
|
|
|
|
Flags: append(flag.CommonTokenRequired(), flag.Sort(), flag.Page(), flag.PerPage(), flag.Id(true), flag.IIdRange(true)),
|
|
|
|
|
Action: func(context *cli.Context) error {
|
|
|
|
|
var baseUrl = context.String(constant.BaseUrl)
|
|
|
|
|
var token = context.String(constant.Token)
|
|
|
|
|
var sortStr = context.String(constant.Sort)
|
|
|
|
|
var id = context.String(constant.Id)
|
|
|
|
|
var page = context.Int(constant.Page)
|
|
|
|
|
var perPage = context.Int(constant.PerPage)
|
|
|
|
|
var iidRanges = context.StringSlice(constant.IIdRange)
|
|
|
|
|
fmt.Println(iidRanges)
|
|
|
|
|
|
|
|
|
|
gitClient, err := gitlab.NewClient(token, gitlab.WithBaseURL(baseUrl))
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
iids := utils.Unique(utils.RangeInt(iidRanges))
|
|
|
|
|
sort.Ints(iids)
|
|
|
|
|
|
|
|
|
|
fmt.Printf("%d\n", iids)
|
|
|
|
|
|
|
|
|
|
iidsLen := len(iids)
|
|
|
|
|
if iidsLen == 0 {
|
|
|
|
|
// 输入数字为空,结束程序
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
err = DeleteArtifactsRecursion(gitClient, id, page, perPage, sortStr, iids)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func DeleteArtifactsRecursion(gitClient *gitlab.Client, id interface{}, page int, perPage int, sort string, iids []int) error {
|
|
|
|
|
|
|
|
|
|
pipelineInfos, response, err := pipelines.ListProjectPipelines(gitClient, id, page, perPage, sort)
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
log.Printf("Page %d, PerPage: %d, Response StatusCode: %d\n", page, perPage, response.Response.StatusCode)
|
|
|
|
|
|
|
|
|
|
for _, pipelineInfo := range pipelineInfos {
|
|
|
|
|
fmt.Printf("%d\n", pipelineInfo.IID)
|
|
|
|
|
|
|
|
|
|
// 数字在上方已排序
|
|
|
|
|
|
|
|
|
|
// 最小值
|
|
|
|
|
iidsMin := iids[0]
|
|
|
|
|
// 最大值
|
|
|
|
|
iidsMax := iids[len(iids)-1]
|
|
|
|
|
|
|
|
|
|
if iidsMin == pipelineInfo.IID {
|
|
|
|
|
// 等于最小值,删除最小值
|
|
|
|
|
iids = iids[1:]
|
|
|
|
|
err = ExecuteDeleteArtifacts(gitClient, id, pipelineInfo.ID, 1, 100)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
} else if pipelineInfo.IID == iidsMax {
|
|
|
|
|
// 等于最大值
|
|
|
|
|
iids = iids[:len(iids)-1]
|
|
|
|
|
err = ExecuteDeleteArtifacts(gitClient, id, pipelineInfo.ID, 1, 100)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
} else if iidsMin < pipelineInfo.IID {
|
|
|
|
|
// 大于最小值
|
2023-11-24 15:19:23 +08:00
|
|
|
|
err = artifactsForExecute(&iids, pipelineInfo.IID, gitClient, id, pipelineInfo.ID)
|
2023-10-26 16:41:40 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
} else if pipelineInfo.IID < iidsMax {
|
|
|
|
|
// 小于最大值
|
2023-11-24 15:19:23 +08:00
|
|
|
|
err = artifactsForExecute(&iids, pipelineInfo.IID, gitClient, id, pipelineInfo.ID)
|
2023-10-26 16:41:40 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
// 不在合法范围内
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
iidsLen := len(iids)
|
|
|
|
|
if iidsLen == 0 {
|
|
|
|
|
// 输入数字已处理完成,跳出循环
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if len(pipelineInfos) > 0 {
|
|
|
|
|
err := DeleteArtifactsRecursion(gitClient, id, page+1, perPage, sort, iids)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
2023-11-24 15:19:23 +08:00
|
|
|
|
func artifactsForExecute(iids *[]int, pipelineInfoIId int, gitClient *gitlab.Client, id interface{}, pipelineInfoId int) error {
|
2023-10-26 16:41:40 +08:00
|
|
|
|
for i := 0; i < len(*iids); i++ {
|
|
|
|
|
if (*iids)[i] == pipelineInfoIId {
|
|
|
|
|
fmt.Printf("数组中包含%d\n", pipelineInfoIId)
|
|
|
|
|
*iids = append((*iids)[:i], (*iids)[i+1:]...)
|
|
|
|
|
err := ExecuteDeleteArtifacts(gitClient, id, pipelineInfoId, 1, 100)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func ExecuteDeleteArtifacts(gitClient *gitlab.Client, id interface{}, pipelineInfoId int, page int, perPage int) error {
|
|
|
|
|
fmt.Printf("执行删除 %d \n", pipelineInfoId)
|
|
|
|
|
|
|
|
|
|
opt := &gitlab.ListJobsOptions{
|
|
|
|
|
ListOptions: gitlab.ListOptions{
|
|
|
|
|
Page: page,
|
|
|
|
|
PerPage: perPage,
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
jobs, response, err := gitClient.Jobs.ListPipelineJobs(id, pipelineInfoId, opt)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
log.Printf("List Project %s Pipeline %d Jobs Response StatusCode: %d\n", id, pipelineInfoId, response.Response.StatusCode)
|
|
|
|
|
|
|
|
|
|
for _, job := range jobs {
|
|
|
|
|
response, err = gitClient.Jobs.DeleteArtifacts(id, job.ID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
log.Printf("Delete Project %s Job %d Response StatusCode: %d\n", id, job.ID, response.Response.StatusCode)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if len(jobs) == perPage {
|
|
|
|
|
err = ExecuteDeleteArtifacts(gitClient, id, pipelineInfoId, page+1, perPage)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}
|