Skip to content

Commit a4fc904

Browse files
authored
Merge pull request #286 from devtron-labs/release-candidate-v0.37.0
sync: Release candidate v0.37.0
2 parents 1ac44b0 + 7f15114 commit a4fc904

78 files changed

Lines changed: 8652 additions & 2290 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/pr-issue-validator.yaml

Lines changed: 20 additions & 118 deletions
Original file line numberDiff line numberDiff line change
@@ -11,133 +11,35 @@ on:
1111
- 'main'
1212
- 'release-**'
1313
- 'develop'
14-
- 'hotfix-v0**'
15-
14+
- 'hotfix-**'
15+
# paths-ignore:
16+
# - 'docs/**'
17+
# - '.github/'
18+
# - 'CHANGELOG/'
19+
# - 'charts/'
20+
# - 'manifests/'
21+
# - 'sample-docker-templates/'
1622
jobs:
1723
validate-PR-issue:
1824
runs-on: ubuntu-latest
19-
permissions:
20-
issues: write
21-
contents: read
22-
pull-requests: write
25+
2326
steps:
2427
- name: Checkout repository
2528
uses: actions/checkout@v2
2629

27-
- name: Validate Issue Reference
30+
- name: Set up jq (for parsing JSON)
31+
run: sudo apt-get install -y jq
32+
33+
- name: PR Validation Script
2834
env:
29-
GH_TOKEN: ${{ github.token }}
3035
PR_BODY: ${{ github.event.pull_request.body }}
3136
PRNUM: ${{ github.event.pull_request.number }}
3237
TITLE: ${{ github.event.pull_request.title }}
38+
GH_TOKEN: ${{ github.token }}
39+
GH_PR_VALIDATOR_TOKEN: ${{ secrets.GH_PR_VALIDATOR_TOKEN }}
40+
BASE_REPO: ${{ github.event.pull_request.base.repo.full_name }}
41+
HEAD_REPO: ${{ github.event.pull_request.head.repo.full_name }}
3342
run: |
34-
set -x
35-
# Skip validation for documentation or chore PRs
36-
if [[ "$TITLE" =~ ^(doc:|docs:|chore:|misc:|sync:) ]]; then
37-
echo "Skipping validation for docs/chore PR."
38-
echo "PR NUMBER-: $PRNUM "
39-
gh pr edit $PRNUM --remove-label "PR:Issue-verification-failed"
40-
gh pr edit $PRNUM --add-label "PR:Ready-to-Review"
41-
exit 0
42-
fi
43-
44-
# Define all issue matching patterns
45-
patterns=(
46-
"((Fixes|Resolves) #[0-9]+)"
47-
"((Fixes|Resolves) https://github.com/devtron-labs/devtron/issues/[0-9]+)"
48-
"((Fixes|Resolves) devtron-labs/devtron#[0-9]+)"
49-
"(Fixes|Resolves):?\\s+\\[#([0-9]+)\\]"
50-
"((Fixes|Resolves):? #devtron-labs/devops-sprint/issues/[0-9]+)"
51-
"((Fixes|Resolves):? #devtron-labs/sprint-tasks/issues/[0-9]+)"
52-
"((Fixes|Resolves) https://github.com/devtron-labs/devops-sprint/issues/[0-9]+)"
53-
"((Fixes|Resolves) https://github.com/devtron-labs/sprint-tasks/issues/[0-9]+)"
54-
"((Fixes|Resolves):? #devtron-labs/sprint-tasks#[0-9]+)"
55-
)
56-
57-
# Extract issue number and repo from PR body
58-
extract_issue_number() {
59-
local pattern="$1" # Get the pattern as the first argument to the function
60-
61-
# Check if PR_BODY matches the provided pattern using Bash's =~ regex operator
62-
if [[ "$PR_BODY" =~ $pattern ]]; then
63-
echo "matched for this pattern $pattern"
64-
65-
issue_num=$(echo "$PR_BODY" | grep -oE "$pattern" | grep -oE "[0-9]+")
66-
67-
# Extract the repository name (e.g., devtron-labs/devtron) from PR_BODY using grep
68-
repo=$(echo "$PR_BODY" | grep -oE "devtron-labs/[a-zA-Z0-9_-]+")
69-
echo "Extracted issue number: $issue_num from repo: $repo"
70-
71-
return 0 # Return success
72-
else
73-
echo "No match for the pattern $pattern"
74-
fi
75-
return 1 # Return failure if no match
76-
}
77-
78-
issue_num=""
79-
repo="devtron-labs/devtron" # Default repo
80-
for pattern in "${patterns[@]}"; do
81-
echo "Now checking for $pattern"
82-
extract_issue_number "$pattern" && break
83-
done
84-
85-
if [[ -z "$issue_num" ]]; then
86-
echo "No valid issue number found."
87-
gh pr edit $PRNUM --add-label "PR:Issue-verification-failed"
88-
gh pr edit $PRNUM --remove-label "PR:Ready-to-Review"
89-
exit 1
90-
fi
91-
92-
# Form the issue API URL dynamically
93-
issue_api_url="https://api.github.com/repos/$repo/issues/$issue_num"
94-
echo "API URL: $issue_api_url"
95-
96-
# Check if the issue exists in the private repo
97-
response_code=$(curl -s -o /dev/null -w "%{http_code}" \
98-
--header "authorization: Bearer ${{ secrets.GH_PR_VALIDATOR_TOKEN }}" \
99-
"$issue_api_url")
100-
101-
if [[ "$response_code" -eq 200 ]]; then
102-
echo "Issue #$issue_num is valid and exists in $repo."
103-
104-
# Fetch the current state of the issue (open/closed) from the private repository.
105-
issue_status=$(curl -s \
106-
--header "authorization: Bearer ${{ secrets.GH_PR_VALIDATOR_TOKEN }}" \
107-
"$issue_api_url" | jq '.state'|tr -d \")
108-
# Check if the issue is still open.
109-
# if [[ "$issue_status" == open ]]; then
110-
# echo "Issue #$issue_num is opened."
111-
if [[ $forked == true ]]; then
112-
echo "PR:Ready-to-Review, exiting gracefully"
113-
exit 0
114-
fi
115-
# Remove the 'Issue-verification-failed' label (if present) and add 'Ready-to-Review'.
116-
gh pr edit $PRNUM --remove-label "PR:Issue-verification-failed"
117-
gh pr edit $PRNUM --add-label "PR:Ready-to-Review"
118-
echo "PR:Ready-to-Review, exiting gracefully"
119-
exit 0
120-
# else
121-
# echo "Issue #$issue_num is closed. Please link an open issue to proceed."
122-
# if [[ $forked == true ]]; then
123-
# echo "PR:Ready-to-Review, exiting gracefully"
124-
# exit 0
125-
# fi
126-
# Add a comment to the PR indicating the issue is not linked correctly.
127-
# gh pr comment $PRNUM --body "PR is linked to a closed issue. Please link an open issue to proceed."
128-
129-
# Add the 'Issue-verification-failed' label and remove 'Ready-to-Review'.
130-
# gh pr edit $PRNUM --add-label "PR:Issue-verification-failed"
131-
# gh pr edit $PRNUM --remove-label "PR:Ready-to-Review"
132-
# exit 1
133-
#fi
134-
else
135-
echo "Issue not found. Invalid URL or issue number."
136-
# Add a comment to the PR indicating the issue is not linked correctly.
137-
gh pr comment $PRNUM --body "PR is not linked to a valid issue. Please update the issue link."
138-
139-
# Apply 'Issue-verification-failed' label and remove 'Ready-to-Review' label.
140-
gh pr edit $PRNUM --add-label "PR:Issue-verification-failed"
141-
gh pr edit $PRNUM --remove-label "PR:Ready-to-Review"
142-
exit 1
143-
fi
43+
wget https://raw.githubusercontent.com/devtron-labs/utilities/feat/central-pr-validator/.github/workflows/validateIssue.sh
44+
chmod +x validateIssue.sh
45+
./validateIssue.sh

authenticator/middleware/sessionmanager.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ const (
4747
// ApiTokenClaimIssuer is the issuer who generated api-token for APIs
4848
ApiTokenClaimIssuer = "apiTokenIssuer"
4949

50+
LicenseManagerClaimIssuer = "licenseManagerIssuer"
51+
5052
// invalidLoginError, for security purposes, doesn't say whether the username or password was invalid. This does not mitigate the potential for timing attacks to determine which is which.
5153
invalidLoginError = "Invalid username or password"
5254
blankPasswordError = "Blank passwords are not allowed"
@@ -221,6 +223,8 @@ func (mgr *SessionManager) VerifyToken(tokenString string) (jwt.Claims, error) {
221223
return mgr.Parse(tokenString)
222224
case ApiTokenClaimIssuer:
223225
return mgr.ParseApiToken(tokenString)
226+
case LicenseManagerClaimIssuer:
227+
return mgr.ParseApiToken(tokenString)
224228
default:
225229
// IDP signed token
226230
prov, err := mgr.provider()

chart-sync/go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ go 1.22.4
55
toolchain go1.22.6
66

77
replace (
8-
github.com/devtron-labs/common-lib => github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250521133250-228c55be30a2
8+
github.com/devtron-labs/common-lib => github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250602063450-998593aefb28
99
helm.sh/helm/v3 v3.14.3 => github.com/devtron-labs/helm/v3 v3.14.1-0.20240401080259-90238cf69e42
1010
)
1111

chart-sync/go.sum

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@ github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr
5454
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
5555
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
5656
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
57-
github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250521133250-228c55be30a2 h1:mLbnHEC6F+/eWa4PkhIc4yQQHkPxcglMgdFoqv6c3nQ=
58-
github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250521133250-228c55be30a2/go.mod h1:CXQGEo+kZc7JPX5hn4jJf1msal9q/ExSdAYGkHNPnQw=
57+
github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250602063450-998593aefb28 h1:TuFPsIws3eAlIRajdqjEvh/Tl24iW7vTYWQ3T/qEgeo=
58+
github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250602063450-998593aefb28/go.mod h1:HQVUnQI7WHwVq89Bib/18xJqM89S1+xI0O7REctMMrA=
5959
github.com/devtron-labs/helm/v3 v3.14.1-0.20240401080259-90238cf69e42 h1:pJmK44QaSztOiZe0iQHNf0sdy5KwkAeceydyhOG4RaY=
6060
github.com/devtron-labs/helm/v3 v3.14.1-0.20240401080259-90238cf69e42/go.mod h1:v6myVbyseSBJTzhmeE39UcPLNv6cQK6qss3dvgAySaE=
6161
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
@@ -292,8 +292,9 @@ github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An
292292
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
293293
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
294294
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
295-
github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=
296295
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
296+
github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=
297+
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
297298
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
298299
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
299300
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=

chart-sync/vendor/modules.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ github.com/containerd/platforms
9393
# github.com/davecgh/go-spew v1.1.1
9494
## explicit
9595
github.com/davecgh/go-spew/spew
96-
# github.com/devtron-labs/common-lib v0.0.0 => github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250521133250-228c55be30a2
96+
# github.com/devtron-labs/common-lib v0.0.0 => github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250602063450-998593aefb28
9797
## explicit; go 1.21
9898
github.com/devtron-labs/common-lib/constants
9999
github.com/devtron-labs/common-lib/fetchAllEnv
@@ -791,4 +791,4 @@ sigs.k8s.io/structured-merge-diff/v4/value
791791
# sigs.k8s.io/yaml v1.3.0
792792
## explicit; go 1.12
793793
sigs.k8s.io/yaml
794-
# github.com/devtron-labs/common-lib => github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250521133250-228c55be30a2
794+
# github.com/devtron-labs/common-lib => github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250602063450-998593aefb28

ci-runner/app/CiCdProcessor.go

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -100,14 +100,22 @@ func (impl *CiCdProcessor) ProcessCiCdEvent(ciCdRequest *helper.CiCdTriggerEvent
100100
if logLevel == "" || logLevel == "DEBUG" {
101101
log.Println(util.DEVTRON, " ci-cd request details -----> ", ciCdRequest)
102102
}
103+
impl.handleEventBasedOnType(ciCdRequest, &exitCode)
104+
impl.HandleCleanup(*ciCdRequest, &exitCode, util.Source_Defer)
105+
return
106+
}
103107

104-
defer impl.HandleCleanup(*ciCdRequest, &exitCode, util.Source_Defer)
108+
func (impl *CiCdProcessor) handleEventBasedOnType(ciCdRequest *helper.CiCdTriggerEvent, exitCode *int) {
109+
defer func() { //recover in this function allows us to process further cleanup even if the code crashes
110+
if r := recover(); r != nil {
111+
log.Println("recovered from panic in handleEventBasedOnType:", r)
112+
}
113+
}()
105114
if helper.IsCIOrJobTypeEvent(ciCdRequest.Type) {
106-
impl.ciStage.HandleCIEvent(ciCdRequest, &exitCode)
115+
impl.ciStage.HandleCIEvent(ciCdRequest, exitCode)
107116
} else {
108-
impl.cdStage.HandleCDEvent(ciCdRequest, &exitCode)
117+
impl.cdStage.HandleCDEvent(ciCdRequest, exitCode)
109118
}
110-
return
111119
}
112120

113121
func (impl *CiCdProcessor) CleanUpBuildxK8sDriver(ciCdRequest helper.CiCdTriggerEvent, wg *sync.WaitGroup) {

ci-runner/executor/stage/cdStages.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,14 @@ func (impl *CdStage) HandleCDEvent(ciCdRequest *helper.CiCdTriggerEvent, exitCod
5656
return
5757
}
5858

59-
func (impl *CdStage) handleCDEvent(ciCdRequest *helper.CiCdTriggerEvent) (*helper.HandleCdEventResponse, error) {
59+
func (impl *CdStage) handleCDEvent(ciCdRequest *helper.CiCdTriggerEvent) (resp *helper.HandleCdEventResponse, err error) {
60+
defer func() { //recover in this function allows us to send event even if the code crashes
61+
if r := recover(); r != nil {
62+
log.Println("recovered from panic in handleCDEvent:", r)
63+
err = fmt.Errorf("panic occurred during CD event handling")
64+
}
65+
}()
6066
var artifactUploaded bool
61-
var err error
6267
var allPluginArtifacts *helper.PluginArtifacts
6368

6469
allPluginArtifacts, err = impl.runCDStages(ciCdRequest)

ci-runner/executor/stage/ciStages.go

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,8 @@ func NewCiStage(gitManager helper.GitManager, dockerHelper helper.DockerHelper,
7474
}
7575
}
7676

77-
func deferCIEvent(ciRequest *helper.CommonWorkflowRequest, artifactUploaded bool, err error) (exitCode int) {
78-
log.Println(util.DEVTRON, "defer CI stage data.", "err: ", err, "artifactUploaded: ", artifactUploaded)
77+
func sendCIEventResult(ciRequest *helper.CommonWorkflowRequest, artifactUploaded bool, err error) (exitCode int) {
78+
log.Println(util.DEVTRON, "sendCIEventResult CI stage data.", "err: ", err, "artifactUploaded: ", artifactUploaded)
7979
if err != nil {
8080
var stageError *helper.CiStageError
8181
if errors.As(err, &stageError) {
@@ -99,13 +99,23 @@ func deferCIEvent(ciRequest *helper.CommonWorkflowRequest, artifactUploaded bool
9999
}
100100

101101
func (impl *CiStage) HandleCIEvent(ciCdRequest *helper.CiCdTriggerEvent, exitCode *int) {
102-
var artifactUploaded bool
103-
var err error
102+
artifactUploaded, err := impl.handleCIEvent(ciCdRequest)
103+
if err != nil {
104+
//log error and send event result
105+
log.Println("ci stage error: ", err)
106+
}
107+
*exitCode = sendCIEventResult(ciCdRequest.CommonWorkflowRequest, artifactUploaded, err)
108+
}
109+
110+
func (impl *CiStage) handleCIEvent(ciCdRequest *helper.CiCdTriggerEvent) (artifactUploaded bool, err error) {
111+
defer func() { //recover in this function allows us to send event even if the code crashes
112+
if r := recover(); r != nil {
113+
log.Println("recovered from panic in handleCIEvent:", r)
114+
err = fmt.Errorf("panic occurred during CI event handling")
115+
}
116+
}()
104117
ciRequest := ciCdRequest.CommonWorkflowRequest
105118
ciContext := cicxt.BuildCiContext(context.Background(), ciRequest.EnableSecretMasking)
106-
defer func() {
107-
*exitCode = deferCIEvent(ciRequest, artifactUploaded, err)
108-
}()
109119
artifactUploaded, err = impl.runCIStages(ciContext, ciCdRequest)
110120
log.Println(util.DEVTRON, artifactUploaded, err)
111121
var artifactUploadErr error
@@ -116,16 +126,16 @@ func (impl *CiStage) HandleCIEvent(ciCdRequest *helper.CiCdTriggerEvent, exitCod
116126

117127
if err != nil {
118128
log.Println(util.DEVTRON, err)
119-
return
129+
return artifactUploaded, err
120130
}
121131

122132
if artifactUploadErr != nil {
123133
log.Println(util.DEVTRON, "error in artifact upload: ", artifactUploadErr)
124134
if ciCdRequest.CommonWorkflowRequest.IsExtRun {
125135
log.Println(util.DEVTRON, "Ignoring artifactUploadErr")
126-
return
136+
return artifactUploaded, err
127137
}
128-
return
138+
return artifactUploaded, err
129139
}
130140

131141
// sync cache
@@ -148,7 +158,7 @@ func (impl *CiStage) HandleCIEvent(ciCdRequest *helper.CiCdTriggerEvent, exitCod
148158
if err != nil {
149159
log.Println("error in cache push", err)
150160
}
151-
return
161+
return artifactUploaded, err
152162
}
153163

154164
// TODO: take as tech debt and break this function into parts for better code readability
@@ -672,17 +682,10 @@ func pullCache(metrics *helper.CIMetrics, ciCdRequest *helper.CiCdTriggerEvent)
672682
log.Println(util.DEVTRON, " cache-pull")
673683
start := time.Now()
674684
metrics.CacheDownStartTime = start
675-
676-
defer func() {
677-
log.Println(util.DEVTRON, " /cache-pull")
678-
metrics.CacheDownDuration = time.Since(start).Seconds()
679-
}()
680-
681685
err := helper.GetCache(ciCdRequest.CommonWorkflowRequest)
682-
if err != nil {
683-
return err
684-
}
685-
return nil
686+
log.Println(util.DEVTRON, " /cache-pull")
687+
metrics.CacheDownDuration = time.Since(start).Seconds()
688+
return err
686689
}
687690

688691
func (impl *CiStage) prepareStep(ciCdRequest *helper.CiCdTriggerEvent, metrics *helper.CIMetrics, skipCheckout bool) error {

ci-runner/go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ go 1.21
44

55
toolchain go1.21.8
66

7-
replace github.com/devtron-labs/common-lib => github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250521133250-228c55be30a2
7+
replace github.com/devtron-labs/common-lib => github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250602063450-998593aefb28
88

99
require (
1010
github.com/Knetic/govaluate v3.0.0+incompatible

ci-runner/go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,8 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs
9595
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
9696
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
9797
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
98-
github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250521133250-228c55be30a2 h1:mLbnHEC6F+/eWa4PkhIc4yQQHkPxcglMgdFoqv6c3nQ=
99-
github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250521133250-228c55be30a2/go.mod h1:CXQGEo+kZc7JPX5hn4jJf1msal9q/ExSdAYGkHNPnQw=
98+
github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250602063450-998593aefb28 h1:TuFPsIws3eAlIRajdqjEvh/Tl24iW7vTYWQ3T/qEgeo=
99+
github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250602063450-998593aefb28/go.mod h1:HQVUnQI7WHwVq89Bib/18xJqM89S1+xI0O7REctMMrA=
100100
github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk=
101101
github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E=
102102
github.com/docker/cli v24.0.6+incompatible h1:fF+XCQCgJjjQNIMjzaSmiKJSCcfcXb3TWTcc7GAneOY=

0 commit comments

Comments
 (0)