Skip to content

Commit b58a464

Browse files
authored
Merge pull request #41932 from appsmithorg/release
30/06/2026 Promotion PR
2 parents 21ceb48 + 4163960 commit b58a464

64 files changed

Lines changed: 4198 additions & 1812 deletions

File tree

Some content is hidden

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

.github/dependabot.yml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,6 @@ updates:
44
directory: "/app/client"
55
schedule:
66
interval: "weekly"
7-
ignore:
8-
- dependency-name: "tinymce"
9-
versions: ["6.8.3"]
107
open-pull-requests-limit: 5
118
labels:
129
- "dependencies"

.github/workflows/build-docker-image.yml

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -120,21 +120,16 @@ jobs:
120120
args+=(--label "org.opencontainers.image.version=${{ steps.info_json.outputs.version }}")
121121
docker build -t cicontainer "${args[@]}" .
122122
123-
# Saving the docker image to tar file
124-
- name: Save Docker image to tar file
123+
# Push the SUT image to GHCR so test jobs can pull it with layer-level
124+
# parallelism instead of restoring a single-blob tarball from the Actions
125+
# cache. Old run-<id> tags are pruned by ghcr-citest-retention.yml.
126+
- name: Push docker image to GHCR
127+
env:
128+
GHCR_IMAGE: ghcr.io/${{ github.repository }}-citest:run-${{ github.run_id }}
125129
run: |
126-
docker image ls --all --no-trunc --format '{{.Repository}},{{.ID}}' \
127-
| grep -v cicontainer \
128-
| cut -d, -f2 \
129-
| xargs -r docker rmi || true
130-
docker save cicontainer -o cicontainer.tar
131-
gzip cicontainer.tar
132-
133-
- name: Cache docker image
134-
uses: actions/cache/save@v4
135-
with:
136-
path: cicontainer.tar.gz
137-
key: docker-image-${{github.run_id}}
130+
echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io --username "$GITHUB_ACTOR" --password-stdin
131+
docker tag cicontainer "$GHCR_IMAGE"
132+
docker push "$GHCR_IMAGE"
138133
139134
- name: Save the status of the run
140135
run: echo "run_result=success" >> $GITHUB_OUTPUT > ~/run_result

.github/workflows/ci-test-custom-script.yml

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -124,16 +124,15 @@ jobs:
124124
- name: cat run_result
125125
run: echo ${{ steps.run_result.outputs.run_result }}
126126

127-
- name: Restore the docker image cache
128-
uses: actions/cache@v4
129-
with:
130-
path: cicontainer.tar.gz
131-
key: docker-image-${{github.run_id}}
132-
133-
- name: Load Docker image from tar file
127+
# The build job pushed the SUT image to GHCR tagged with this run's id;
128+
# pull it from there (layer-parallel, no single-blob cache bottleneck).
129+
- name: Load Docker image
130+
env:
131+
GHCR_IMAGE: ghcr.io/${{ github.repository }}-citest:run-${{ github.run_id }}
134132
run: |
135-
gunzip cicontainer.tar.gz
136-
docker load -i cicontainer.tar
133+
echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io --username "$GITHUB_ACTOR" --password-stdin
134+
docker pull "$GHCR_IMAGE"
135+
docker tag "$GHCR_IMAGE" cicontainer
137136
138137
- name: Create folder
139138
if: steps.run_result.outputs.run_result != 'success'

.github/workflows/ci-test-limited-with-count.yml

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -204,26 +204,19 @@ jobs:
204204
echo "specs_to_run=$specs_to_run" >> $GITHUB_ENV
205205
206206
207-
# In case of run-id provided download the artifact from the previous run
208-
- name: Download Docker image artifact
209-
if: inputs.previous-workflow-run-id != 0
210-
uses: actions/cache@v4
211-
with:
212-
path: cicontainer.tar.gz
213-
key: docker-image-${{ inputs.previous-workflow-run-id }}
214-
215-
# In case of run-id is 0 download the artifact from the current run
216-
- name: Download Docker image artifact
217-
if: inputs.previous-workflow-run-id == 0
218-
uses: actions/cache@v4
219-
with:
220-
path: cicontainer.tar.gz
221-
key: docker-image-${{github.run_id}}
222-
223-
- name: Load Docker image from tar file
207+
# The build job pushed the SUT image to GHCR tagged with its run id;
208+
# when previous-workflow-run-id is set, reuse the image built by that
209+
# earlier run instead.
210+
- name: Load Docker image
224211
run: |
225-
gunzip cicontainer.tar.gz
226-
docker load -i cicontainer.tar
212+
image_run_id='${{ inputs.previous-workflow-run-id }}'
213+
if [[ "$image_run_id" == '0' ]]; then
214+
image_run_id='${{ github.run_id }}'
215+
fi
216+
ghcr_image="ghcr.io/${{ github.repository }}-citest:run-$image_run_id"
217+
echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io --username "$GITHUB_ACTOR" --password-stdin
218+
docker pull "$ghcr_image"
219+
docker tag "$ghcr_image" cicontainer
227220
228221
- name: Create folder
229222
if: steps.run_result.outputs.run_result != 'success'

.github/workflows/ci-test-limited.yml

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -115,26 +115,19 @@ jobs:
115115
specs_to_run=${specs_to_run#,}
116116
echo "specs_to_run=$specs_to_run" >> $GITHUB_ENV
117117
118-
# In case of run-id provided download the artifact from the previous run
119-
- name: Download Docker image artifact
120-
if: inputs.previous-workflow-run-id != 0
121-
uses: actions/cache@v4
122-
with:
123-
path: cicontainer.tar.gz
124-
key: docker-image-${{ inputs.previous-workflow-run-id }}
125-
126-
# In case of run-id is 0 download the artifact from the current run
127-
- name: Download Docker image artifact
128-
if: inputs.previous-workflow-run-id == 0
129-
uses: actions/cache@v4
130-
with:
131-
path: cicontainer.tar.gz
132-
key: docker-image-${{github.run_id}}
133-
134-
- name: Load Docker image from tar file
118+
# The build job pushed the SUT image to GHCR tagged with its run id;
119+
# when previous-workflow-run-id is set, reuse the image built by that
120+
# earlier run instead.
121+
- name: Load Docker image
135122
run: |
136-
gunzip cicontainer.tar.gz
137-
docker load -i cicontainer.tar
123+
image_run_id='${{ inputs.previous-workflow-run-id }}'
124+
if [[ "$image_run_id" == '0' ]]; then
125+
image_run_id='${{ github.run_id }}'
126+
fi
127+
ghcr_image="ghcr.io/${{ github.repository }}-citest:run-$image_run_id"
128+
echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io --username "$GITHUB_ACTOR" --password-stdin
129+
docker pull "$ghcr_image"
130+
docker tag "$ghcr_image" cicontainer
138131
139132
- name: Create folder
140133
if: steps.run_result.outputs.run_result != 'success'

.github/workflows/ci-test-playwright.yml

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -91,27 +91,28 @@ jobs:
9191
password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}
9292

9393
- name: Get Docker image id
94+
env:
95+
DOCKER_IMAGE_NAME: ${{ inputs.docker_image_name }}
9496
run: |
95-
if [[ '${{ inputs.docker_image_name }}' != '' ]]; then
96-
echo 'docker_container_name=${{ inputs.docker_image_name }}' >> "$GITHUB_ENV"
97+
if [[ -n "$DOCKER_IMAGE_NAME" ]]; then
98+
echo "docker_container_name=$DOCKER_IMAGE_NAME" >> "$GITHUB_ENV"
9799
else
98100
echo 'docker_container_name=cicontainer' >> "$GITHUB_ENV"
99101
fi
100102
101-
- name: Restore Docker image cache
102-
if: inputs.docker_image_name == ''
103-
uses: actions/cache@v4
104-
with:
105-
path: cicontainer.tar.gz
106-
key: docker-image-${{ github.run_id }}
107-
103+
# The build job pushed the SUT image to GHCR tagged with this run's id;
104+
# pull it from there (layer-parallel, no single-blob cache bottleneck).
108105
- name: Load Docker image
106+
env:
107+
GHCR_IMAGE: ghcr.io/${{ github.repository }}-citest:run-${{ github.run_id }}
108+
DOCKER_IMAGE_NAME: ${{ inputs.docker_image_name }}
109109
run: |
110-
if [[ '${{ inputs.docker_image_name }}' == '' ]]; then
111-
gunzip cicontainer.tar.gz
112-
docker load -i cicontainer.tar
110+
if [[ -z "$DOCKER_IMAGE_NAME" ]]; then
111+
echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io --username "$GITHUB_ACTOR" --password-stdin
112+
docker pull "$GHCR_IMAGE"
113+
docker tag "$GHCR_IMAGE" cicontainer
113114
else
114-
docker pull ${{ env.docker_container_name }}
115+
docker pull "$DOCKER_IMAGE_NAME"
115116
fi
116117
117118
- name: Create Appsmith stacks folder
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
name: GHCR citest image retention
2+
3+
# The build-docker-image workflow pushes a ~2 GB SUT image to GHCR tagged
4+
# run-<run_id> on every run. Test jobs only pull images from the current run,
5+
# or (for /ci-test-limit reruns) from a recent previous run, so anything older
6+
# than the retention window is dead weight. This prunes those versions daily.
7+
8+
on:
9+
schedule:
10+
- cron: "47 3 * * *"
11+
workflow_dispatch:
12+
inputs:
13+
older-than-days:
14+
description: "Delete run-* versions older than this many days"
15+
required: false
16+
type: string
17+
default: "7"
18+
dry-run:
19+
description: "Only log what would be deleted"
20+
required: false
21+
type: boolean
22+
default: false
23+
24+
permissions:
25+
packages: write
26+
27+
jobs:
28+
prune:
29+
runs-on: ubuntu-latest
30+
steps:
31+
- name: Delete citest package versions past the retention window
32+
env:
33+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
34+
OLDER_THAN_DAYS: ${{ inputs.older-than-days || '7' }}
35+
DRY_RUN: ${{ inputs.dry-run && 'true' || 'false' }}
36+
run: |
37+
set -o errexit -o nounset -o pipefail
38+
PACKAGE_PATH="/orgs/${GITHUB_REPOSITORY_OWNER}/packages/container/${GITHUB_REPOSITORY#*/}-citest"
39+
cutoff=$(( $(date +%s) - OLDER_THAN_DAYS * 86400 ))
40+
deleted=0
41+
while IFS=$'\t' read -r id created tags; do
42+
echo "Deleting version $id (created $created, tags: $tags)"
43+
if [[ "$DRY_RUN" != 'true' ]]; then
44+
gh api --method DELETE "$PACKAGE_PATH/versions/$id"
45+
fi
46+
deleted=$((deleted + 1))
47+
done < <(
48+
gh api --paginate "$PACKAGE_PATH/versions?per_page=100" \
49+
--jq ".[] | select((.created_at | fromdateiso8601) < $cutoff) | [.id, .created_at, (.metadata.container.tags | join(\",\"))] | @tsv"
50+
)
51+
echo "Deleted $deleted version(s) older than $OLDER_THAN_DAYS day(s) (dry-run: $DRY_RUN)"
Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
name: Helm Values Schema
1+
name: Helm Docs
22

33
on:
44
pull_request:
@@ -7,7 +7,9 @@ on:
77
paths:
88
- "deploy/helm/values.yaml"
99
- "deploy/helm/values.schema.json"
10-
- ".github/workflows/helm-schema.yml"
10+
- "deploy/helm/README.md"
11+
- "deploy/helm/README.md.gotmpl"
12+
- ".github/workflows/helm-docs.yml"
1113
workflow_dispatch:
1214

1315
jobs:
@@ -21,10 +23,10 @@ jobs:
2123

2224
steps:
2325
- name: Checkout the code
24-
uses: actions/checkout@v4
26+
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
2527

2628
- name: Install Helm
27-
uses: azure/setup-helm@v4
29+
uses: azure/setup-helm@1a275c3b69536ee54be43f2070a358922e12c8d4 # v4.3.1
2830
with:
2931
# Helm 4 — pinned so we don't silently track future major bumps.
3032
version: v4.1.4
@@ -34,18 +36,38 @@ jobs:
3436
# (the plugin source doesn't ship verification metadata).
3537
run: helm plugin install --verify=false https://github.com/losisin/helm-values-schema-json.git
3638

37-
- name: Regenerate schema from values.yaml
39+
- name: Install helm-docs
40+
run: |
41+
HELM_DOCS_VERSION=1.14.2
42+
BASE_URL="https://github.com/norwoodj/helm-docs/releases/download/v${HELM_DOCS_VERSION}"
43+
TARBALL="helm-docs_${HELM_DOCS_VERSION}_Linux_x86_64.tar.gz"
44+
curl -sSL "${BASE_URL}/checksums.txt" -o checksums.txt
45+
curl -sSL "${BASE_URL}/${TARBALL}" -o "${TARBALL}"
46+
sha256sum --check --ignore-missing checksums.txt
47+
tar xzf "${TARBALL}" helm-docs
48+
sudo mv helm-docs /usr/local/bin/
49+
50+
- name: Check values schema
3851
run: |
3952
helm schema \
4053
--schema-root.title "Appsmith Helm chart values" \
4154
--schema-root.id "https://helm.appsmith.com/values.schema.json" \
4255
-o values.schema.json.regenerated
4356
44-
- name: Fail if committed schema is out of date
45-
run: |
4657
if ! diff -u values.schema.json values.schema.json.regenerated; then
4758
echo ""
4859
echo "::error::values.schema.json is out of date. Regenerate locally with:"
4960
echo "::error:: cd deploy/helm && helm schema --schema-root.title 'Appsmith Helm chart values' --schema-root.id 'https://helm.appsmith.com/values.schema.json' -o values.schema.json"
5061
exit 1
5162
fi
63+
64+
- name: Check README
65+
run: |
66+
helm-docs --sort-values-order file --dry-run > README.md.regenerated
67+
68+
if ! diff -u README.md README.md.regenerated; then
69+
echo ""
70+
echo "::error::README.md is out of date. Regenerate locally with:"
71+
echo "::error:: cd deploy/helm && helm-docs --sort-values-order file"
72+
exit 1
73+
fi

.github/workflows/helm-release.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,14 @@ on:
2626
- release
2727
paths:
2828
- "deploy/helm/**"
29+
# Docs-only markdown changes shouldn't trigger the publish/version-bump check.
30+
- "!deploy/helm/**.md"
2931

3032
pull_request:
3133
paths:
3234
- "deploy/helm/**"
35+
# Docs-only markdown changes shouldn't trigger the publish/version-bump check.
36+
- "!deploy/helm/**.md"
3337

3438
jobs:
3539
publish:

.github/workflows/helm-unittest.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,13 @@ jobs:
2121
- name: Checkout the code
2222
uses: actions/checkout@v4
2323

24+
# Subchart .tgz files are gitignored, so a fresh checkout has no charts/.
25+
# Pull dependencies first so tests that render subchart templates (e.g.
26+
# deriving the redis master host from the redis subchart fullname) pass.
27+
- name: Build chart dependencies
28+
run: |
29+
docker run --rm -v $(pwd):/apps --entrypoint helm helmunittest/helm-unittest dependency update .
30+
2431
- name: Unittest
2532
run: |
2633
docker run --rm -v $(pwd):/apps helmunittest/helm-unittest .

0 commit comments

Comments
 (0)