Skip to content

Commit c469a2c

Browse files
authored
Introduce digger run queue and task logic for dequeue (diggerhq#1318)
* Add separate task for fetching front of queue regularly
1 parent 3859a75 commit c469a2c

File tree

11 files changed

+283
-110
lines changed

11 files changed

+283
-110
lines changed

backend/go.mod

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,10 @@ require (
2121
github.com/golang-jwt/jwt v3.2.2+incompatible
2222
github.com/google/go-github/v55 v55.0.0
2323
github.com/google/go-github/v58 v58.0.0
24-
github.com/google/go-github/v59 v59.0.0
25-
github.com/google/go-github/v60 v60.0.0
2624
github.com/google/uuid v1.6.0
2725
github.com/migueleliasweb/go-github-mock v0.0.23
2826
github.com/robert-nix/ansihtml v1.0.1
27+
github.com/robfig/cron v1.2.0
2928
github.com/samber/lo v1.39.0
3029
github.com/spf13/viper v1.18.2
3130
github.com/stretchr/testify v1.9.0
@@ -102,8 +101,8 @@ require (
102101
github.com/golang/snappy v0.0.4 // indirect
103102
github.com/google/go-cmp v0.6.0 // indirect
104103
github.com/google/go-github/v35 v35.3.0 // indirect
105-
github.com/google/go-github/v56 v56.0.0 // indirect
106104
github.com/google/go-github/v57 v57.0.0 // indirect
105+
github.com/google/go-github/v59 v59.0.0 // indirect
107106
github.com/google/go-querystring v1.1.0 // indirect
108107
github.com/google/s2a-go v0.1.7 // indirect
109108
github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect

backend/go.sum

Lines changed: 12 additions & 102 deletions
Large diffs are not rendered by default.

backend/migrations/20240329100957.sql

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
-- Create "digger_runs" table
2+
CREATE TABLE "public"."digger_runs" (
3+
"id" bigserial NOT NULL,
4+
"created_at" timestamptz NULL,
5+
"updated_at" timestamptz NULL,
6+
"deleted_at" timestamptz NULL,
7+
"triggertype" text NULL,
8+
"pr_number" bigint NULL,
9+
"status" text NULL,
10+
"commit_id" text NULL,
11+
"digger_config" text NULL,
12+
"github_installation_id" bigint NULL,
13+
"repo_id" bigint NULL,
14+
"project_id" bigint NULL,
15+
"run_type" text NULL,
16+
PRIMARY KEY ("id"),
17+
CONSTRAINT "fk_digger_runs_project" FOREIGN KEY ("project_id") REFERENCES "public"."projects" ("id") ON UPDATE NO ACTION ON DELETE NO ACTION,
18+
CONSTRAINT "fk_digger_runs_repo" FOREIGN KEY ("repo_id") REFERENCES "public"."repos" ("id") ON UPDATE NO ACTION ON DELETE NO ACTION
19+
);
20+
-- Create index "idx_digger_runs_deleted_at" to table: "digger_runs"
21+
CREATE INDEX "idx_digger_runs_deleted_at" ON "public"."digger_runs" ("deleted_at");
22+
-- Create "digger_run_stages" table
23+
CREATE TABLE "public"."digger_run_stages" (
24+
"id" bigserial NOT NULL,
25+
"created_at" timestamptz NULL,
26+
"updated_at" timestamptz NULL,
27+
"deleted_at" timestamptz NULL,
28+
"digger_run_stage_id" text NULL,
29+
"project_name" text NULL,
30+
"status" smallint NULL,
31+
"run_id" bigint NULL,
32+
"digger_job_summary_id" bigint NULL,
33+
"serialized_job_spec" bytea NULL,
34+
"workflow_file" text NULL,
35+
"workflow_run_url" text NULL,
36+
PRIMARY KEY ("id"),
37+
CONSTRAINT "fk_digger_run_stages_digger_job_summary" FOREIGN KEY ("digger_job_summary_id") REFERENCES "public"."digger_job_summaries" ("id") ON UPDATE NO ACTION ON DELETE NO ACTION,
38+
CONSTRAINT "fk_digger_run_stages_run" FOREIGN KEY ("run_id") REFERENCES "public"."digger_runs" ("id") ON UPDATE NO ACTION ON DELETE NO ACTION
39+
);
40+
-- Create index "idx_digger_run_stage_id" to table: "digger_run_stages"
41+
CREATE INDEX "idx_digger_run_stage_id" ON "public"."digger_run_stages" ("run_id");
42+
-- Create index "idx_digger_run_stages_deleted_at" to table: "digger_run_stages"
43+
CREATE INDEX "idx_digger_run_stages_deleted_at" ON "public"."digger_run_stages" ("deleted_at");

backend/migrations/20240329114422.sql

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
-- Modify "digger_run_stages" table
2+
ALTER TABLE "public"."digger_run_stages" DROP COLUMN "digger_run_stage_id", DROP COLUMN "project_name", DROP COLUMN "status", DROP COLUMN "digger_job_summary_id", DROP COLUMN "serialized_job_spec", DROP COLUMN "workflow_file", DROP COLUMN "workflow_run_url", ADD COLUMN "batch_id" text NULL, ADD
3+
CONSTRAINT "fk_digger_run_stages_batch" FOREIGN KEY ("batch_id") REFERENCES "public"."digger_batches" ("id") ON UPDATE NO ACTION ON DELETE NO ACTION;

backend/migrations/20240402110915.sql

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
-- Drop index "idx_digger_job_id" from table: "digger_jobs"
2+
DROP INDEX "public"."idx_digger_job_id";
3+
-- Create index "idx_digger_job_id" to table: "digger_run_stages"
4+
CREATE INDEX "idx_digger_job_id" ON "public"."digger_run_stages" ("batch_id");
5+
-- Create "digger_run_queues" table
6+
CREATE TABLE "public"."digger_run_queues" (
7+
"id" bigserial NOT NULL,
8+
"created_at" timestamptz NULL,
9+
"updated_at" timestamptz NULL,
10+
"deleted_at" timestamptz NULL,
11+
"project_id" bigint NULL,
12+
"digger_run_id" bigint NULL,
13+
PRIMARY KEY ("id"),
14+
CONSTRAINT "fk_digger_run_queues_digger_run" FOREIGN KEY ("digger_run_id") REFERENCES "public"."digger_runs" ("id") ON UPDATE NO ACTION ON DELETE NO ACTION,
15+
CONSTRAINT "fk_digger_run_queues_project" FOREIGN KEY ("project_id") REFERENCES "public"."projects" ("id") ON UPDATE NO ACTION ON DELETE NO ACTION
16+
);
17+
-- Create index "idx_digger_run_queue_project_id" to table: "digger_run_queues"
18+
CREATE INDEX "idx_digger_run_queue_project_id" ON "public"."digger_run_queues" ("project_id");
19+
-- Create index "idx_digger_run_queue_run_id" to table: "digger_run_queues"
20+
CREATE INDEX "idx_digger_run_queue_run_id" ON "public"."digger_run_queues" ("digger_run_id");
21+
-- Create index "idx_digger_run_queues_deleted_at" to table: "digger_run_queues"
22+
CREATE INDEX "idx_digger_run_queues_deleted_at" ON "public"."digger_run_queues" ("deleted_at");

backend/migrations/atlas.sum

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
1-
h1:57NmvXiAV4RRiBEZZAOOjzE1Ep2wNK4QZ695bLhvShY=
1+
h1:XKQNc29tdcumex/EDFrmq1Xlus0chqk3B9DYku62Hfs=
22
20231227132525.sql h1:43xn7XC0GoJsCnXIMczGXWis9d504FAWi4F1gViTIcw=
33
20240115170600.sql h1:IW8fF/8vc40+eWqP/xDK+R4K9jHJ9QBSGO6rN9LtfSA=
44
20240116123649.sql h1:R1JlUIgxxF6Cyob9HdtMqiKmx/BfnsctTl5rvOqssQw=
55
20240125121106.sql h1:WZvI3WR3L4h6JqpE8rRTroLncJeD0ScPD44VL0snTlM=
66
20240125181812.sql h1:wRU6dwzfhhgDg67dEz2FE2paLFCZecarX5RVxS0fKN0=
77
20240301211741.sql h1:Tbq20LDfYTBjS8Nl2doK4FuaxAbUlUHuB0abCARPC3A=
88
20240328182453.sql h1:wjzcwR4BuSUrJw4+h21PJpgvT+xrJcyEwtzATkzNeRw=
9+
20240329100957.sql h1:6IHn/Se6FwdmipMDPAPF0yChNNCuwxrEt4rgn+0gkLQ=
10+
20240329114422.sql h1:chXvrIUFNud2SdbRClWSCKXZ4MrMu0mpgE08Bou3pgk=
11+
20240402110915.sql h1:bG2Dvbzm3ZvFa29Feb0Bwj6KtAtZy1Vyuje6yV31msQ=

backend/models/runs.go

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package models
2+
3+
import (
4+
orchestrator_scheduler "github.com/diggerhq/digger/libs/orchestrator/scheduler"
5+
"gorm.io/gorm"
6+
"log"
7+
"time"
8+
)
9+
10+
type DiggerRunStatus string
11+
12+
const (
13+
RunQueued DiggerRunStatus = "Queued"
14+
RunSucceeded DiggerRunStatus = "Succeeded"
15+
RunFailed DiggerRunStatus = "Failed"
16+
RunPendingApproval DiggerRunStatus = "Pending Approval"
17+
)
18+
19+
type RunType string
20+
21+
const (
22+
PlanAndApply RunType = "Plan and Apply"
23+
PlanOnly RunType = "Plan Only"
24+
)
25+
26+
type DiggerRunQueue struct {
27+
gorm.Model
28+
ProjectId uint `gorm:"index:idx_digger_run_queue_project_id"`
29+
Project *Project
30+
DiggerRunId uint `gorm:"index:idx_digger_run_queue_run_id"`
31+
DiggerRun DiggerRun
32+
time time.Time
33+
}
34+
35+
type DiggerRun struct {
36+
gorm.Model
37+
Triggertype string // pr_merge, manual_invocation, push_to_trunk
38+
PrNumber *int
39+
Status DiggerRunStatus
40+
CommitId string
41+
DiggerConfig string
42+
GithubInstallationId int64
43+
RepoId uint
44+
Repo *Repo
45+
Project *Project
46+
ProjectID uint
47+
RunType RunType
48+
}
49+
50+
type DiggerRunStage struct {
51+
gorm.Model
52+
Run *DiggerRun
53+
RunID uint `gorm:"index:idx_digger_run_stage_id"`
54+
Batch *DiggerBatch
55+
BatchID *string `gorm:"index:idx_digger_job_id"`
56+
}
57+
58+
type SerializedRunStage struct {
59+
DiggerJobId string `json:"digger_job_id"`
60+
Status orchestrator_scheduler.DiggerJobStatus `json:"status"`
61+
ProjectName string `json:"project_name"`
62+
WorkflowRunUrl *string `json:"workflow_run_url"`
63+
ResourcesCreated uint `json:"resources_created"`
64+
ResourcesDeleted uint `json:"resources_deleted"`
65+
ResourcesUpdated uint `json:"resources_updated"`
66+
}
67+
68+
func (r *DiggerRunStage) MapToJsonStruct() (interface{}, error) {
69+
job, err := DB.GetDiggerJobFromRunStage(*r)
70+
if err != nil {
71+
log.Printf("Could not retrive job from run")
72+
return nil, err
73+
}
74+
75+
return SerializedRunStage{
76+
DiggerJobId: job.DiggerJobID,
77+
Status: job.Status,
78+
ProjectName: r.Run.Project.Name,
79+
WorkflowRunUrl: job.WorkflowRunUrl,
80+
ResourcesCreated: job.DiggerJobSummary.ResourcesCreated,
81+
ResourcesUpdated: job.DiggerJobSummary.ResourcesUpdated,
82+
ResourcesDeleted: job.DiggerJobSummary.ResourcesDeleted,
83+
}, nil
84+
}

backend/models/storage.go

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
scheduler "github.com/diggerhq/digger/libs/orchestrator/scheduler"
99
"github.com/gin-gonic/gin"
1010
"github.com/google/uuid"
11+
"github.com/samber/lo"
1112
"gorm.io/gorm"
1213
"log"
1314
"net/http"
@@ -645,6 +646,70 @@ func (db *Database) CreateDiggerJob(batchId uuid.UUID, serializedJob []byte, wor
645646
return job, nil
646647
}
647648

649+
func (db *Database) GetDiggerJobFromRunStage(stage DiggerRunStage) (*DiggerJob, error) {
650+
job := &DiggerJob{}
651+
result := db.GormDB.Take(job, "batch_id = ?", stage.BatchID)
652+
if result.Error != nil {
653+
if errors.Is(result.Error, gorm.ErrRecordNotFound) {
654+
return nil, result.Error
655+
} else {
656+
return nil, result.Error
657+
}
658+
}
659+
return job, nil
660+
}
661+
662+
func (db *Database) GetFirstRunQueueForEveryProject() ([]DiggerRunQueue, error) {
663+
var runqueues []DiggerRunQueue
664+
query := `WITH RankedRuns AS (
665+
SELECT
666+
digger_run_queues.digger_run_id,
667+
digger_run_queues.project_id,
668+
digger_run_queues.created_at,
669+
ROW_NUMBER() OVER (PARTITION BY digger_run_queues.project_id ORDER BY digger_run_queues.created_at ASC) AS QueuePosition
670+
FROM
671+
digger_run_queues
672+
)
673+
SELECT
674+
RankedRuns.digger_run_id ,
675+
RankedRuns.project_id ,
676+
RankedRuns.created_at
677+
FROM
678+
RankedRuns
679+
WHERE
680+
QueuePosition = 1`
681+
682+
// 1. Fetch the front of the queue for every projectID
683+
tx := db.GormDB.
684+
Raw(query).
685+
Find(&runqueues)
686+
687+
if tx.Error != nil {
688+
fmt.Printf("%v", tx.Error)
689+
return nil, tx.Error
690+
}
691+
692+
// 2. Preload Project and DiggerRun for every DiggerrunQueue item (front of queue)
693+
var runqueuesWithData []DiggerRunQueue
694+
projectIds := lo.Map(runqueues, func(run DiggerRunQueue, index int) uint {
695+
return run.ProjectId
696+
})
697+
diggerRunIds := lo.Map(runqueues, func(run DiggerRunQueue, index int) uint {
698+
return run.DiggerRunId
699+
})
700+
701+
tx = db.GormDB.Preload("Project").Preload("DiggerRun").
702+
Where("digger_run_queues.project_id in ?", projectIds).
703+
Where("digger_run_queues.digger_run_id in ?", diggerRunIds).Find(&runqueuesWithData)
704+
705+
if tx.Error != nil {
706+
fmt.Printf("%v", tx.Error)
707+
return nil, tx.Error
708+
}
709+
710+
return runqueuesWithData, nil
711+
}
712+
648713
func (db *Database) UpdateDiggerJobSummary(diggerJobId string, resourcesCreated uint, resourcesUpdated uint, resourcesDeleted uint) (*DiggerJob, error) {
649714
diggerJob, err := db.GetDiggerJob(diggerJobId)
650715
if err != nil {

backend/tasks/.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
.env
2+
tasks

backend/tasks/tasks.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package main
2+
3+
import (
4+
"github.com/diggerhq/digger/backend/models"
5+
"github.com/robfig/cron"
6+
"log"
7+
"os"
8+
)
9+
10+
func initLogging() {
11+
log.SetOutput(os.Stdout)
12+
log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)
13+
log.Println("Initialized the logger successfully")
14+
}
15+
16+
func main() {
17+
initLogging()
18+
models.ConnectDatabase()
19+
20+
c := cron.New()
21+
22+
// RunQueues state machine
23+
c.AddFunc("* * * * *", func() {
24+
runQueues, err := models.DB.GetFirstRunQueueForEveryProject()
25+
if err != nil {
26+
log.Printf("Error fetching Latest queue runs: %v", err)
27+
return
28+
}
29+
30+
for _, queue := range runQueues {
31+
log.Printf("%v, %v, %v, %v\n", queue.DiggerRunId, queue.ProjectId, queue.DiggerRun.Status, queue.Project.Name)
32+
}
33+
})
34+
35+
// Start the Cron job scheduler
36+
c.Start()
37+
38+
for {
39+
}
40+
41+
}

go.work.sum

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -748,8 +748,6 @@ github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9
748748
github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8=
749749
github.com/AlecAivazis/survey/v2 v2.3.4 h1:pchTU9rsLUSvWEl2Aq9Pv3k0IE2fkqtGxazskAMd9Ng=
750750
github.com/AlecAivazis/survey/v2 v2.3.4/go.mod h1:hrV6Y/kQCLhIZXGcriDCUBtB3wnN7156gMXJ3+b23xM=
751-
github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.0 h1:yfJe15aSwEQ6Oo6J+gdfdulPNoZ3TEhmbhLIoxZcA+U=
752-
github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v0.8.0 h1:T028gtTPiYt/RMUfs8nVsAL7FDQrfLlrm/NnRG/zcC4=
753751
github.com/Azure/go-ntlmssp v0.0.0-20200615164410-66371956d46c h1:/IBSNwUN8+eKzUzbJPqhK839ygXJ82sde8x3ogr6R28=
754752
github.com/BurntSushi/toml v1.2.1 h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak=
755753
github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
@@ -799,6 +797,8 @@ github.com/alecthomas/kingpin/v2 v2.3.2 h1:H0aULhgmSzN8xQ3nX1uxtdlTHYoPLu5AhHxWr
799797
github.com/alecthomas/kingpin/v2 v2.3.2/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE=
800798
github.com/alecthomas/kingpin/v2 v2.4.0 h1:f48lwail6p8zpO1bC4TxtqACaGqHYA22qkHjHpqDjYY=
801799
github.com/alecthomas/kingpin/v2 v2.4.0/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE=
800+
github.com/alecthomas/kong v0.7.1 h1:azoTh0IOfwlAX3qN9sHWTxACE2oV8Bg2gAwBsMwDQY4=
801+
github.com/alecthomas/kong v0.7.1/go.mod h1:n1iCIO2xS46oE8ZfYCNDqdR0b0wZNrXAIAqro/2132U=
802802
github.com/alecthomas/repr v0.1.0/go.mod h1:2kn6fqh/zIyPLmm3ugklbEi5hg5wS435eygvNfaDQL8=
803803
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM=
804804
github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 h1:s6gZFSlWYmbqAuRjVTiNNhvNRfY2Wxp9nhfyel4rklc=
@@ -901,6 +901,7 @@ github.com/bradleyfalzon/ghinstallation v1.1.1/go.mod h1:vyCmHTciHx/uuyN82Zc3rXN
901901
github.com/bradleypeabody/gorilla-sessions-memcache v0.0.0-20181103040241-659414f458e1 h1:4QHxgr7hM4gVD8uOwrk8T1fjkKRLwaLjmTkU0ibhZKU=
902902
github.com/bradleypeabody/gorilla-sessions-memcache v0.0.0-20181103040241-659414f458e1/go.mod h1:dkChI7Tbtx7H1Tj7TqGSZMOeGpMP5gLHtjroHd4agiI=
903903
github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs=
904+
github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=
904905
github.com/bwesterb/go-ristretto v1.2.3 h1:1w53tCkGhCQ5djbat3+MH0BAQ5Kfgbt56UZQ/JMzngw=
905906
github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g=
906907
github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw=
@@ -1010,8 +1011,10 @@ github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1 h1:QbL/5oDUmRBzO9/Z7Seo
10101011
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4 h1:WtGNWLvXpe6ZudgnXrq0barxBImvnnJoMEhXAzcbM0I=
10111012
github.com/go-kit/kit v0.9.0 h1:wDJmvq38kDhkVxi50ni9ykkdUr1PKgqKOoi01fa0Mdk=
10121013
github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU=
1014+
github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=
10131015
github.com/go-ldap/ldap/v3 v3.1.10 h1:7WsKqasmPThNvdl0Q5GPpbTDD/ZD98CfuawrMIuh7qQ=
10141016
github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA=
1017+
github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
10151018
github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab h1:xveKWz2iaueeTaUgdetzel+U7exyigDYBryyVfV/rZk=
10161019
github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8=
10171020
github.com/go-openapi/inflect v0.19.0 h1:9jCH9scKIbHeV9m12SmPilScz6krDxKRasNNSNPXu/4=
@@ -1336,8 +1339,6 @@ github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY52
13361339
github.com/spf13/afero v1.10.0/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ=
13371340
github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
13381341
github.com/spf13/jwalterweatherman v0.0.0-20180109140146-7c0cea34c8ec h1:2ZXvIUGghLpdTVHR1UfvfrzoVlZaE/yOWC5LueIHZig=
1339-
github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=
1340-
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
13411342
github.com/stuart-warren/yamlfmt v0.1.2/go.mod h1:X5TuPH+hf4O0U1KBvNqygvHbvAnoi9Wyl9BbtPv8SZk=
13421343
github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 h1:kdXcSzyDtseVEc4yCz2qF8ZrQvIDBJLl4S1c3GCXmoI=
13431344
github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=

0 commit comments

Comments
 (0)