Skip to content

Commit 513c350

Browse files
authored
Merge branch 'main' into graphql
2 parents dd0fa67 + db52515 commit 513c350

File tree

26 files changed

+563
-129
lines changed

26 files changed

+563
-129
lines changed

.github/workflows/e2e.yaml

Lines changed: 41 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,16 @@ jobs:
4141
strategy:
4242
fail-fast: false
4343
matrix:
44-
provider: [github, github_second_controller, gitlab_bitbucket, gitea_1, gitea_2, gitea_3, concurrency]
44+
provider:
45+
[
46+
github,
47+
github_second_controller,
48+
gitlab_bitbucket,
49+
gitea_1,
50+
gitea_2,
51+
gitea_3,
52+
concurrency,
53+
]
4554

4655
env:
4756
CONTROLLER_DOMAIN_URL: paac.paac-127-0-0-1.nip.io
@@ -285,7 +294,7 @@ jobs:
285294
- name: Install minica
286295
run: |
287296
go install github.com/jsha/minica@latest
288-
echo "$HOME/go/bin" >> $GITHUB_PATH
297+
echo "$HOME/go/bin" >> "$GITHUB_PATH"
289298
290299
- name: Clone startpaac
291300
uses: actions/checkout@v6
@@ -298,6 +307,7 @@ jobs:
298307
nohup gosmee client --saveDir /tmp/gosmee-replay ${{ secrets.PYSMEE_URL }} "https://${CONTROLLER_DOMAIN_URL}" > /tmp/gosmee-main.log 2>&1 &
299308
300309
- name: Run gosmee for main controller (Gitea)
310+
if: startsWith(matrix.provider, 'gitea') || matrix.provider == 'concurrency'
301311
run: |
302312
nohup gosmee client --saveDir /tmp/gosmee-replay ${{ secrets.TEST_GITEA_SMEEURL }} "https://${CONTROLLER_DOMAIN_URL}" >> /tmp/gosmee-main.log 2>&1 &
303313
@@ -340,6 +350,16 @@ jobs:
340350
cd startpaac
341351
./startpaac --ci -a
342352
353+
- name: Enable debug logging for e2e
354+
run: |
355+
set -euo pipefail
356+
kubectl -n pipelines-as-code patch configmap pac-config-logging --type merge -p '{"data":{"loglevel.pipelinesascode":"debug","loglevel.pac-watcher":"debug","loglevel.pipelines-as-code-webhook":"debug"}}'
357+
kubectl -n pipelines-as-code rollout restart deployment/pipelines-as-code-controller deployment/pipelines-as-code-webhook deployment/pipelines-as-code-watcher
358+
for name in controller webhook watcher; do
359+
echo "=== Waiting for $name to be ready ==="
360+
kubectl -n pipelines-as-code rollout status deployment/pipelines-as-code-$name --timeout=120s
361+
done
362+
343363
- name: Install minica CA certificate to system trust store
344364
run: |
345365
set -x
@@ -400,7 +420,9 @@ jobs:
400420
TEST_BITBUCKET_SERVER_API_URL: ${{ secrets.BITBUCKET_SERVER_API_URL }}
401421
TEST_BITBUCKET_SERVER_WEBHOOK_SECRET: ${{ secrets.BITBUCKET_SERVER_WEBHOOK_SECRET }}
402422
run: |
403-
./hack/gh-workflow-ci.sh run_e2e_tests
423+
mkdir -p /tmp/logs
424+
./hack/gh-workflow-ci.sh run_e2e_tests 2>&1 | tee -a /tmp/logs/e2e-test-output.log
425+
exit ${PIPESTATUS[0]}
404426
405427
- name: Collect logs
406428
if: ${{ always() }}
@@ -410,7 +432,7 @@ jobs:
410432
run: |
411433
./hack/gh-workflow-ci.sh collect_logs
412434
413-
- name: Show controllers/watcher logs with Snazy
435+
- name: Show controllers/watcher errors with Snazy
414436
if: ${{ always() }}
415437
run: |
416438
./hack/gh-workflow-ci.sh output_logs
@@ -422,11 +444,21 @@ jobs:
422444
name: logs-e2e-tests-${{ matrix.provider }}
423445
path: /tmp/logs
424446

425-
- name: Report Status
426-
if: ${{ always() && github.ref_name == 'main' && github.event_name == 'schedule' }}
427-
uses: ravsamhq/notify-slack-action@v2
447+
notify-slack:
448+
name: Notify Slack on Failures
449+
runs-on: ubuntu-latest
450+
needs: e2e-tests
451+
if: ${{ always() && github.ref_name == 'main' && github.event_name == 'schedule' }}
452+
steps:
453+
- uses: actions/checkout@v6
454+
- name: Download all artifacts
455+
uses: actions/download-artifact@v4
428456
with:
429-
status: ${{ job.status }}
430-
notify_when: "failure"
457+
path: artifacts
458+
pattern: logs-e2e-tests-*
459+
460+
- name: Send Slack notification
431461
env:
432462
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
463+
run: |
464+
./hack/gh-workflow-ci.sh notify_slack artifacts

Makefile

Lines changed: 26 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,15 @@ SHELL := bash
1616
TOPDIR := $(shell git rev-parse --show-toplevel)
1717
TMPDIR := $(TOPDIR)/tmp
1818
HUGO_BIN := $(TMPDIR)/hugo/hugo
19-
PY_FILES := $(shell find . -type f -name "*.py" -not -path "./worktrees/*" -not -path "*/.venv/*" -print)
20-
SH_FILES := $(shell find hack/ -type f -name "*.sh" -not -path "./worktrees/*" -not -path "*/.venv/*" -print)
21-
YAML_FILES := $(shell find . -type f \( -name "*.yml" -o -name "*.yaml" \) -not -path "./.vale/*" -not -path "./docs/themes/hugo-book/.github/*" -not -path "./worktrees/*" -not -path "./vendor/*" -print)
22-
MD_FILES := $(shell find . -type f -name "*.md" -not -path "./tmp/*" -not -path "./vendor/*" -not -path "*/.venv/*" -not -path "./.vale/*" -not -path "./docs/themes/*" -not -path "./.git/*" -not -path "./worktrees/*" -print)
19+
20+
# Safe file list helpers using null-delimited output
21+
# Usage: $(call GIT_LS_FILES,<patterns>,<command>)
22+
GIT_LS_FILES = git ls-files -z -- $(1) | xargs -0 -r $(2)
23+
PY_PATTERNS := '*.py' ':!vendor/*'
24+
SH_PATTERNS := 'hack/*.sh' ':!vendor/*'
25+
YAML_PATTERNS := '*.yml' '*.yaml' ':!.vale/*' ':!docs/themes/*' ':!vendor/*'
26+
MD_PATTERNS := '*.md' ':!docs/themes/*' ':!.vale/*' ':!vendor/*'
27+
MD_YAML_PATTERNS := '*.md' '*.yml' '*.yaml' ':!docs/themes/*' ':!.vale/*' ':!vendor/*' ':!tmp/*'
2328

2429
ifeq ($(PAC_VERSION),)
2530
PAC_VERSION="$(shell git describe --tags --exact-match 2>/dev/null || echo nightly-`date +'%Y%m%d'`-`git rev-parse --short HEAD`)"
@@ -89,30 +94,30 @@ lint-go: ## runs go linter on all go files
8994
--timeout $(TIMEOUT_UNIT)
9095

9196
.PHONY: lint-yaml
92-
lint-yaml: ${YAML_FILES} ## runs yamllint on all yaml files
97+
lint-yaml: ## runs yamllint on all yaml files
9398
@echo "Linting yaml files..."
94-
@yamllint -c .yamllint $(YAML_FILES)
99+
@$(call GIT_LS_FILES,$(YAML_PATTERNS),yamllint -c .yamllint) || true
95100

96101

97102
.PHONY: lint-md
98103
lint-md: ## runs markdownlint and vale on all markdown files
99104
@echo "Linting markdown files..."
100-
@markdownlint $(MD_FILES)
105+
@$(call GIT_LS_FILES,$(MD_PATTERNS),markdownlint) || true
101106
@echo "Grammar check with vale of documentation..."
102107
@vale docs/content --output=line --glob='*.md'
103108
@echo "CodeSpell on docs content"
104109
@codespell docs/content
105110

106111
.PHONY: lint-python
107-
lint-python: ${PY_FILES} ## runs pylint on all python files
112+
lint-python: ## runs pylint on all python files
108113
@echo "Linting python files..."
109-
@ruff check $(PY_FILES)
110-
@ruff format --check $(PY_FILES)
114+
@$(call GIT_LS_FILES,$(PY_PATTERNS),ruff check) || true
115+
@$(call GIT_LS_FILES,$(PY_PATTERNS),ruff format --check) || true
111116

112117
.PHONY: lint-shell
113-
lint-shell: ${SH_FILES} ## runs shellcheck on all python files
118+
lint-shell: ## runs shellcheck on all shell files
114119
@echo "Linting shell script files..."
115-
@shellcheck $(SH_FILES)
120+
@$(call GIT_LS_FILES,$(SH_PATTERNS),shellcheck) || true
116121

117122
.PHONY: gitlint
118123
gitlint: ## Run gitlint
@@ -129,19 +134,21 @@ fix-linters: fix-golangci-lint fix-python-errors fix-markdownlint fix-trailing-s
129134
.PHONY: fix-markdownlint
130135
fix-markdownlint: ## run markdownlint and fix on all markdown file
131136
@echo "Fixing markdown files..."
132-
@markdownlint --fix $(MD_FILES)
137+
@$(call GIT_LS_FILES,$(MD_PATTERNS),markdownlint --fix) || true
133138

134139
.PHONY: fix-trailing-spaces
135140
fix-trailing-spaces: ## remove trailing spaces on all markdown and yaml file
136-
@sed --in-place 's/[[:space:]]\+$$//' $(MD_FILES) $(YAML_FILES)
137-
@[[ -n `git status --porcelain $(MD_FILES) $(YAML_FILES)` ]] && { echo "Markdowns and Yaml files has been cleaned 🧹. Cleaned Files: ";git status --porcelain $(MD_FILES) $(YAML_FILES) ;} || echo "Markdown and YAML are clean ✨"
141+
@$(call GIT_LS_FILES,$(MD_YAML_PATTERNS),sed --in-place 's/[[:space:]]\+$$//' --) || true
142+
@STATUS=$$(git status --porcelain -- $$(git ls-files -- $(MD_YAML_PATTERNS))) && \
143+
[[ -n "$$STATUS" ]] && { echo "Markdowns and Yaml files has been cleaned 🧹. Cleaned Files: "; echo "$$STATUS" ;} || echo "Markdown and YAML are clean ✨"
138144

139-
.PHONE: fix-python-errors
145+
.PHONY: fix-python-errors
140146
fix-python-errors: ## fix all python errors generated by ruff
141147
@echo "Fixing python files..."
142-
@ruff check --fix $(PY_FILES)
143-
@ruff format $(PY_FILES)
144-
@[[ -n `git status --porcelain $(PY_FILES)` ]] && { echo "Python files has been cleaned 🧹. Cleaned Files: ";git status --porcelain $(PY_FILES) ;} || echo "Python files are clean ✨"
148+
@$(call GIT_LS_FILES,$(PY_PATTERNS),ruff check --fix) || true
149+
@$(call GIT_LS_FILES,$(PY_PATTERNS),ruff format) || true
150+
@STATUS=$$(git status --porcelain -- $$(git ls-files -- $(PY_PATTERNS))) && \
151+
[[ -n "$$STATUS" ]] && { echo "Python files has been cleaned 🧹. Cleaned Files: "; echo "$$STATUS" ;} || echo "Python files are clean ✨"
145152

146153
.PHONY: fix-golangci-lint
147154
fix-golangci-lint: ## run golangci-lint and fix on all go files
@@ -201,5 +208,3 @@ dev-docs: download-hugo ## preview live your docs with hugo
201208
.PHONY: clean
202209
clean: ## clean build artifacts
203210
rm -fR bin
204-
205-

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ Pipelines-as-Code is an opinionated CI/CD solution for Tekton and OpenShift Pipe
1010

1111
## Overview
1212

13-
Pipelines-as-Code brings the [Pipelines-as-Code methodology](https://teamhub.com/blog/understanding-pipeline-as-code-in-software-development/) to Tekton. It provides a simple and declarative way to define your pipelines in your Git repository and have them automatically executed on your Kubernetes cluster. It integrates seamlessly with Git providers like GitHub, GitLab, Bitbucket, and Gitea, and provides feedback directly on your pull requests and commits.
13+
Pipelines-as-Code brings the [Pipelines-as-Code methodology](https://teamhub.com/blog/understanding-pipeline-as-code-in-software-development/) to Tekton. It provides a simple and declarative way to define your pipelines in your Git repository and have them automatically executed on your Kubernetes cluster. It integrates seamlessly with Git providers like GitHub, GitLab, Bitbucket, and Forgejo, and provides feedback directly on your pull requests and commits.
1414

1515
## Why Pipelines-as-Code?
1616

@@ -54,15 +54,15 @@ Before getting started with Pipelines-as-Code, ensure you have:
5454
- **Git Provider**: One of:
5555
- GitHub (GitHub App or Webhook)
5656
- GitLab (Webhook)
57-
- Gitea/Forgejo (Webhook)
57+
- Forgejo (Webhook) - Tech Preview
5858
- Bitbucket Cloud/Data Center (Webhook)
5959
- **CLI Tool**: `kubectl` for cluster access
6060
- **Optional**: `tkn` CLI for Tekton operations
6161

6262
## Key Features
6363

6464
- **Git-based workflow**: Define your Tekton pipelines in your Git repository and have them automatically triggered on Git events like push, pull request, and comments.
65-
- **Multi-provider support**: Works with GitHub (via GitHub App & Webhook), GitLab, Gitea, Bitbucket Data Center & Cloud via webhooks.
65+
- **Multi-provider support**: Works with GitHub (via GitHub App & Webhook), GitLab, Forgejo (Tech Preview), Bitbucket Data Center & Cloud via webhooks.
6666
- **Annotation-driven workflows**: Target specific events, branches, or CEL expressions and gate untrusted PRs with `/ok-to-test` and `OWNERS`; see [Running the PipelineRun](https://pipelinesascode.com/docs/guide/running/).
6767
- **ChatOps style control**: `/test`, `/retest`, `/cancel`, and branch or tag selectors let you rerun or stop PipelineRuns from PR comments or commit messages; see [GitOps Commands](https://pipelinesascode.com/docs/guide/gitops_commands/).
6868
- **Skip CI support**: Use `[skip ci]`, `[ci skip]`, `[skip tkn]`, or `[tkn skip]` in commit messages to skip automatic PipelineRun execution for documentation updates or minor changes; GitOps commands can still override and trigger runs manually; see [Skip CI Commands](https://pipelinesascode.com/docs/guide/gitops_commands/#skip-ci-commands).

docs/content/docs/dev/_index.md

Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -40,55 +40,54 @@ If you need to redeploy just Pipelines as Code, you can use ko directly:
4040
env KO_DOCKER_REPO=localhost:5000 ko apply -f config -B
4141
```
4242

43-
## Gitea
43+
## Forgejo
4444

45-
Gitea is "unofficially" supported. You just need to configure Gitea the same way
46-
you do for other webhook methods with a token.
45+
Forgejo is supported as a Tech Preview provider. See the [Forgejo installation guide](/docs/install/forgejo) for setup instructions.
4746

48-
Here is an example of a Gitea NS/CRD/Secret (set to empty):
47+
Here is an example of a Forgejo NS/CRD/Secret configuration:
4948

5049
```yaml
5150
---
5251
apiVersion: v1
5352
kind: Namespace
5453
metadata:
55-
name: gitea
54+
name: forgejo
5655

5756
---
5857
apiVersion: "pipelinesascode.tekton.dev/v1alpha1"
5958
kind: Repository
6059
metadata:
61-
name: gitea
62-
namespace: gitea
60+
name: forgejo
61+
namespace: forgejo
6362
spec:
64-
url: "https://gitea.my.com/owner/repo"
63+
url: "https://forgejo.example.com/owner/repo"
6564
git_provider:
66-
user: "git"
67-
url: "Your gitea installation URL, i.e: https://gitea.my.com/"
65+
type: "gitea" # Use "gitea" - Forgejo is API-compatible with Gitea
66+
url: "https://forgejo.example.com/"
6867
secret:
69-
name: "secret"
68+
name: "forgejo-secret"
7069
key: token
7170
webhook_secret:
72-
name: "secret"
71+
name: "forgejo-secret"
7372
key: "webhook"
7473
---
7574
apiVersion: v1
7675
kind: Secret
7776
metadata:
78-
name: gitea-home-chmouel
79-
namespace: gitea
77+
name: forgejo-secret
78+
namespace: forgejo
8079
type: Opaque
8180
stringData:
82-
token: "your token has generated in gitea"
83-
webhook: "" # make sure it's empty when you set this up on the interface and here
81+
token: "your token generated in Forgejo"
82+
webhook: "" # Forgejo allows empty webhook secrets
8483
```
8584
8685
There are some gotchas with the webhook validation secret. Pipelines-as-Code
87-
detects a Gitea install and lets the user set an empty webhook secret (by default
86+
detects a Forgejo install and lets the user set an empty webhook secret (by default
8887
it's enforced).
8988
90-
startpaac will by default spin up a new instance of Forgejo (a Gitea fork) to play
91-
with and run the Gitea E2E tests.
89+
startpaac will by default spin up a new instance of Forgejo to play
90+
with and run the Forgejo E2E tests.
9291
9392
You will need to create a Hook URL generated from <https://hook.pipelinesascode.com/new>
9493
into the environment variable `TEST_GITEA_SMEEURL`.
@@ -104,7 +103,7 @@ The E2E tests will automatically create a repo using the admin username for each
104103
## Debugging E2E
105104

106105
As long as you have the secrets set up, you should be able to run the e2e tests properly.
107-
Gitea is the easiest to run (since they are self-contained). For the rest,
106+
Forgejo is the easiest to run (since they are self-contained). For the rest,
108107
you will need to set up some environment variables.
109108

110109
See the [e2e on kind
@@ -268,10 +267,10 @@ This shortcode creates a red warning blockquote indicating that a feature is in
268267
#### support_matrix
269268

270269
```markdown
271-
{ {< support_matrix github_app="true" github_webhook="true|false" gitea="true|false" gitlab="true|false" bitbucket_cloud="true|false" bitbucket_datacenter="true|false" >}}
270+
{ {< support_matrix github_app="true" github_webhook="true|false" forgejo="true|false" gitlab="true|false" bitbucket_cloud="true|false" bitbucket_datacenter="true|false" >}}
272271
```
273272

274-
This shortcode generates a compatibility table showing which Git providers support a particular feature. Each parameter accepts "true" or "false" values, displaying checkmarks (✅) or cross marks (❌) accordingly. The table lists all major Git providers (GitHub App, GitHub Webhook, Gitea, GitLab, Bitbucket Cloud, and Bitbucket Data Center) with their support status for the feature.
273+
This shortcode generates a compatibility table showing which Git providers support a particular feature. Each parameter accepts "true" or "false" values, displaying checkmarks (✅) or cross marks (❌) accordingly. The table lists all major Git providers (GitHub App, GitHub Webhook, Forgejo, GitLab, Bitbucket Cloud, and Bitbucket Data Center) with their support status for the feature.
275274

276275
## Documentation when we are doing the Release Process
277276

docs/content/docs/guide/gitops_commands.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ Similar to `/retest`, the `/ok-to-test` command will only trigger new PipelineRu
4242
### Requiring a SHA with `/ok-to-test`
4343

4444
{{< tech_preview "Requiring a SHA argument to `/ok-to-test`" >}}
45-
{{< support_matrix github_app="true" github_webhook="false" gitea="false" gitlab="false" bitbucket_cloud="false" bitbucket_datacenter="false" >}}
45+
{{< support_matrix github_app="true" github_webhook="false" forgejo="false" gitlab="false" bitbucket_cloud="false" bitbucket_datacenter="false" >}}
4646

4747
Cluster administrators can enforce SHA validation on `/ok-to-test` by setting
4848
`require-ok-to-test-sha: "true"` in the Pipelines-as-Code ConfigMap. This
@@ -90,7 +90,7 @@ Please be aware that GitOps commands such as `/test` and others will not functio
9090

9191
## GitOps Commands on Pushed Commits
9292

93-
{{< support_matrix github_app="true" github_webhook="true" gitea="false" gitlab="true" bitbucket_cloud="false" bitbucket_server="false" >}}
93+
{{< support_matrix github_app="true" github_webhook="true" forgejo="false" gitlab="true" bitbucket_cloud="false" bitbucket_server="false" >}}
9494

9595
If you want to trigger a GitOps command on a pushed commit, you can include the `GitOps` comments within your commit messages. These comments can be used to restart either all pipelines or specific ones. Here's how it works:
9696

@@ -168,7 +168,7 @@ The PipelineRun will be restarted regardless of the annotations if the comment `
168168

169169
### Triggering PipelineRun on Git tags
170170

171-
{{< support_matrix github_app="true" github_webhook="true" gitea="false" gitlab="true" bitbucket_cloud="false" bitbucket_server="false" >}}
171+
{{< support_matrix github_app="true" github_webhook="true" forgejo="false" gitlab="true" bitbucket_cloud="false" bitbucket_server="false" >}}
172172

173173
You can retrigger a PipelineRun against a specific Git tag by commenting on
174174
the tagged commit using a GitOps command. Pipelines-as-Code will resolve the

docs/content/docs/guide/matchingevents.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ files.
189189
## Matching a PipelineRun on a Regex in a comment
190190

191191
{{< tech_preview "Matching PipelineRun on regex in comments" >}}
192-
{{< support_matrix github_app="true" github_webhook="true" gitea="true" gitlab="true" bitbucket_cloud="false" bitbucket_datacenter="false" >}}
192+
{{< support_matrix github_app="true" github_webhook="true" forgejo="true" gitlab="true" bitbucket_cloud="false" bitbucket_datacenter="false" >}}
193193

194194
You can trigger a PipelineRun based on a comment on a Pull Request or a [Pushed
195195
Commit]({{< relref
@@ -239,7 +239,7 @@ relref "/docs/guide/gitops_commands.md#gitops-commands-on-pushed-commits" >}}).
239239
## Matching PipelineRun to a Pull Request labels
240240

241241
{{< tech_preview "Matching PipelineRun to a Pull-Request label" >}}
242-
{{< support_matrix github_app="true" github_webhook="true" gitea="true" gitlab="true" bitbucket_cloud="false" bitbucket_datacenter="false" >}}
242+
{{< support_matrix github_app="true" github_webhook="true" forgejo="true" gitlab="true" bitbucket_cloud="false" bitbucket_datacenter="false" >}}
243243

244244
Using the annotation `pipelinesascode.tekton.dev/on-label`, you can match a
245245
PipelineRun to a Pull Request label. For example, if you want to match the
@@ -261,7 +261,7 @@ metadata:
261261
targeted branch.
262262
* The `on-event` is still needed to match the Pull Request event on the
263263
proper targeted event.
264-
* This annotation is currently supported only on GitHub, Gitea, and GitLab
264+
* This annotation is currently supported only on GitHub, Forgejo, and GitLab
265265
providers. Bitbucket Cloud and Bitbucket Data Center do not support adding labels
266266
to Pull Requests.
267267
* When you add a label to a Pull Request, the corresponding PipelineRun is

docs/content/docs/guide/policy.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ weight: 50
77

88
Pipelines-as-Code uses policies to control which actions can be performed by
99
users who belong to specific teams within an organization, as defined on GitHub
10-
or other supported Git providers (currently GitHub and Gitea).
10+
or other supported Git providers (currently GitHub and Forgejo).
1111

12-
{{< support_matrix github_app="true" github_webhook="true" gitea="true" gitlab="false" bitbucket_cloud="false" bitbucket_datacenter="false" >}}
12+
{{< support_matrix github_app="true" github_webhook="true" forgejo="true" gitlab="false" bitbucket_cloud="false" bitbucket_datacenter="false" >}}
1313

1414
## Supported Actions
1515

0 commit comments

Comments
 (0)