Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
1060841
Changes for TestZeus
shriyanshagnihotri Sep 20, 2025
4d52963
Add Helm charts and GitHub Actions deployment workflow for trace-viewer
secops-zeus Mar 11, 2026
f227873
Downgrade service-template to ~0.5.0
secops-zeus Mar 11, 2026
d1cc6ce
Remove spot tolerations
secops-zeus Mar 11, 2026
73a99ea
Scrub secrets from values files
secops-zeus Mar 11, 2026
9ae3dd8
Refactor to ExternalSecrets and HttpRoute structure
secops-zeus Mar 12, 2026
d82e796
Add Dockerfile and Nginx configuration for trace-viewer
secops-zeus Mar 12, 2026
eb0bddf
Refine Helm chart templates and values for playwright deployment
secops-zeus Mar 12, 2026
4b3b3ec
Update GitHub deployment workflow with Helm repository selection
secops-zeus Mar 12, 2026
d5c549d
Standardize Helm values: set replicaCount to 1 and remove autoscaling…
secops-zeus Mar 13, 2026
9215dc2
Cleanup dead outputs in deployment workflow
secops-zeus Mar 13, 2026
7f61c9e
Update gateway name and namespace in dev values
secops-zeus Mar 13, 2026
19b920a
feat(helm/deploy): fix HTTPRoute, align hostnames/resources, add helm…
secops-zeus Mar 17, 2026
62c2edd
Merge pull request #1 from test-zeus-ai/values-update-helm
secops-zeus Mar 17, 2026
4bf8b49
fix(ci/helm): use dev config for main-prod push, prod only on manual …
secops-zeus Mar 17, 2026
c2a87ad
Merge pull request #2 from test-zeus-ai/values-update-helm
secops-zeus Mar 17, 2026
75dd660
fix(helm): correct HTTPRoute path format to match other services
secops-zeus Mar 17, 2026
312f40a
Merge pull request #3 from test-zeus-ai/values-update-helm
secops-zeus Mar 17, 2026
19aa961
fix(helm): align containerPort, env, probes, service port, and securi…
secops-zeus Mar 17, 2026
4522d3e
Merge pull request #4 from test-zeus-ai/values-update-helm
secops-zeus Mar 17, 2026
cc683d1
ci: configure dynamic GKE runner IP whitelist and dry-run client
secops-zeus Mar 20, 2026
c236271
Persist runtime GSA mapping in Helm values
secops-zeus Mar 26, 2026
f2e9ec2
Merge pull request #5 from test-zeus-ai/values-update-helm
secops-zeus Mar 26, 2026
e90a267
Let traceviewer runtime GSA come from Helm values
secops-zeus Mar 27, 2026
ff7d457
Merge pull request #6 from test-zeus-ai/values-update-helm
secops-zeus Mar 27, 2026
c294087
Add dev2/dev3 values
secops-zeus Mar 30, 2026
1cdf6d0
Add dev2/dev3 workflow dispatch support
secops-zeus Mar 31, 2026
716e645
Add dev1/dev2/dev3 deployment guide
secops-zeus Mar 31, 2026
3690ce2
updated helm workflow
secops-zeus Apr 1, 2026
d0431fd
Merge branch 'main-prod' of github.com:test-zeus-ai/playwright into v…
secops-zeus Apr 1, 2026
94573ea
Merge pull request #7 from test-zeus-ai/values-update-helm
secops-zeus Apr 1, 2026
85593e6
Add workflow_dispatch workflow
secops-zeus Apr 1, 2026
13dcccf
updated helm workflow
secops-zeus Apr 1, 2026
af02ab7
updated helm values
secops-zeus Apr 1, 2026
cb28e57
Merge pull request #9 from test-zeus-ai/values-update-helm
secops-zeus Apr 1, 2026
4772d91
updated helm workflow
secops-zeus Apr 1, 2026
c603255
updated helm values
secops-zeus Apr 1, 2026
9e49c43
Merge pull request #10 from test-zeus-ai/values-update-helm
secops-zeus Apr 2, 2026
90daf84
Add workflow_dispatch workflow
secops-zeus Apr 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
358 changes: 358 additions & 0 deletions .github/workflows/deploy.yaml

Large diffs are not rendered by default.

10 changes: 10 additions & 0 deletions helm/Chart.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
apiVersion: v2
name: trace-viewer
version: 1.0.0
description: Playwright trace viewer
type: application

dependencies:
- name: service-template
version: "~0.5.0"
repository: "oci://us-central1-docker.pkg.dev/prod-testarmy/helm-repository-prod"
60 changes: 60 additions & 0 deletions helm/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
# Helm Documentation: testzeus-traceviewer

This directory contains the Helm chart for deploying `testzeus-traceviewer` to GKE.

## Deployment

### Development
```bash
helm upgrade --install traceviewer ./helm -f ./helm/values-dev.yaml --namespace testzeus-dev
```

### Production
```bash
helm upgrade --install traceviewer ./helm -f ./helm/values-prod.yaml --namespace testzeus-prod
```

## Infrastructure Notes

- **Ingress**: Managed through Gateway API in the target environment.
- **Workload Identity**: `values-dev.yaml` and `values-prod.yaml` annotate the Kubernetes service account with the shared runtime GSA for each environment. The matching IAM `roles/iam.workloadIdentityUser` binding must exist in GCP.

## Dev2/Dev3 Deploys

To deploy into the shared dev2/dev3 namespaces:

```bash
# Dev2
helm upgrade <release-name> . -f values-dev2.yaml -n testzeus-dev2 --install

# Dev3
helm upgrade <release-name> . -f values-dev3.yaml -n testzeus-dev3 --install
```

These values files are intended for branch overrides in dev2/dev3 while `dev` remains the fixed dev environment.

## Deployment Guide: dev / dev2 / dev3

### dev (testzeus-dev)
- **Branch:** `dev` (fixed)
- **Trigger:** push to `dev`
- **Namespace:** `testzeus-dev`
- **Values:** `values-dev.yaml`

### dev2 / dev3 (branch overrides)
- **Trigger:** GitHub Actions `workflow_dispatch`
- **Namespaces:** `testzeus-dev2`, `testzeus-dev3`
- **Values:** `values-dev2.yaml`, `values-dev3.yaml`
- **Branch:** any branch provided in the workflow inputs

**Workflow inputs:**
- `target_env`: `dev2` or `dev3`
- `branch`: the branch you want to deploy (e.g. `feature/foo`)

**Example:**
- `target_env=dev2`, `branch=feature/foo`
- `target_env=dev3`, `branch=bugfix/streaming`

Notes:
- `dev` remains fixed to `testzeus-dev` and always deploys from `dev` branch.
- `dev2`/`dev3` are intended for branch testing only.
33 changes: 33 additions & 0 deletions helm/templates/NOTES.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
{{- $values := index .Values "service-template" -}}
{{- $serviceName := $values.fullnameOverride | default (printf "%s-service-template" .Release.Name) -}}
1. Get the application URL by running these commands:
{{- if $values.service }}
{{- if contains "LoadBalancer" ($values.service.type | default "ClusterIP") }}
NOTE: It may take a few minutes for the LoadBalancer IP to be available.
You can watch the status by running 'kubectl get svc -w {{ $serviceName }}'
export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ $serviceName }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}")
echo http://$SERVICE_IP:{{ $values.service.port | default 80 }}
{{- else if contains "ClusterIP" ($values.service.type | default "ClusterIP") }}
{{- $appName := $values.fullnameOverride | default "service-template" -}}
export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ $appName }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
echo "Visit http://127.0.0.1:8080 to use your application"
{{- $containerPort := 8080 -}}
{{- if $values.containers -}}
{{- if (index $values.containers 0).ports -}}
{{- $containerPort = (index (index $values.containers 0).ports 0).containerPort | default 8080 -}}
{{- end -}}
{{- end -}}
kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:{{ $containerPort }}
{{- else if contains "NodePort" ($values.service.type | default "ClusterIP") }}
export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ $serviceName }})
export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}")
echo http://$NODE_IP:$NODE_PORT
{{- end }}
{{- end }}

{{- if and $values.autoscaling (and $values.autoscaling.enabled (and $values.vpa $values.vpa.enabled)) }}
WARNING: Both HPA and VPA are enabled. This is a conflicting configuration as both will try to manage resources for the same workload.
{{- end }}
{{- if and $values.persistentStorage (and $values.persistentStorage.enabled (eq $values.persistentStorage.accessMode "ReadWriteOnce") (gt (int ($values.replicaCount | default 1)) 1)) }}
WARNING: persistentStorage is enabled with ReadWriteOnce access mode but replicaCount is greater than 1. Only one pod will be able to mount the volume.
{{- end }}
74 changes: 74 additions & 0 deletions helm/values-dev.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
service-template:
fullnameOverride: "testzeus-traceviewer"
replicaCount: 1

serviceAccount:
create: true
name: "testzeus-traceviewer-sa"
automount: false # nginx does not call the K8s API
annotations:
iam.gke.io/gcp-service-account: "gke-runtime-dev@dev-testzeus.iam.gserviceaccount.com"

podSecurityContext:
seccompProfile:
type: RuntimeDefault

containers:
- name: trace-viewer
image:
repository: "us-central1-docker.pkg.dev/GCP_PROJECT_ID_DEV/GAR_DOCKER_REPOSITORY_DEV"
tag: latest
pullPolicy: Always
ports:
- containerPort: 80
env:
- name: HOST
value: "0.0.0.0"
- name: PORT
value: "80"
- name: NODE_ENV
value: development
resources:
requests:
cpu: "250m"
memory: "512Mi"
limits:
cpu: "500m"
memory: "512Mi"
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
periodSeconds: 10
failureThreshold: 3
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 10
periodSeconds: 20
failureThreshold: 3
securityContext: {}

service:
enabled: true
type: ClusterIP
port: 80
targetPort: 80

httpRoute:
enabled: true
parentRefs:
- name: testzeus-gateway
namespace: testzeus
sectionName: https
hostnames:
- "tzviewer.dev.testzeus.app"
rules:
- matches:
- path: /
pathType: PathPrefix

secrets:
enabled: false # No secrets for trace-viewer yet
74 changes: 74 additions & 0 deletions helm/values-dev4.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
service-template:
fullnameOverride: "testzeus-traceviewer"
replicaCount: 1

serviceAccount:
create: true
name: "testzeus-traceviewer-sa"
automount: false # nginx does not call the K8s API
annotations:
iam.gke.io/gcp-service-account: "gke-runtime-dev@dev-testzeus.iam.gserviceaccount.com"

podSecurityContext:
seccompProfile:
type: RuntimeDefault

containers:
- name: trace-viewer
image:
repository: "us-central1-docker.pkg.dev/GCP_PROJECT_ID_DEV/GAR_DOCKER_REPOSITORY_DEV"
tag: latest
pullPolicy: Always
ports:
- containerPort: 80
env:
- name: HOST
value: "0.0.0.0"
- name: PORT
value: "80"
- name: NODE_ENV
value: development
resources:
requests:
cpu: "250m"
memory: "512Mi"
limits:
cpu: "500m"
memory: "512Mi"
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
periodSeconds: 10
failureThreshold: 3
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 10
periodSeconds: 20
failureThreshold: 3
securityContext: {}

service:
enabled: true
type: ClusterIP
port: 80
targetPort: 80

httpRoute:
enabled: true
parentRefs:
- name: testzeus-gateway
namespace: testzeus
sectionName: https
hostnames:
- "tzviewer.dev4.testzeus.app"
rules:
- matches:
- path: /
pathType: PathPrefix

secrets:
enabled: false # No secrets for trace-viewer yet
74 changes: 74 additions & 0 deletions helm/values-dev5.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
service-template:
fullnameOverride: "testzeus-traceviewer"
replicaCount: 1

serviceAccount:
create: true
name: "testzeus-traceviewer-sa"
automount: false # nginx does not call the K8s API
annotations:
iam.gke.io/gcp-service-account: "gke-runtime-dev@dev-testzeus.iam.gserviceaccount.com"

podSecurityContext:
seccompProfile:
type: RuntimeDefault

containers:
- name: trace-viewer
image:
repository: "us-central1-docker.pkg.dev/GCP_PROJECT_ID_DEV/GAR_DOCKER_REPOSITORY_DEV"
tag: latest
pullPolicy: Always
ports:
- containerPort: 80
env:
- name: HOST
value: "0.0.0.0"
- name: PORT
value: "80"
- name: NODE_ENV
value: development
resources:
requests:
cpu: "250m"
memory: "512Mi"
limits:
cpu: "500m"
memory: "512Mi"
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
periodSeconds: 10
failureThreshold: 3
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 10
periodSeconds: 20
failureThreshold: 3
securityContext: {}

service:
enabled: true
type: ClusterIP
port: 80
targetPort: 80

httpRoute:
enabled: true
parentRefs:
- name: testzeus-gateway
namespace: testzeus
sectionName: https
hostnames:
- "tzviewer.dev5.testzeus.app"
rules:
- matches:
- path: /
pathType: PathPrefix

secrets:
enabled: false # No secrets for trace-viewer yet
Loading
Loading