From 4f56ffb24ec4996ad0d90644e7d89368d00b596d Mon Sep 17 00:00:00 2001 From: Raffaele Di Fazio Date: Mon, 12 Oct 2026 15:01:09 +0000 Subject: [PATCH 1/4] Move to kustomize and support proxima-review-lab target (#63633) Signed-off-by: Raffaele Di Fazio Co-authored-by: Aleksey Levenstein Co-authored-by: Kevin Heis Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 5fc71074-f302-44f5-af72-9c9cfd106d14 --- .github/workflows/moda-allowed-ips.yml | 8 +- config/kubernetes/default/README.md | 9 ++ .../default/deployments/webapp.yaml | 89 ++++++-------- .../kubernetes/default/services/webapp.yaml | 10 +- .../docs-internal-review-lab/README.md | 9 ++ .../deployments/webapp.yaml | 75 ++++++++++++ .../ingresses/http.yaml | 25 ++++ .../services/router.yaml | 16 +++ config/kubernetes/production/README.md | 9 ++ .../production/deployments/webapp.yaml | 115 +++++++----------- .../production/services/webapp.yaml | 11 +- config/kustomize/README.md | 77 ++++++++++++ config/kustomize/base/deployments/webapp.yaml | 102 ++++++++++++++++ config/kustomize/base/kustomization.yaml | 6 + config/kustomize/base/services/webapp.yaml | 22 ++++ .../overlays/default/kustomization.yaml | 5 + .../ingresses/http.yaml | 24 ++++ .../kustomization.yaml | 31 +++++ .../services/router.yaml | 15 +++ .../production/deployments/webapp.yaml | 40 ++++++ .../overlays/production/kustomization.yaml | 10 ++ .../overlays/production/services/webapp.yaml | 12 ++ config/moda/deployment.yaml | 15 +++ src/deployments/README.md | 14 +++ 24 files changed, 617 insertions(+), 132 deletions(-) create mode 100644 config/kubernetes/default/README.md create mode 100644 config/kubernetes/docs-internal-review-lab/README.md create mode 100644 config/kubernetes/docs-internal-review-lab/deployments/webapp.yaml create mode 100644 config/kubernetes/docs-internal-review-lab/ingresses/http.yaml create mode 100644 config/kubernetes/docs-internal-review-lab/services/router.yaml create mode 100644 config/kubernetes/production/README.md create mode 100644 config/kustomize/README.md create mode 100644 config/kustomize/base/deployments/webapp.yaml create mode 100644 config/kustomize/base/kustomization.yaml create mode 100644 config/kustomize/base/services/webapp.yaml create mode 100644 config/kustomize/overlays/default/kustomization.yaml create mode 100644 config/kustomize/overlays/docs-internal-review-lab/ingresses/http.yaml create mode 100644 config/kustomize/overlays/docs-internal-review-lab/kustomization.yaml create mode 100644 config/kustomize/overlays/docs-internal-review-lab/services/router.yaml create mode 100644 config/kustomize/overlays/production/deployments/webapp.yaml create mode 100644 config/kustomize/overlays/production/kustomization.yaml create mode 100644 config/kustomize/overlays/production/services/webapp.yaml diff --git a/.github/workflows/moda-allowed-ips.yml b/.github/workflows/moda-allowed-ips.yml index a2a80d243e3b..d66ad2e0742d 100644 --- a/.github/workflows/moda-allowed-ips.yml +++ b/.github/workflows/moda-allowed-ips.yml @@ -30,8 +30,14 @@ jobs: echo "Got a list of Fastly IP addresses: $ips" echo "Updating the list of allowed IPs in Moda config..." - yq -i ".metadata.annotations[\"moda.github.net/allowed-ips\"] = \"$ips\"" \ + # Update the Kustomize source and the generated file together. + # The moda-linter check fails if they don't match. + for file in \ + config/kustomize/overlays/production/services/webapp.yaml \ config/kubernetes/production/services/webapp.yaml + do + yq -i ".metadata.annotations[\"moda.github.net/allowed-ips\"] = \"$ips\"" "$file" + done echo "Updated the list of allowed IPs in Moda config" echo "Checking if there is a change to make..." diff --git a/config/kubernetes/default/README.md b/config/kubernetes/default/README.md new file mode 100644 index 000000000000..becdc26e76de --- /dev/null +++ b/config/kubernetes/default/README.md @@ -0,0 +1,9 @@ +# Configuration for `default` environment + +The configuration in this directory was autogenerated with Kustomize. + +It contains the configuration for the **default** environment. + +Please avoid editing the files in this directory directly, as they will be overwritten by the next generation. + +To learn more about how to use [Kustomize](https://kustomize.io/) at GitHub, please visit [Kustomize on The Hub](https://thehub.github.com/epd/engineering/products-and-services/internal/moda/kustomize/). diff --git a/config/kubernetes/default/deployments/webapp.yaml b/config/kubernetes/default/deployments/webapp.yaml index ee7e524cae14..e6b883569bc8 100644 --- a/config/kubernetes/default/deployments/webapp.yaml +++ b/config/kubernetes/default/deployments/webapp.yaml @@ -1,9 +1,10 @@ +# This file was generated with Kustomize. Please do not edit manually. apiVersion: apps/v1 kind: Deployment metadata: - name: webapp annotations: moda.github.net/inject-unified-service-tag-env-var: docs-internal + name: webapp spec: replicas: 1 selector: @@ -11,49 +12,16 @@ spec: app: webapp template: metadata: - labels: - app: webapp annotations: - # Use logfmt_sloppy because internal logs write unstructured stdout and stderr. - # https://thehub.github.com/epd/engineering/dev-practicals/observability/logging/ + ad.datadoghq.com/tolerate-unready: 'true' + ad.datadoghq.com/webapp.logs: '[{"source":"nodejs","service":"docs-internal","tags":["env:staging"]}]' fluentbit.io/parser: logfmt_sloppy observability.github.com/splunk_index: docs-internal - ad.datadoghq.com/webapp.logs: '[{"source":"nodejs","service":"docs-internal","tags":["env:staging"]}]' - ad.datadoghq.com/tolerate-unready: 'true' + labels: + app: webapp spec: - dnsPolicy: Default - terminationGracePeriodSeconds: 60 containers: - - name: webapp - image: docs-internal - # Retune using 2 weeks of data: - # https://app.datadoghq.com/dashboard/6vx-iun-ghs/moda-resource-recommendations?tpl_var_kube_namespace%5B0%5D=docs-internal-staging-balsam&tpl_var_kube_namespace%5B1%5D=docs-internal-staging-boxwood&tpl_var_kube_namespace%5B2%5D=docs-internal-staging-cedar&tpl_var_kube_namespace%5B3%5D=docs-internal-staging-cypress&tpl_var_kube_namespace%5B4%5D=docs-internal-staging-fir&tpl_var_kube_namespace%5B5%5D=docs-internal-staging-hemlock&tpl_var_kube_namespace%5B6%5D=docs-internal-staging-hinoki&tpl_var_kube_namespace%5B7%5D=docs-internal-staging-holly&tpl_var_kube_namespace%5B8%5D=docs-internal-staging-juniper&tpl_var_kube_namespace%5B9%5D=docs-internal-staging-laurel&tpl_var_kube_namespace%5B10%5D=docs-internal-staging-pine&tpl_var_kube_namespace%5B11%5D=docs-internal-staging-redwood&tpl_var_kube_namespace%5B12%5D=docs-internal-staging-sequoia&tpl_var_kube_namespace%5B13%5D=docs-internal-staging-spruce&tpl_var_kube_namespace%5B14%5D=docs-internal-staging-yew&from_ts=0&to_ts=1209600000&live=true - # Staging is not budget checked. - resources: - requests: - # requests.cpu: 150m idle schedule floor because staging idles near zero. - cpu: 150m - # requests.memory: highest-peak pod p99 (1882Mi) * 1.1 for working-set padding. - memory: 2070Mi - limits: - # limits.cpu: highest warmup peak (1.82 cores) * 3 for startup headroom. - cpu: 5460m - # limits.memory: highest-peak pod max (1882Mi) * 2. - # Over the limit means OOMKill; memory is not compressible. - memory: 3764Mi - ports: - - name: http - containerPort: 4000 - protocol: TCP - envFrom: - - secretRef: - name: vault-secrets - - configMapRef: - name: kube-cluster-metadata - # Moda creates application-config from config/moda/configuration/*/env.yaml. - - configMapRef: - name: application-config - env: + - env: - name: POD_NAME valueFrom: fieldRef: @@ -62,25 +30,46 @@ spec: valueFrom: fieldRef: fieldPath: metadata.namespace - # Sleep before shutdown so Moda drains connections before old pods exit. - # https://thehub.github.com/engineering/products-and-services/internal/moda/feature-documentation/pod-lifecycle/#required-prestop-hook + envFrom: + - secretRef: + name: vault-secrets + - configMapRef: + name: kube-cluster-metadata + - configMapRef: + name: application-config + image: docs-internal lifecycle: preStop: exec: - command: ['sleep', '5'] - # See config/kubernetes/production/deployments/webapp.yaml for probe details. - startupProbe: + command: + - sleep + - '5' + name: webapp + ports: + - containerPort: 4000 + name: http + protocol: TCP + readinessProbe: + failureThreshold: 5 httpGet: path: /healthcheck port: http - initialDelaySeconds: 30 - periodSeconds: 5 - failureThreshold: 30 + periodSeconds: 10 timeoutSeconds: 5 - readinessProbe: + resources: + limits: + cpu: 5460m + memory: 3764Mi + requests: + cpu: 150m + memory: 2070Mi + startupProbe: + failureThreshold: 30 httpGet: path: /healthcheck port: http - periodSeconds: 10 - failureThreshold: 5 + initialDelaySeconds: 30 + periodSeconds: 5 timeoutSeconds: 5 + dnsPolicy: Default + terminationGracePeriodSeconds: 60 diff --git a/config/kubernetes/default/services/webapp.yaml b/config/kubernetes/default/services/webapp.yaml index e12a3d64f496..1ce53a3d03f4 100644 --- a/config/kubernetes/default/services/webapp.yaml +++ b/config/kubernetes/default/services/webapp.yaml @@ -1,13 +1,13 @@ +# This file was generated with Kustomize. Please do not edit manually. apiVersion: v1 kind: Service metadata: - name: webapp - labels: - service: webapp annotations: - moda.github.net/domain-name: 'docs-internal-%environment%.service.%region%.github.net' - # Expose the employee website as an internal HTTP load balancer. + moda.github.net/domain-name: docs-internal-%environment%.service.%region%.github.net moda.github.net/load-balancer-type: internal-http + labels: + service: webapp + name: webapp spec: ports: - name: http diff --git a/config/kubernetes/docs-internal-review-lab/README.md b/config/kubernetes/docs-internal-review-lab/README.md new file mode 100644 index 000000000000..58b5375f8eb9 --- /dev/null +++ b/config/kubernetes/docs-internal-review-lab/README.md @@ -0,0 +1,9 @@ +# Configuration for `docs-internal-review-lab` environment + +The configuration in this directory was autogenerated with Kustomize. + +It contains the configuration for the **docs-internal-review-lab** environment. + +Please avoid editing the files in this directory directly, as they will be overwritten by the next generation. + +To learn more about how to use [Kustomize](https://kustomize.io/) at GitHub, please visit [Kustomize on The Hub](https://thehub.github.com/epd/engineering/products-and-services/internal/moda/kustomize/). diff --git a/config/kubernetes/docs-internal-review-lab/deployments/webapp.yaml b/config/kubernetes/docs-internal-review-lab/deployments/webapp.yaml new file mode 100644 index 000000000000..7e90aff8d6c8 --- /dev/null +++ b/config/kubernetes/docs-internal-review-lab/deployments/webapp.yaml @@ -0,0 +1,75 @@ +# This file was generated with Kustomize. Please do not edit manually. +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: + moda.github.net/inject-unified-service-tag-env-var: docs-internal + name: webapp +spec: + replicas: 1 + selector: + matchLabels: + app: webapp + template: + metadata: + annotations: + ad.datadoghq.com/tolerate-unready: 'true' + ad.datadoghq.com/webapp.logs: '[{"source":"nodejs","service":"docs-internal","tags":["env:docs-internal-review-lab"]}]' + fluentbit.io/parser: logfmt_sloppy + observability.github.com/splunk_index: docs-internal + labels: + app: webapp + spec: + containers: + - env: + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + envFrom: + - secretRef: + name: vault-secrets + - configMapRef: + name: kube-cluster-metadata + - configMapRef: + name: application-config + image: docs-internal + lifecycle: + preStop: + exec: + command: + - sleep + - '5' + name: webapp + ports: + - containerPort: 4000 + name: http + protocol: TCP + readinessProbe: + failureThreshold: 5 + httpGet: + path: /healthcheck + port: http + periodSeconds: 10 + timeoutSeconds: 5 + resources: + limits: + cpu: 5460m + memory: 3764Mi + requests: + cpu: 150m + memory: 2070Mi + startupProbe: + failureThreshold: 30 + httpGet: + path: /healthcheck + port: http + initialDelaySeconds: 30 + periodSeconds: 5 + timeoutSeconds: 5 + dnsPolicy: Default + terminationGracePeriodSeconds: 60 diff --git a/config/kubernetes/docs-internal-review-lab/ingresses/http.yaml b/config/kubernetes/docs-internal-review-lab/ingresses/http.yaml new file mode 100644 index 000000000000..8896535d2f26 --- /dev/null +++ b/config/kubernetes/docs-internal-review-lab/ingresses/http.yaml @@ -0,0 +1,25 @@ +# This file was generated with Kustomize. Please do not edit manually. +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + annotations: + tailscale.com/http-endpoint: enabled + tailscale.com/proxy-group: ingress-proxies + tailscale.com/tags: tag:proxima-review-lab + name: http + namespace: '%namespace%' +spec: + ingressClassName: tailscale + rules: + - http: + paths: + - backend: + service: + name: router + port: + number: 80 + path: / + pathType: Prefix + tls: + - hosts: + - '%namespace%' diff --git a/config/kubernetes/docs-internal-review-lab/services/router.yaml b/config/kubernetes/docs-internal-review-lab/services/router.yaml new file mode 100644 index 000000000000..056a9982b605 --- /dev/null +++ b/config/kubernetes/docs-internal-review-lab/services/router.yaml @@ -0,0 +1,16 @@ +# This file was generated with Kustomize. Please do not edit manually. +apiVersion: v1 +kind: Service +metadata: + labels: + service: router + name: router +spec: + ports: + - name: http + port: 80 + protocol: TCP + targetPort: http + selector: + app: webapp + type: ClusterIP diff --git a/config/kubernetes/production/README.md b/config/kubernetes/production/README.md new file mode 100644 index 000000000000..fd3dae385404 --- /dev/null +++ b/config/kubernetes/production/README.md @@ -0,0 +1,9 @@ +# Configuration for `production` environment + +The configuration in this directory was autogenerated with Kustomize. + +It contains the configuration for the **production** environment. + +Please avoid editing the files in this directory directly, as they will be overwritten by the next generation. + +To learn more about how to use [Kustomize](https://kustomize.io/) at GitHub, please visit [Kustomize on The Hub](https://thehub.github.com/epd/engineering/products-and-services/internal/moda/kustomize/). diff --git a/config/kubernetes/production/deployments/webapp.yaml b/config/kubernetes/production/deployments/webapp.yaml index 752b3e1a3624..60eaf8b5a1a0 100644 --- a/config/kubernetes/production/deployments/webapp.yaml +++ b/config/kubernetes/production/deployments/webapp.yaml @@ -1,70 +1,33 @@ +# This file was generated with Kustomize. Please do not edit manually. apiVersion: apps/v1 kind: Deployment metadata: - name: webapp annotations: moda.github.net/allow-missing-ready-pods: '0' moda.github.net/inject-unified-service-tag-env-var: docs-internal + name: webapp spec: replicas: 6 - strategy: - type: RollingUpdate - rollingUpdate: - # Keep old pods serving until replacements pass readiness. - # Overprovisioning makes the temporary extra capacity safe. - maxUnavailable: 0 - # Scale surge capacity with replica count changes. - maxSurge: '100%' selector: matchLabels: app: webapp + strategy: + rollingUpdate: + maxSurge: 100% + maxUnavailable: 0 + type: RollingUpdate template: metadata: - labels: - app: webapp annotations: - # Use logfmt_sloppy because internal logs write unstructured stdout and stderr. - # https://thehub.github.com/epd/engineering/dev-practicals/observability/logging/ + ad.datadoghq.com/tolerate-unready: 'true' + ad.datadoghq.com/webapp.logs: '[{"source":"nodejs","service":"docs-internal","tags":["env:production"]}]' fluentbit.io/parser: logfmt_sloppy observability.github.com/splunk_index: docs-internal - ad.datadoghq.com/webapp.logs: '[{"source":"nodejs","service":"docs-internal","tags":["env:production"]}]' - ad.datadoghq.com/tolerate-unready: 'true' + labels: + app: webapp spec: - dnsPolicy: Default - # This 60-second total covers preStop, then request drain and OTEL shutdown after SIGTERM. - terminationGracePeriodSeconds: 60 containers: - - name: webapp - image: docs-internal - # Retune using 2 weeks of data: - # https://app.datadoghq.com/dashboard/6vx-iun-ghs/moda-resource-recommendations?tpl_var_kube_namespace%5B0%5D=docs-internal-production&from_ts=0&to_ts=1209600000&live=true - # Moda budget uses requests times replicas times clusters. - resources: - requests: - # requests.cpu: median pod p99 (0.32 cores) * 2 for failover headroom. - cpu: 640m - # requests.memory: highest-peak pod p99 (4740Mi) * 1.1 for working-set padding. - memory: 5214Mi - limits: - # limits.cpu: highest warmup peak (2.42 cores) * 3. - # This startup headroom does not count toward budget. - cpu: 7260m - # limits.memory: highest-peak pod max (4813Mi) * 2. - # Over the limit means OOMKill; memory is not compressible. - memory: 9626Mi - ports: - - name: http - containerPort: 4000 - protocol: TCP - envFrom: - - secretRef: - name: vault-secrets - - configMapRef: - name: kube-cluster-metadata - # Moda creates application-config from config/moda/configuration/*/env.yaml. - - configMapRef: - name: application-config - env: + - env: - name: POD_NAME valueFrom: fieldRef: @@ -73,36 +36,46 @@ spec: valueFrom: fieldRef: fieldPath: metadata.namespace - # Sleep before shutdown so Moda drains connections before old pods exit. - # https://thehub.github.com/engineering/products-and-services/internal/moda/feature-documentation/pod-lifecycle/#required-prestop-hook + envFrom: + - secretRef: + name: vault-secrets + - configMapRef: + name: kube-cluster-metadata + - configMapRef: + name: application-config + image: docs-internal lifecycle: preStop: exec: - command: ['sleep', '5'] - # warmServer() loads about 3500 content files × 9 languages × 9 versions. - # Startup averages 25 seconds and peaked at 48 seconds in Datadog docs.warm_server. - # The server starts listening after warmup, so probes fail at TCP level during boot. - # No app-level readiness flag is needed. - startupProbe: + command: + - sleep + - '5' + name: webapp + ports: + - containerPort: 4000 + name: http + protocol: TCP + readinessProbe: + failureThreshold: 5 httpGet: path: /healthcheck port: http - # Avoid probes during the average 25-second warmup. - initialDelaySeconds: 30 - periodSeconds: 5 - # Total runway: 30s + 30 × 5s = 180s. - # Covers peak startup plus resource contention when multiple pods boot during a deploy. - failureThreshold: 30 + periodSeconds: 10 timeoutSeconds: 5 - readinessProbe: + resources: + limits: + cpu: 7260m + memory: 9626Mi + requests: + cpu: 640m + memory: 5214Mi + startupProbe: + failureThreshold: 30 httpGet: path: /healthcheck port: http - periodSeconds: 10 - # 5 × 10s = 50s before the pod leaves the load balancer. - # The healthcheck always returns 200, so failures mean the process is hung or under extreme pressure. - failureThreshold: 5 + initialDelaySeconds: 30 + periodSeconds: 5 timeoutSeconds: 5 - # Skip livenessProbe because healthcheck returns 200 unless the process is fully hung. - # Readiness removes hung pods from load balancing. - # Liveness restarts risk killing pods during GC pauses or transient load spikes. + dnsPolicy: Default + terminationGracePeriodSeconds: 60 diff --git a/config/kubernetes/production/services/webapp.yaml b/config/kubernetes/production/services/webapp.yaml index bdb21c6e4ce8..6fe4361309f2 100644 --- a/config/kubernetes/production/services/webapp.yaml +++ b/config/kubernetes/production/services/webapp.yaml @@ -1,14 +1,15 @@ +# This file was generated with Kustomize. Please do not edit manually. apiVersion: v1 kind: Service metadata: - name: webapp - labels: - service: webapp annotations: - moda.github.net/domain-name: 'docs-internal.github.com' + moda.github.net/allowed-ips: 23.235.32.0/20,43.249.72.0/22,103.244.50.0/24,103.245.222.0/23,103.245.224.0/24,104.156.80.0/20,140.248.64.0/18,140.248.128.0/17,146.75.0.0/17,151.101.0.0/16,157.52.64.0/18,167.82.0.0/17,167.82.128.0/20,167.82.160.0/20,167.82.224.0/20,172.111.64.0/18,185.31.16.0/22,199.27.72.0/21,199.232.0.0/16 moda.github.net/dns-registration-enabled: 'false' + moda.github.net/domain-name: docs-internal.github.com moda.github.net/load-balancer-type: public-external-http - moda.github.net/allowed-ips: 23.235.32.0/20,43.249.72.0/22,103.244.50.0/24,103.245.222.0/23,103.245.224.0/24,104.156.80.0/20,140.248.64.0/18,140.248.128.0/17,146.75.0.0/17,151.101.0.0/16,157.52.64.0/18,167.82.0.0/17,167.82.128.0/20,167.82.160.0/20,167.82.224.0/20,172.111.64.0/18,185.31.16.0/22,199.27.72.0/21,199.232.0.0/16 + labels: + service: webapp + name: webapp spec: ports: - name: http diff --git a/config/kustomize/README.md b/config/kustomize/README.md new file mode 100644 index 000000000000..a8e04f6bb7ba --- /dev/null +++ b/config/kustomize/README.md @@ -0,0 +1,77 @@ +# Kubernetes configuration with Kustomize + +Moda deploys the Kubernetes files in `config/kubernetes//`. Kustomize generates those files from this directory. Edit files here, then regenerate. + +## What to edit + +| To change | Edit | +|---|---| +| Anything for every environment, such as probes or shutdown timing | `config/kustomize/base/deployments/webapp.yaml` | +| Staging CPU or memory | `config/kustomize/base/deployments/webapp.yaml`. Staging uses the base as is through `overlays/default/`. | +| Production CPU, memory, replicas, or rollout | `config/kustomize/overlays/production/deployments/webapp.yaml` | +| Production domain or load balancer | `config/kustomize/overlays/production/services/webapp.yaml` | +| Fastly IP allowlist | Nothing. `.github/workflows/moda-allowed-ips.yml` updates it weekly. | +| Review lab service, ingress, or Datadog tag | `config/kustomize/overlays/docs-internal-review-lab/` | +| Environment variables | `config/moda/configuration/default/env.yaml` for staging and review labs, `config/moda/configuration/production/env.yaml` for production | +| Secrets | `config/moda/secrets/{production,staging}/secrets.yml`. Review labs use `staging`. | +| Add or remove an environment | `config/moda/deployment.yaml`. Add an overlay only if the environment needs different Kubernetes config. | + +Don't edit `config/kubernetes/` by hand. Kustomize generates it. The `config/moda/` files don't go through Kustomize. + +Moda looks for `config/kubernetes//` first, then falls back to `config/kubernetes/default/`. So `production` uses `production`, and the `staging-*` environments use `default`. The review lab sets `resource_path: config/kubernetes/docs-internal-review-lab`. + +## Set up + +Install the GitHub Kustomize extension for `gh`. Pin the version that CI uses: + +```shell +gh extension install github/gh-kustomize --pin v4.2.0 +``` + +The extension lives in a private repository, so `gh` must be signed in to your GitHub account. + +## Make a change + +1. Edit files in `config/kustomize/`. +1. From the repository root, regenerate `config/kubernetes/`: + + ```shell + gh kustomize build + ``` + + To regenerate one environment, add `-e `. +1. Format the output. The pre-commit hook also does this. + + ```shell + npx prettier -w config/kubernetes + ``` + +1. Check that the generated files match the source: + + ```shell + gh kustomize validate --verbose + ``` + +1. Optional: compare the generated files to your local `main` branch. Update `main` first. + + ```shell + gh kustomize diff + ``` + +1. Commit the source and the generated files together. + +## Comments + +Kustomize drops comments from generated files. Put explanations in `config/kustomize/`, next to the values they explain. + +## CI + +The `moda-linter` check runs `gh kustomize validate` on every push. It fails when `config/kubernetes/` doesn't match what `config/kustomize/` generates. + +`.github/workflows/moda-allowed-ips.yml` is the one automated exception. It edits the allowlist in the production overlay and in the generated file at the same time, so they stay in sync. + +## Learn more + +- [Kustomize on The Hub](https://thehub.github.com/epd/engineering/products-and-services/internal/moda/kustomize/) +- [`gh kustomize` commands](https://thehub.github.com/epd/engineering/products-and-services/internal/moda/kustomize/kustomize-at-github/commands/) +- [Moda `deployment.yaml` reference](https://thehub.github.com/epd/engineering/products-and-services/internal/moda/reference/deployment-yaml/) diff --git a/config/kustomize/base/deployments/webapp.yaml b/config/kustomize/base/deployments/webapp.yaml new file mode 100644 index 000000000000..a6b2f4f4fb19 --- /dev/null +++ b/config/kustomize/base/deployments/webapp.yaml @@ -0,0 +1,102 @@ +# Shared by every environment. Staging and review labs use these replica and resource values as is. +# Production overrides replicas, rollout strategy, and resources in +# config/kustomize/overlays/production/deployments/webapp.yaml. +apiVersion: apps/v1 +kind: Deployment +metadata: + name: webapp + annotations: + moda.github.net/inject-unified-service-tag-env-var: docs-internal +spec: + replicas: 1 + selector: + matchLabels: + app: webapp + template: + metadata: + labels: + app: webapp + annotations: + # Use logfmt_sloppy because internal logs write unstructured stdout and stderr. + # https://thehub.github.com/epd/engineering/dev-practicals/observability/logging/ + fluentbit.io/parser: logfmt_sloppy + observability.github.com/splunk_index: docs-internal + # Overlays replace the env tag for production and review labs. + ad.datadoghq.com/webapp.logs: '[{"source":"nodejs","service":"docs-internal","tags":["env:staging"]}]' + ad.datadoghq.com/tolerate-unready: 'true' + spec: + dnsPolicy: Default + # This 60-second total covers preStop, then request drain and OTEL shutdown after SIGTERM. + terminationGracePeriodSeconds: 60 + containers: + - name: webapp + image: docs-internal + # Staging values. Retune using 2 weeks of data: + # https://app.datadoghq.com/dashboard/6vx-iun-ghs/moda-resource-recommendations?tpl_var_kube_namespace%5B0%5D=docs-internal-staging-balsam&tpl_var_kube_namespace%5B1%5D=docs-internal-staging-boxwood&tpl_var_kube_namespace%5B2%5D=docs-internal-staging-cedar&tpl_var_kube_namespace%5B3%5D=docs-internal-staging-cypress&tpl_var_kube_namespace%5B4%5D=docs-internal-staging-fir&tpl_var_kube_namespace%5B5%5D=docs-internal-staging-hemlock&tpl_var_kube_namespace%5B6%5D=docs-internal-staging-hinoki&tpl_var_kube_namespace%5B7%5D=docs-internal-staging-holly&tpl_var_kube_namespace%5B8%5D=docs-internal-staging-juniper&tpl_var_kube_namespace%5B9%5D=docs-internal-staging-laurel&tpl_var_kube_namespace%5B10%5D=docs-internal-staging-pine&tpl_var_kube_namespace%5B11%5D=docs-internal-staging-redwood&tpl_var_kube_namespace%5B12%5D=docs-internal-staging-sequoia&tpl_var_kube_namespace%5B13%5D=docs-internal-staging-spruce&tpl_var_kube_namespace%5B14%5D=docs-internal-staging-yew&from_ts=0&to_ts=1209600000&live=true + # Staging is not budget checked. + resources: + requests: + # requests.cpu: 150m idle schedule floor because staging idles near zero. + cpu: 150m + # requests.memory: highest-peak pod p99 (1882Mi) * 1.1 for working-set padding. + memory: 2070Mi + limits: + # limits.cpu: highest warmup peak (1.82 cores) * 3 for startup headroom. + cpu: 5460m + # limits.memory: highest-peak pod max (1882Mi) * 2. + # Over the limit means OOMKill; memory is not compressible. + memory: 3764Mi + ports: + - name: http + containerPort: 4000 + protocol: TCP + envFrom: + - secretRef: + name: vault-secrets + - configMapRef: + name: kube-cluster-metadata + # Moda creates application-config from config/moda/configuration/*/env.yaml. + - configMapRef: + name: application-config + env: + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + # Sleep before shutdown so Moda drains connections before old pods exit. + # https://thehub.github.com/engineering/products-and-services/internal/moda/feature-documentation/pod-lifecycle/#required-prestop-hook + lifecycle: + preStop: + exec: + command: ['sleep', '5'] + # warmServer() loads about 3500 content files × 9 languages × 9 versions. + # Startup averages 25 seconds and peaked at 48 seconds in Datadog docs.warm_server. + # The server starts listening after warmup, so probes fail at TCP level during boot. + # No app-level readiness flag is needed. + startupProbe: + httpGet: + path: /healthcheck + port: http + # Avoid probes during the average 25-second warmup. + initialDelaySeconds: 30 + periodSeconds: 5 + # Total runway: 30s + 30 × 5s = 180s. + # Covers peak startup plus resource contention when multiple pods boot during a deploy. + failureThreshold: 30 + timeoutSeconds: 5 + readinessProbe: + httpGet: + path: /healthcheck + port: http + periodSeconds: 10 + # 5 × 10s = 50s before the pod leaves the load balancer. + # The healthcheck always returns 200, so failures mean the process is hung or under extreme pressure. + failureThreshold: 5 + timeoutSeconds: 5 + # Skip livenessProbe because healthcheck returns 200 unless the process is fully hung. + # Readiness removes hung pods from load balancing. + # Liveness restarts risk killing pods during GC pauses or transient load spikes. diff --git a/config/kustomize/base/kustomization.yaml b/config/kustomize/base/kustomization.yaml new file mode 100644 index 000000000000..457850241e3e --- /dev/null +++ b/config/kustomize/base/kustomization.yaml @@ -0,0 +1,6 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization + +resources: + - deployments/webapp.yaml + - services/webapp.yaml diff --git a/config/kustomize/base/services/webapp.yaml b/config/kustomize/base/services/webapp.yaml new file mode 100644 index 000000000000..d827cf1b4167 --- /dev/null +++ b/config/kustomize/base/services/webapp.yaml @@ -0,0 +1,22 @@ +# Staging uses this service as is. Production overrides the annotations in +# config/kustomize/overlays/production/services/webapp.yaml. +# The review lab overlay removes it and uses a Tailscale ingress instead. +apiVersion: v1 +kind: Service +metadata: + name: webapp + labels: + service: webapp + annotations: + moda.github.net/domain-name: 'docs-internal-%environment%.service.%region%.github.net' + # Expose the employee website as an internal HTTP load balancer. + moda.github.net/load-balancer-type: internal-http +spec: + ports: + - name: http + port: 4000 + protocol: TCP + targetPort: http + selector: + app: webapp + type: LoadBalancer diff --git a/config/kustomize/overlays/default/kustomization.yaml b/config/kustomize/overlays/default/kustomization.yaml new file mode 100644 index 000000000000..774a422d086a --- /dev/null +++ b/config/kustomize/overlays/default/kustomization.yaml @@ -0,0 +1,5 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization + +resources: + - ../../base diff --git a/config/kustomize/overlays/docs-internal-review-lab/ingresses/http.yaml b/config/kustomize/overlays/docs-internal-review-lab/ingresses/http.yaml new file mode 100644 index 000000000000..3c0f67f013ea --- /dev/null +++ b/config/kustomize/overlays/docs-internal-review-lab/ingresses/http.yaml @@ -0,0 +1,24 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + annotations: + tailscale.com/http-endpoint: 'enabled' + tailscale.com/proxy-group: 'ingress-proxies' + tailscale.com/tags: 'tag:proxima-review-lab' + name: http + namespace: '%namespace%' +spec: + ingressClassName: tailscale + rules: + - http: + paths: + - backend: + service: + name: router + port: + number: 80 + path: / + pathType: Prefix + tls: + - hosts: + - '%namespace%' diff --git a/config/kustomize/overlays/docs-internal-review-lab/kustomization.yaml b/config/kustomize/overlays/docs-internal-review-lab/kustomization.yaml new file mode 100644 index 000000000000..c7410335c7cb --- /dev/null +++ b/config/kustomize/overlays/docs-internal-review-lab/kustomization.yaml @@ -0,0 +1,31 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization + +resources: + - ../../base + - services/router.yaml + - ingresses/http.yaml + +patches: + - target: + kind: Deployment + name: webapp + patch: | + apiVersion: apps/v1 + kind: Deployment + metadata: + name: webapp + spec: + template: + metadata: + annotations: + ad.datadoghq.com/webapp.logs: '[{"source":"nodejs","service":"docs-internal","tags":["env:docs-internal-review-lab"]}]' + - target: + kind: Service + name: webapp + patch: | + apiVersion: v1 + kind: Service + metadata: + name: webapp + $patch: delete diff --git a/config/kustomize/overlays/docs-internal-review-lab/services/router.yaml b/config/kustomize/overlays/docs-internal-review-lab/services/router.yaml new file mode 100644 index 000000000000..844a01df85cb --- /dev/null +++ b/config/kustomize/overlays/docs-internal-review-lab/services/router.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Service +metadata: + name: router + labels: + service: router +spec: + ports: + - name: http + port: 80 + protocol: TCP + targetPort: http + selector: + app: webapp + type: ClusterIP diff --git a/config/kustomize/overlays/production/deployments/webapp.yaml b/config/kustomize/overlays/production/deployments/webapp.yaml new file mode 100644 index 000000000000..57116bd74db9 --- /dev/null +++ b/config/kustomize/overlays/production/deployments/webapp.yaml @@ -0,0 +1,40 @@ +# Production overrides for config/kustomize/base/deployments/webapp.yaml. +apiVersion: apps/v1 +kind: Deployment +metadata: + name: webapp + annotations: + moda.github.net/allow-missing-ready-pods: '0' +spec: + replicas: 6 + strategy: + type: RollingUpdate + rollingUpdate: + # Keep old pods serving until replacements pass readiness. + # Overprovisioning makes the temporary extra capacity safe. + maxUnavailable: 0 + # Scale surge capacity with replica count changes. + maxSurge: '100%' + template: + metadata: + annotations: + ad.datadoghq.com/webapp.logs: '[{"source":"nodejs","service":"docs-internal","tags":["env:production"]}]' + spec: + containers: + - name: webapp + # Retune using 2 weeks of data: + # https://app.datadoghq.com/dashboard/6vx-iun-ghs/moda-resource-recommendations?tpl_var_kube_namespace%5B0%5D=docs-internal-production&from_ts=0&to_ts=1209600000&live=true + # Moda budget uses requests times replicas times clusters. + resources: + requests: + # requests.cpu: median pod p99 (0.32 cores) * 2 for failover headroom. + cpu: 640m + # requests.memory: highest-peak pod p99 (4740Mi) * 1.1 for working-set padding. + memory: 5214Mi + limits: + # limits.cpu: highest warmup peak (2.42 cores) * 3. + # This startup headroom does not count toward budget. + cpu: 7260m + # limits.memory: highest-peak pod max (4813Mi) * 2. + # Over the limit means OOMKill; memory is not compressible. + memory: 9626Mi diff --git a/config/kustomize/overlays/production/kustomization.yaml b/config/kustomize/overlays/production/kustomization.yaml new file mode 100644 index 000000000000..94f65d5bfb37 --- /dev/null +++ b/config/kustomize/overlays/production/kustomization.yaml @@ -0,0 +1,10 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization + +resources: + - ../../base + +# Each patch file merges into the matching base resource by kind and name. +patches: + - path: deployments/webapp.yaml + - path: services/webapp.yaml diff --git a/config/kustomize/overlays/production/services/webapp.yaml b/config/kustomize/overlays/production/services/webapp.yaml new file mode 100644 index 000000000000..e63e5ce2a13f --- /dev/null +++ b/config/kustomize/overlays/production/services/webapp.yaml @@ -0,0 +1,12 @@ +# Production overrides for config/kustomize/base/services/webapp.yaml. +apiVersion: v1 +kind: Service +metadata: + name: webapp + annotations: + moda.github.net/domain-name: 'docs-internal.github.com' + moda.github.net/dns-registration-enabled: 'false' + # Public load balancer. allowed-ips limits it to Fastly IP ranges. + moda.github.net/load-balancer-type: public-external-http + # .github/workflows/moda-allowed-ips.yml updates this list weekly. + moda.github.net/allowed-ips: 23.235.32.0/20,43.249.72.0/22,103.244.50.0/24,103.245.222.0/23,103.245.224.0/24,104.156.80.0/20,140.248.64.0/18,140.248.128.0/17,146.75.0.0/17,151.101.0.0/16,157.52.64.0/18,167.82.0.0/17,167.82.128.0/20,167.82.160.0/20,167.82.224.0/20,172.111.64.0/18,185.31.16.0/22,199.27.72.0/21,199.232.0.0/16 diff --git a/config/moda/deployment.yaml b/config/moda/deployment.yaml index bf8e023bdb93..925bb6bb633d 100644 --- a/config/moda/deployment.yaml +++ b/config/moda/deployment.yaml @@ -191,6 +191,21 @@ environments: region: iad extra_completed_message: ':yew: Review at https://docs-internal-staging-yew.githubapp.com/' + - name: docs-internal-review-lab + require_pipeline: false + require_vault: true + secret_environment: staging + required_review_tasks: [] + auto_deploy: true + skip_auto_merge: true + proxima: true + resource_path: config/kubernetes/docs-internal-review-lab + url: https://docs-internal-{{BRANCH}}.octoca.ts.net + timeout: 900 + cluster_selector: + name: rl-1-test-cnc-01-az1 + extra_completed_message: 'Review at {{ENVIRONMENT_URL}}. This environment is deleted after 24 hours.' + required_builds: - docs-internal-moda-config-bundle / docs-internal-moda-config-bundle - docs-internal-docker-image / docs-internal-docker-image diff --git a/src/deployments/README.md b/src/deployments/README.md index 09d9ef301c0a..5c74b41602c9 100644 --- a/src/deployments/README.md +++ b/src/deployments/README.md @@ -20,6 +20,9 @@ This subject is responsible for: - `production/build-scripts/merge-early-access.sh` - Merges early-access content into production content - `Dockerfile` (root) - Multi-stage Docker build for production deployments - `.github/workflows/moda-ci.yaml` - CI/CD workflow that builds and deploys via Moda +- `config/moda/deployment.yaml` - List of Moda environments: production, staging, and review lab +- `config/kustomize/` - Kustomize source for the Kubernetes config of each environment. See [config/kustomize/README.md](../../config/kustomize/README.md). +- `config/kubernetes/` - Kubernetes config that Kustomize generates. Don't edit it by hand. ## Setup & Usage @@ -52,6 +55,17 @@ To deploy to a staging server: 4. In `#docs-ops` Slack, run: `.deploy docs-internal/ to staging-` 5. Access at `https://docs-staging-.service.iad.github.net` (requires Developer VPN) +### Review lab deployments + +Review labs are temporary environments for a single branch. Each lab deletes itself 24 hours after you create it. + +1. Push your branch to `docs-internal` +2. Wait for `docs-internal Moda CI` checks to pass +3. In `#dotcom-environment-ops` Slack, run: `.proxima-review-lab create from docs-internal/v1 docs-internal=` +4. Access at `https://docs-internal-.octoca.ts.net` (requires Tailscale) + +The `docs-internal-review-lab` environment in `config/moda/deployment.yaml` and the `docs-internal-review-lab` Kustomize overlay define the lab. + ### Running tests No subject-specific tests exist currently. CI/CD validation happens through Moda workflows. From 8defa9f143fae351fc39a34c86fd5cefe27c1afb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Holly=20=F0=9F=A6=92?= <104800384+holly-kassel@users.noreply.github.com> Date: Mon, 12 Oct 2026 15:37:37 +0000 Subject: [PATCH 2/4] Update budget docs for the single-list budgets page (#63755) Co-authored-by: Holly Kassel Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: b1e20412-f3b7-43de-829e-7580a5138a6d --- content/billing/how-tos/set-up-budgets.md | 6 +++--- content/billing/tutorials/control-costs-at-scale.md | 9 +++------ content/billing/tutorials/soft-budgets.md | 2 +- 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/content/billing/how-tos/set-up-budgets.md b/content/billing/how-tos/set-up-budgets.md index a9aa1e4b0fe5..b578d106d318 100644 --- a/content/billing/how-tos/set-up-budgets.md +++ b/content/billing/how-tos/set-up-budgets.md @@ -65,7 +65,7 @@ You can set budgets and receive alerts when your usage of a product reaches 75%, 1. To receive an alert if your budget has reached 75%, 90% and 100% thresholds, select **Receive budget threshold alerts** under "Alerts". When the budget has reached the specific threshold, you will be notified via email and a banner on {% data variables.product.github %}. You may opt out at any time. {% data reusables.billing.budget-create-button %} -To edit or delete a budget, on the "Budget and alerts" page, click **Edit** or **Delete** next to the budget you want to edit or delete. Follow the prompts. +To edit or delete a budget, on the "Budgets and alerts" page, click {% octicon "kebab-horizontal" aria-label="View actions" %} next to the budget, then click **{% octicon "pencil" aria-hidden="true" aria-label="pencil" %} Edit** or **{% octicon "trash" aria-hidden="true" aria-label="trash" %} Delete**. Follow the prompts. ### Managing included usage alerts for your personal account @@ -91,13 +91,13 @@ You can set budgets and receive alerts when your usage of a product or license t ### Viewing budgets -If you are an organization owner, enterprise owner, or billing manager, any account-level budget is listed at the top of the "Budgets and alerts" page, followed by budgets for smaller scopes. +If you are an organization owner, enterprise owner, or billing manager, all of your account's budgets appear in one list on the "Budgets and alerts" page. Each row shows the budget's scope, spending against the budget amount, and status. {% data reusables.billing.nav-to-org-or-ent %} {% data reusables.billing.access-org-or-ent-page %} 1. Click **Budgets and alerts**. -1. Optionally, in the enterprise view only, to filter by scope, select **Scope**, then choose a scope. +1. Optionally, to find specific budgets, choose a scope from the scope dropdown, or use the search bar to filter by scope, product, SKU, or user. ### Creating a budget diff --git a/content/billing/tutorials/control-costs-at-scale.md b/content/billing/tutorials/control-costs-at-scale.md index 6079bf834c20..e31a2b4fdfad 100644 --- a/content/billing/tutorials/control-costs-at-scale.md +++ b/content/billing/tutorials/control-costs-at-scale.md @@ -108,18 +108,15 @@ Create one budget for each product, SKU, or group of SKUs that you want to contr After creating your cost center budgets, check existing enterprise-wide budgets to ensure they don't conflict with or override your new cost center budgets. When budgets overlap, the most restrictive one applies, so a low budget at a higher scope can block a cost center before its own budget is reached. -Navigate to the "Budgets and alerts" page. You'll see two lists of budgets: - -* **Enterprise budgets**: Limits that apply to the whole enterprise account -* **Other budgets**: Limits for specific repositories, organizations, or cost centers +Navigate to the "Budgets and alerts" page. All budgets appear in one list. Use the search bar or the scope dropdown to narrow it by scope. #### Check enterprise budgets -Review whether any enterprise budgets apply to the same products or SKUs as your new cost center budgets. If an enterprise budget is very low, it might block usage for your cost center before the cost center's own budget is reached. Consider deleting or adjusting conflicting enterprise budgets. +Filter the list to enterprise-level budgets. Review whether any enterprise budgets apply to the same products or SKUs as your new cost center budgets. If an enterprise budget is very low, it might block usage for your cost center before the cost center's own budget is reached. Consider deleting or adjusting conflicting enterprise budgets. #### View your cost center budgets -Filter the other budgets list to show a scope of **Cost Centers**. You should see your new cost center with a row for each budget you created. Initially, usage will be near zero, but within a few days you'll see costs accumulating as users and repositories consume products beyond the allowance in their plan. +Filter the list to cost center budgets. You should see your new cost center with a row for each budget you created. Initially, usage will be near zero, but within a few days you'll see costs accumulating as users and repositories consume products beyond the allowance in their plan. ### Troubleshooting budget conflicts diff --git a/content/billing/tutorials/soft-budgets.md b/content/billing/tutorials/soft-budgets.md index 21b5da0410ad..8558eb80e2f3 100644 --- a/content/billing/tutorials/soft-budgets.md +++ b/content/billing/tutorials/soft-budgets.md @@ -43,6 +43,6 @@ When creating the budget, leave **Stop usage when budget limit is reached** unch ## 3. Review and adjust your budget -After setting a soft budget, it's important to regularly monitor your spending to ensure it aligns with your budget goals. You can view your budgets at the top of the "Budgets and alerts" page. +After setting a soft budget, it's important to regularly monitor your spending to ensure it aligns with your budget goals. You can view your budgets on the "Budgets and alerts" page. After a billing cycle, review your budget alerts and adjust the budget amount if needed. As you gain confidence in your spending patterns, you can decide whether any products require stricter controls. If so, edit the budget and enable the **Stop usage when budget limit is reached** option to convert it to a hard budget. From 587e1719fd7d36cc7e3ad0112a2c368ae7306abb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Oct 2026 15:54:31 +0000 Subject: [PATCH 3/4] Bump devcontainers/javascript-node from `c39e4aa` to `02207aa` in /.devcontainer in the baseimages group across 1 directory (#63774) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .devcontainer/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 443aa8e45101..cd8a294621af 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,4 +1,4 @@ # Update ARG and FROM together from the Node devcontainer image tags: # https://mcr.microsoft.com/en-us/product/devcontainers/javascript-node/tags ARG VARIANT=dev-24-bookworm -FROM mcr.microsoft.com/devcontainers/javascript-node:dev-24-bookworm@sha256:c39e4aaf0c7c4da594f845aeb98d37510343bff178b320a6f7e9e2e95ca7957e +FROM mcr.microsoft.com/devcontainers/javascript-node:dev-24-bookworm@sha256:02207aa539c49a8714bd18ba482a05381a42ee4768ea19a39a4c58f2ae6f7644 From 3a3bc2063e4d9cab232c6026a0bf4166a2a1f8d8 Mon Sep 17 00:00:00 2001 From: docs-bot <77750099+docs-bot@users.noreply.github.com> Date: Mon, 12 Oct 2026 16:42:18 +0000 Subject: [PATCH 4/4] GraphQL schema update (#63800) Co-authored-by: github-merge-queue <118344674+github-merge-queue@users.noreply.github.com> --- src/graphql/data/fpt/schema-pulls.json | 4 ++-- src/graphql/data/fpt/schema-repos.json | 2 +- src/graphql/data/fpt/schema.docs.graphql | 9 +++------ src/graphql/data/ghec/schema-pulls.json | 4 ++-- src/graphql/data/ghec/schema-repos.json | 2 +- src/graphql/data/ghec/schema.docs.graphql | 9 +++------ 6 files changed, 12 insertions(+), 18 deletions(-) diff --git a/src/graphql/data/fpt/schema-pulls.json b/src/graphql/data/fpt/schema-pulls.json index 932fb9a87c0e..64e4afa795b1 100644 --- a/src/graphql/data/fpt/schema-pulls.json +++ b/src/graphql/data/fpt/schema-pulls.json @@ -2046,7 +2046,7 @@ "name": "CopilotCodeReviewParameters", "id": "copilotcodereviewparameters", "href": "/graphql/reference/pulls#object-copilotcodereviewparameters", - "description": "

Request Copilot code review for new pull requests automatically if the author\nhas access to Copilot code review and their premium requests quota has not\nreached the limit.

", + "description": "

Request Copilot code review for new pull requests automatically if the author\nhas access to Copilot code review and AI credits.

", "isDeprecated": false, "fields": [ { @@ -9879,7 +9879,7 @@ "name": "CopilotCodeReviewParametersInput", "id": "copilotcodereviewparametersinput", "href": "/graphql/reference/pulls#input-object-copilotcodereviewparametersinput", - "description": "

Request Copilot code review for new pull requests automatically if the author\nhas access to Copilot code review and their premium requests quota has not\nreached the limit.

", + "description": "

Request Copilot code review for new pull requests automatically if the author\nhas access to Copilot code review and AI credits.

", "isDeprecated": false, "inputFields": [ { diff --git a/src/graphql/data/fpt/schema-repos.json b/src/graphql/data/fpt/schema-repos.json index 32794b31426d..fdd049200b5d 100644 --- a/src/graphql/data/fpt/schema-repos.json +++ b/src/graphql/data/fpt/schema-repos.json @@ -9414,7 +9414,7 @@ }, { "name": "COPILOT_CODE_REVIEW", - "description": "

Request Copilot code review for new pull requests automatically if the author\nhas access to Copilot code review and their premium requests quota has not\nreached the limit.

" + "description": "

Request Copilot code review for new pull requests automatically if the author\nhas access to Copilot code review and AI credits.

" }, { "name": "CREATION", diff --git a/src/graphql/data/fpt/schema.docs.graphql b/src/graphql/data/fpt/schema.docs.graphql index c77c99f24a74..7fd1c0a2d5b3 100644 --- a/src/graphql/data/fpt/schema.docs.graphql +++ b/src/graphql/data/fpt/schema.docs.graphql @@ -7816,8 +7816,7 @@ type ConvertedToDiscussionEvent implements Node @docsCategory(name: "issues") { """ Request Copilot code review for new pull requests automatically if the author -has access to Copilot code review and their premium requests quota has not -reached the limit. +has access to Copilot code review and AI credits. """ type CopilotCodeReviewParameters @docsCategory(name: "pulls") { """ @@ -7833,8 +7832,7 @@ type CopilotCodeReviewParameters @docsCategory(name: "pulls") { """ Request Copilot code review for new pull requests automatically if the author -has access to Copilot code review and their premium requests quota has not -reached the limit. +has access to Copilot code review and AI credits. """ input CopilotCodeReviewParametersInput @docsCategory(name: "pulls") { """ @@ -58195,8 +58193,7 @@ enum RepositoryRuleType { """ Request Copilot code review for new pull requests automatically if the author - has access to Copilot code review and their premium requests quota has not - reached the limit. + has access to Copilot code review and AI credits. """ COPILOT_CODE_REVIEW diff --git a/src/graphql/data/ghec/schema-pulls.json b/src/graphql/data/ghec/schema-pulls.json index 9079f1eb9fd5..8351bcee7b27 100644 --- a/src/graphql/data/ghec/schema-pulls.json +++ b/src/graphql/data/ghec/schema-pulls.json @@ -2046,7 +2046,7 @@ "name": "CopilotCodeReviewParameters", "id": "copilotcodereviewparameters", "href": "/graphql/reference/pulls#object-copilotcodereviewparameters", - "description": "

Request Copilot code review for new pull requests automatically if the author\nhas access to Copilot code review and their premium requests quota has not\nreached the limit.

", + "description": "

Request Copilot code review for new pull requests automatically if the author\nhas access to Copilot code review and AI credits.

", "isDeprecated": false, "fields": [ { @@ -9879,7 +9879,7 @@ "name": "CopilotCodeReviewParametersInput", "id": "copilotcodereviewparametersinput", "href": "/graphql/reference/pulls#input-object-copilotcodereviewparametersinput", - "description": "

Request Copilot code review for new pull requests automatically if the author\nhas access to Copilot code review and their premium requests quota has not\nreached the limit.

", + "description": "

Request Copilot code review for new pull requests automatically if the author\nhas access to Copilot code review and AI credits.

", "isDeprecated": false, "inputFields": [ { diff --git a/src/graphql/data/ghec/schema-repos.json b/src/graphql/data/ghec/schema-repos.json index 0ee8d0e55726..8aa62538cad2 100644 --- a/src/graphql/data/ghec/schema-repos.json +++ b/src/graphql/data/ghec/schema-repos.json @@ -9414,7 +9414,7 @@ }, { "name": "COPILOT_CODE_REVIEW", - "description": "

Request Copilot code review for new pull requests automatically if the author\nhas access to Copilot code review and their premium requests quota has not\nreached the limit.

" + "description": "

Request Copilot code review for new pull requests automatically if the author\nhas access to Copilot code review and AI credits.

" }, { "name": "CREATION", diff --git a/src/graphql/data/ghec/schema.docs.graphql b/src/graphql/data/ghec/schema.docs.graphql index c77c99f24a74..7fd1c0a2d5b3 100644 --- a/src/graphql/data/ghec/schema.docs.graphql +++ b/src/graphql/data/ghec/schema.docs.graphql @@ -7816,8 +7816,7 @@ type ConvertedToDiscussionEvent implements Node @docsCategory(name: "issues") { """ Request Copilot code review for new pull requests automatically if the author -has access to Copilot code review and their premium requests quota has not -reached the limit. +has access to Copilot code review and AI credits. """ type CopilotCodeReviewParameters @docsCategory(name: "pulls") { """ @@ -7833,8 +7832,7 @@ type CopilotCodeReviewParameters @docsCategory(name: "pulls") { """ Request Copilot code review for new pull requests automatically if the author -has access to Copilot code review and their premium requests quota has not -reached the limit. +has access to Copilot code review and AI credits. """ input CopilotCodeReviewParametersInput @docsCategory(name: "pulls") { """ @@ -58195,8 +58193,7 @@ enum RepositoryRuleType { """ Request Copilot code review for new pull requests automatically if the author - has access to Copilot code review and their premium requests quota has not - reached the limit. + has access to Copilot code review and AI credits. """ COPILOT_CODE_REVIEW