-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTaskfile.yml
More file actions
247 lines (229 loc) · 10.1 KB
/
Copy pathTaskfile.yml
File metadata and controls
247 lines (229 loc) · 10.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
version: 3
set: [nounset, errexit, pipefail]
vars:
# ── Constants ────────────────────────────────────────
NAME: external-dns-tencentcloud-webhook
REGISTRY_PREFIX: ccr.ccs.tencentyun.com/paas
NAMESPACE: external-dns
HELM_REPO: external-dns
HELM_CHART: external-dns/external-dns
# ── Input (override via CLI: task deploy ZONE_TYPE=private) ──
ZONE_TYPE: '{{default "" .ZONE_TYPE}}'
AUTH: '{{default "oidc" .AUTH}}'
DOMAIN: '{{default "" .DOMAIN}}'
TAG: '{{default .VERSION .TAG}}'
# ── Auto-detected ───────────────────────────────────
VERSION:
sh: 'git describe --always --tags --dirty 2>/dev/null || echo "dev"'
_IMAGE: '{{.REGISTRY_PREFIX}}/{{.NAME}}'
tasks:
default:
desc: List available tasks
cmds:
- task --list
# ════════════════════════════════════════════════════════
# Commands
# ════════════════════════════════════════════════════════
setup:
desc: 'Generate values file for {{.ZONE_TYPE}} zone (AUTH={{.AUTH}})'
preconditions:
- sh: '[ -n "{{.ZONE_TYPE}}" ]'
msg: "ZONE_TYPE is required. Usage: task setup ZONE_TYPE=public DOMAIN=example.com"
cmds:
- OUTPUT_DIR=deploy/helm NAMESPACE={{.NAMESPACE}} ./scripts/setup.sh --auth {{.AUTH}} --zone {{.ZONE_TYPE}} {{if .DOMAIN}}--domain {{.DOMAIN}}{{end}}
deploy:
desc: 'Deploy external-dns (all zones or specific ZONE_TYPE)'
cmds:
- helm repo add {{.HELM_REPO}} https://kubernetes-sigs.github.io/external-dns/ 2>/dev/null || true
- helm repo update {{.HELM_REPO}}
- |
{{if .ZONE_TYPE}}
# Deploy specific zone
VALUES="deploy/helm/values-{{.ZONE_TYPE}}.local.yaml"
if [ ! -f "$VALUES" ]; then
echo "Error: $VALUES not found. Run: task setup ZONE_TYPE={{.ZONE_TYPE}} DOMAIN=<domain>"
exit 1
fi
RELEASE="external-dns-{{.ZONE_TYPE}}"
echo "==> Deploying $RELEASE"
helm upgrade --install "$RELEASE" {{.HELM_CHART}} \
--namespace {{.NAMESPACE}} --create-namespace \
-f deploy/helm/values-base.yaml \
-f deploy/helm/values-china.yaml \
-f "$VALUES" \
--set provider.webhook.image.repository={{._IMAGE}} \
--set provider.webhook.image.tag=latest \
--set provider.webhook.image.pullPolicy=Always
echo "Waiting for pod ready..."
kubectl wait -n {{.NAMESPACE}} --for=condition=Ready pod \
-l app.kubernetes.io/instance="$RELEASE" --timeout=60s 2>/dev/null || true
kubectl get pods -n {{.NAMESPACE}} -l app.kubernetes.io/instance="$RELEASE"
{{else}}
# Deploy all zones with existing values files
DEPLOYED=0
for zone in public private; do
VALUES="deploy/helm/values-${zone}.local.yaml"
if [ -f "$VALUES" ]; then
RELEASE="external-dns-${zone}"
echo "==> Deploying $RELEASE"
helm upgrade --install "$RELEASE" {{.HELM_CHART}} \
--namespace {{.NAMESPACE}} --create-namespace \
-f deploy/helm/values-base.yaml \
-f deploy/helm/values-china.yaml \
-f "$VALUES" \
--set provider.webhook.image.repository={{._IMAGE}} \
--set provider.webhook.image.tag=latest \
--set provider.webhook.image.pullPolicy=Always
kubectl wait -n {{.NAMESPACE}} --for=condition=Ready pod \
-l app.kubernetes.io/instance="$RELEASE" --timeout=60s 2>/dev/null || true
DEPLOYED=$((DEPLOYED+1))
fi
done
if [ "$DEPLOYED" = "0" ]; then
echo "No values files found. Run: task setup ZONE_TYPE=public DOMAIN=<domain>"
exit 1
fi
echo ""
kubectl get pods -n {{.NAMESPACE}}
{{end}}
down:
desc: 'Uninstall and clean up'
cmds:
- |
{{if .ZONE_TYPE}}
RELEASE="external-dns-{{.ZONE_TYPE}}"
helm uninstall "$RELEASE" -n {{.NAMESPACE}} 2>/dev/null || echo "$RELEASE not found"
rm -f "deploy/helm/values-{{.ZONE_TYPE}}.local.yaml"
{{else}}
for zone in public private; do
RELEASE="external-dns-${zone}"
helm uninstall "$RELEASE" -n {{.NAMESPACE}} 2>/dev/null || true
rm -f "deploy/helm/values-${zone}.local.yaml"
done
{{end}}
REMAINING=$(helm list -n {{.NAMESPACE}} --filter 'external-dns' -q 2>/dev/null | wc -l | tr -d ' ')
if [ "$REMAINING" = "0" ]; then
kubectl delete ns {{.NAMESPACE}} --ignore-not-found
fi
status:
desc: Show all external-dns instances
cmds:
- helm list -n {{.NAMESPACE}} --filter 'external-dns' 2>/dev/null || true
- echo ""
- kubectl get deploy,pods -n {{.NAMESPACE}} -o wide 2>/dev/null || echo "namespace {{.NAMESPACE}} does not exist"
logs:
desc: 'Show webhook logs (ZONE_TYPE=public|private, default: public)'
cmds:
- kubectl logs -n {{.NAMESPACE}} -l app.kubernetes.io/instance=external-dns-{{or .ZONE_TYPE "public"}} -c webhook --tail=50 {{.CLI_ARGS}}
logs:dns:
desc: 'Show external-dns logs'
cmds:
- kubectl logs -n {{.NAMESPACE}} -l app.kubernetes.io/instance=external-dns-{{or .ZONE_TYPE "public"}} -c external-dns --tail=50 {{.CLI_ARGS}}
# ════════════════════════════════════════════════════════
# Developer commands
# ════════════════════════════════════════════════════════
build:
desc: Build and push dev image (latest)
cmds:
- |
VERSION={{.VERSION}} \
COMMIT=$(git rev-parse --short HEAD 2>/dev/null || echo "unknown") \
BUILD_DATE=$(date -u +%Y-%m-%dT%H:%M:%SZ) \
KO_DOCKER_REPO={{._IMAGE}} \
ko build --bare \
--tags latest,{{.VERSION}} \
--platform=linux/amd64 \
--sbom=none .
sources:
- "**/*.go"
- go.mod
- go.sum
- .ko.yaml
examples:
desc: 'Deploy example Services for validation'
cmds:
- |
for zone in public private; do
RELEASE="external-dns-${zone}"
DOMAIN=$(kubectl -n {{.NAMESPACE}} get deploy "$RELEASE" \
-o jsonpath='{.spec.template.spec.containers[?(@.name=="webhook")].args}' \
2>/dev/null | tr ',' '\n' | sed -n "s/.*--domain-filter=\([^ \"]*\).*/\1/p" | head -1)
if [ -n "$DOMAIN" ]; then
echo "==> ${zone}: deploying examples (domain: ${DOMAIN})"
export DOMAIN ZONE_TYPE="$zone"
for f in examples/*.yaml; do
envsubst < "$f" | kubectl apply -n default -f -
done
fi
done
echo ""
echo "Wait ~1m for sync, then check: task logs"
examples:clean:
desc: 'Remove example resources'
cmds:
- |
for zone in public private; do
kubectl delete svc "example-${zone}" "example-multi-${zone}" -n default --ignore-not-found 2>/dev/null
kubectl delete ingress "example-ingress-${zone}" -n default --ignore-not-found 2>/dev/null
done
test:e2e:
desc: 'Run e2e acceptance tests (requires cluster connection)'
cmds:
- |
ginkgo -v ./test/e2e/ -- --domain={{.DOMAIN}} --image-tag={{.IMAGE_TAG}} {{.CLI_ARGS}}
vars:
DOMAIN: '{{default "tet.com" .DOMAIN}}'
IMAGE_TAG: '{{default "latest" .IMAGE_TAG}}'
release:
desc: 'Build, tag, push and publish release (TAG={{.TAG}})'
preconditions:
- sh: '[ "{{.TAG}}" != "dev" ]'
msg: "TAG is required. Usage: task release TAG=v0.1.0"
- sh: 'echo "{{.TAG}}" | grep -qE "^v[0-9]+\.[0-9]+\.[0-9]+$"'
msg: "TAG must be semver format: v0.1.0"
- sh: 'git diff --quiet && git diff --cached --quiet'
msg: "Working tree is dirty. Commit or stash changes first."
cmds:
# 1. Update image tag in values files
- "sed -i '' 's|^ tag:.*| tag: {{.TAG}}|' deploy/helm/values-base.yaml"
- "sed -i '' 's|^ tag:.*| tag: {{.TAG}}|' deploy/helm/values-china.yaml"
# 2. Commit version bump (CHANGELOG should already be updated by /release command)
- git add deploy/helm/values-base.yaml deploy/helm/values-china.yaml CHANGELOG.md
- 'git diff --cached --quiet || git commit -m "chore(release): {{.TAG}}"'
# 3. Tag (delete old if exists)
- git tag -d {{.TAG}} 2>/dev/null || true
- git tag {{.TAG}}
# 4. Build and push image (GHCR + CCR)
- |
VERSION={{.TAG}} \
COMMIT=$(git rev-parse --short HEAD) \
BUILD_DATE=$(date -u +%Y-%m-%dT%H:%M:%SZ) \
KO_DOCKER_REPO=ghcr.io/tkestack/external-dns-tencentcloud-webhook \
ko build --bare \
--tags {{.TAG}},latest \
--platform=linux/amd64 \
--sbom=none .
- |
VERSION={{.TAG}} \
COMMIT=$(git rev-parse --short HEAD) \
BUILD_DATE=$(date -u +%Y-%m-%dT%H:%M:%SZ) \
KO_DOCKER_REPO=ccr.ccs.tencentyun.com/paas/external-dns-tencentcloud-webhook \
ko build --bare \
--tags {{.TAG}},latest \
--platform=linux/amd64 \
--sbom=none .
# 5. Push code and tag
- git push origin master --force-with-lease
- git push origin {{.TAG}} --force
# 6. Create GitHub release (delete old if exists, reads CHANGELOG for notes)
- |
gh release delete {{.TAG}} -y 2>/dev/null || true
VER={{.TAG}}
VER_NUM=${VER#v}
NOTES=$(awk "/^## \[${VER_NUM}\]/{found=1;next} /^## \[/{found=0} found" CHANGELOG.md)
if [ -z "$NOTES" ]; then
NOTES="Release {{.TAG}}"
fi
echo "$NOTES" | gh release create {{.TAG}} --title "{{.TAG}}" --notes-file -
- 'echo ""'
- 'echo "Done: {{._IMAGE}}:{{.TAG}}"'