Skip to content

Commit a3aeae0

Browse files
authored
add upgrade test (#2342)
Merging codes shouldn't affect other tests; to actually run the upgrade test, it needs to be force-merged.
1 parent fce297e commit a3aeae0

File tree

7 files changed

+274
-2
lines changed

7 files changed

+274
-2
lines changed

.ibm/pipelines/env_variables.sh

+2-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ NAME_SPACE_RUNTIME="${NAME_SPACE_RUNTIME:-showcase-runtime}"
2727
NAME_SPACE_POSTGRES_DB="${NAME_SPACE_POSTGRES_DB:-postgress-external-db}"
2828
NAME_SPACE_SANITY_PLUGINS_CHECK="showcase-sanity-plugins"
2929
OPERATOR_MANAGER='rhdh-operator'
30-
CHART_VERSION="2.15.2" # Fixed version should be used for release branches.
30+
CHART_VERSION="3.2.0" # Fixed version should be used for release branches.
31+
CHART_VERSION_BASE="2.25.0"
3132
GITHUB_APP_APP_ID=$(cat /tmp/secrets/GITHUB_APP_3_APP_ID)
3233
GITHUB_APP_CLIENT_ID=$(cat /tmp/secrets/GITHUB_APP_3_CLIENT_ID)
3334
GITHUB_APP_PRIVATE_KEY=$(cat /tmp/secrets/GITHUB_APP_3_PRIVATE_KEY)

.ibm/pipelines/jobs/upgrade.sh

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#!/bin/bash
2+
3+
handle_upgrade() {
4+
export NAME_SPACE="showcase-upgrade-nightly"
5+
export NAME_SPACE_POSTGRES_DB="${NAME_SPACE}-postgres-external-db"
6+
export DEPLOYMENT_NAME="rhdh-backstage"
7+
export TAG_NAME_BASE="1.4"
8+
export HELM_CHART_VALUE_FILE_NAME_BASE="values_showcase_${TAG_NAME_BASE}.yaml"
9+
10+
configure_namespace "${NAME_SPACE}"
11+
12+
oc_login
13+
echo "OCP version: $(oc version)"
14+
export K8S_CLUSTER_ROUTER_BASE=$(oc get route console -n openshift-console -o=jsonpath='{.spec.host}' | sed 's/^[^.]*\.//')
15+
16+
cluster_setup
17+
initiate_upgrade_base_deployments
18+
19+
local url="https://${RELEASE_NAME}-backstage-${NAME_SPACE}.${K8S_CLUSTER_ROUTER_BASE}"
20+
21+
initiate_upgrade_deployments "${RELEASE_NAME}" "${NAME_SPACE}" "${url}"
22+
check_upgrade_and_test "${DEPLOYMENT_NAME}" "${RELEASE_NAME}" "${NAME_SPACE}" "${url}"
23+
}

.ibm/pipelines/openshift-ci-tests.sh

+5
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ SCRIPTS=(
3232
"jobs/gke.sh"
3333
"jobs/main.sh"
3434
"jobs/operator.sh"
35+
"jobs/upgrade.sh"
3536
"jobs/periodic.sh"
3637
"jobs/auth-providers.sh"
3738
)
@@ -63,6 +64,10 @@ main() {
6364
echo "Calling Operator"
6465
handle_operator
6566
;;
67+
*upgrade*)
68+
echo "Calling helm upgrade"
69+
handle_upgrade
70+
;;
6671
*nightly*)
6772
echo "Calling handle_periodic"
6873
handle_nightly

.ibm/pipelines/utils.sh

+84-1
Original file line numberDiff line numberDiff line change
@@ -791,7 +791,7 @@ delete_tekton_pipelines() {
791791
' || echo "Warning: Timed out waiting for namespace deletion, continuing..."
792792
else
793793
echo "Tekton Pipelines is not installed. Nothing to delete."
794-
fi
794+
fi
795795
}
796796

797797
cluster_setup() {
@@ -840,6 +840,59 @@ initiate_deployments() {
840840
--set upstream.backstage.image.tag="${TAG_NAME}"
841841
}
842842

843+
# install base RHDH deployment before upgrade
844+
initiate_upgrade_base_deployments() {
845+
echo "Initiating base RHDH deployment before upgrade"
846+
847+
# Deploy redis cache db.
848+
oc apply -f "$DIR/resources/redis-cache/redis-deployment.yaml" --namespace="${NAME_SPACE}"
849+
850+
cd "${DIR}"
851+
local rhdh_base_url="https://${RELEASE_NAME}-backstage-${NAME_SPACE}.${K8S_CLUSTER_ROUTER_BASE}"
852+
apply_yaml_files "${DIR}" "${NAME_SPACE}" "${rhdh_base_url}"
853+
echo "Deploying image from repository: ${QUAY_REPO_BASE}, TAG_NAME: ${TAG_NAME_BASE}, in NAME_SPACE: ${NAME_SPACE}"
854+
855+
helm upgrade -i "${RELEASE_NAME}" -n "${NAME_SPACE}" \
856+
"${HELM_REPO_NAME}/${HELM_IMAGE_NAME}" --version "${CHART_VERSION_BASE}" \
857+
-f "${DIR}/value_files/${HELM_CHART_VALUE_FILE_NAME_BASE}" \
858+
--set global.clusterRouterBase="${K8S_CLUSTER_ROUTER_BASE}" \
859+
--set upstream.backstage.image.repository="${QUAY_REPO_BASE}" \
860+
--set upstream.backstage.image.tag="${TAG_NAME_BASE}"
861+
}
862+
863+
initiate_upgrade_deployments() {
864+
local release_name=$1
865+
local namespace=$2
866+
local url=$3
867+
local max_attempts=${4:-30} # Default to 30 if not set
868+
local wait_seconds=${5:-30}
869+
local wait_upgrade="10m"
870+
871+
# check if the base rhdh deployment is running
872+
if check_backstage_running "${release_name}" "${namespace}" "${url}" "${max_attempts}" "${wait_seconds}"; then
873+
874+
echo "Display pods of base RHDH deployment before upgrade for verification..."
875+
oc get pods -n "${namespace}"
876+
877+
echo "Initiating upgrade deployment"
878+
cd "${DIR}"
879+
880+
echo "Deploying image from repository: ${QUAY_REPO}, TAG_NAME: ${TAG_NAME}, in NAME_SPACE: ${NAME_SPACE}"
881+
882+
helm upgrade -i "${RELEASE_NAME}" -n "${NAME_SPACE}" \
883+
"${HELM_REPO_NAME}/${HELM_IMAGE_NAME}" \
884+
-f "${DIR}/value_files/${HELM_CHART_VALUE_FILE_NAME}" \
885+
--set global.clusterRouterBase="${K8S_CLUSTER_ROUTER_BASE}" \
886+
--set upstream.backstage.image.repository="${QUAY_REPO}" \
887+
--set upstream.backstage.image.tag="${TAG_NAME}" \
888+
--wait --timeout=${wait_upgrade}
889+
890+
oc get pods -n "${namespace}"
891+
else
892+
echo "Backstage is not running. Exiting..."
893+
fi
894+
}
895+
843896
initiate_runtime_deployment() {
844897
local release_name=$1
845898
local namespace=$2
@@ -893,6 +946,36 @@ check_and_test() {
893946
save_all_pod_logs $namespace
894947
}
895948

949+
check_upgrade_and_test() {
950+
local deployment_name="$1"
951+
local release_name="$2"
952+
local namespace="$3"
953+
local url=$4
954+
local timeout=${5:-600} # Timeout in seconds (default: 600 seconds)
955+
956+
if check_helm_upgrade "${deployment_name}" "${namespace}" "${timeout}"; then
957+
check_and_test "${release_name}" "${namespace}" "${url}"
958+
else
959+
echo "Helm upgrade encountered an issue or timed out. Exiting..."
960+
fi
961+
}
962+
963+
check_helm_upgrade() {
964+
local deployment_name="$1"
965+
local namespace="$2"
966+
local timeout="$3"
967+
968+
echo "Checking rollout status for deployment: ${deployment_name} in namespace: ${namespace}..."
969+
970+
if oc rollout status "deployment/${deployment_name}" -n "${namespace}" --timeout="${timeout}s" -w; then
971+
echo "RHDH upgrade is complete."
972+
return 0
973+
else
974+
echo "RHDH upgrade encountered an issue or timed out."
975+
return 1
976+
fi
977+
}
978+
896979
# Function to remove finalizers from specific resources in a namespace that are blocking deletion.
897980
remove_finalizers_from_resources() {
898981
local project=$1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
global:
2+
dynamic:
3+
# -- Array of YAML files listing dynamic plugins to include with those listed in the `plugins` field.
4+
# Relative paths are resolved from the working directory of the initContainer that will install the plugins (`/opt/app-root/src`).
5+
includes:
6+
# -- List of dynamic plugins included inside the `rhdh-community/rhdh` container image, some of which are disabled by default.
7+
# This file ONLY works with the `rhdh-community/rhdh` container image.
8+
- "dynamic-plugins.default.yaml"
9+
10+
# -- List of dynamic plugins, possibly overriding the plugins listed in `includes` files.
11+
# Every item defines the plugin `package` as a [NPM package spec](https://docs.npmjs.com/cli/v10/using-npm/package-spec),
12+
# an optional `pluginConfig` with plugin-specific backstage configuration, and an optional `disabled` flag to disable/enable a plugin
13+
# listed in `includes` files. It also includes an `integrity` field that is used to verify the plugin package [integrity](https://w3c.github.io/webappsec-subresource-integrity/#integrity-metadata-description).
14+
plugins:
15+
- package: ./dynamic-plugins/dist/backstage-plugin-scaffolder-backend-module-github-dynamic
16+
disabled: false
17+
- package: ./dynamic-plugins/dist/backstage-plugin-catalog-backend-module-github-dynamic
18+
disabled: false
19+
pluginConfig:
20+
catalog:
21+
providers:
22+
github:
23+
my-test-org:
24+
organization: janus-qe
25+
catalogPath: "/catalog-info.yaml"
26+
schedule:
27+
frequency:
28+
minutes: 1
29+
timeout:
30+
minutes: 1
31+
initialDelay:
32+
seconds: 15
33+
- package: ./dynamic-plugins/dist/backstage-plugin-catalog-backend-module-github-org-dynamic
34+
disabled: false
35+
- package: ./dynamic-plugins/dist/backstage-community-plugin-github-issues
36+
disabled: false
37+
- package: ./dynamic-plugins/dist/roadiehq-backstage-plugin-github-pull-requests
38+
disabled: false
39+
- package: ./dynamic-plugins/dist/backstage-community-plugin-github-actions
40+
disabled: false
41+
- package: ./dynamic-plugins/dist/backstage-community-plugin-quay
42+
disabled: false
43+
- package: ./dynamic-plugins/dist/backstage-community-plugin-catalog-backend-module-keycloak-dynamic
44+
disabled: false
45+
- package: ./dynamic-plugins/dist/backstage-community-plugin-tekton
46+
disabled: false
47+
- package: ./dynamic-plugins/dist/backstage-plugin-kubernetes
48+
disabled: false
49+
- package: ./dynamic-plugins/dist/backstage-plugin-kubernetes-backend-dynamic
50+
disabled: false
51+
pluginConfig:
52+
kubernetes:
53+
clusterLocatorMethods:
54+
- clusters:
55+
- authProvider: serviceAccount
56+
name: "my-cluster"
57+
serviceAccountToken: ${K8S_CLUSTER_TOKEN_ENCODED}
58+
url: ${K8S_CLUSTER_API_SERVER_URL}
59+
type: config
60+
customResources:
61+
# Add for tekton
62+
- apiVersion: "v1"
63+
group: "tekton.dev"
64+
plural: "pipelines"
65+
- apiVersion: v1
66+
group: tekton.dev
67+
plural: pipelineruns
68+
- apiVersion: v1
69+
group: tekton.dev
70+
plural: taskruns
71+
# Add for topology plugin
72+
- apiVersion: "v1"
73+
group: "route.openshift.io"
74+
plural: "routes"
75+
serviceLocatorMethod:
76+
type: multiTenant
77+
# Enable OCM plugins.
78+
- package: ./dynamic-plugins/dist/backstage-community-plugin-ocm-backend-dynamic
79+
disabled: false
80+
pluginConfig:
81+
catalog:
82+
providers:
83+
ocm:
84+
default:
85+
name: testCluster # Can be any arbitrary name supported by kubernetes
86+
url: ${OCM_CLUSTER_URL}
87+
serviceAccountToken: ${OCM_CLUSTER_TOKEN}
88+
skipTLSVerify: true
89+
owner: janus-authors
90+
- package: ./dynamic-plugins/dist/backstage-community-plugin-ocm
91+
disabled: false
92+
# Enable bulk import plugins.
93+
- package: ./dynamic-plugins/dist/red-hat-developer-hub-backstage-plugin-bulk-import-backend-dynamic
94+
disabled: false
95+
- package: ./dynamic-plugins/dist/red-hat-developer-hub-backstage-plugin-bulk-import
96+
disabled: false
97+
# Enable tech-radar plugins.
98+
- package: ./dynamic-plugins/dist/backstage-community-plugin-tech-radar
99+
disabled: false
100+
- package: ./dynamic-plugins/dist/backstage-community-plugin-tech-radar-backend-dynamic
101+
disabled: false
102+
- package: ./dynamic-plugins/dist/backstage-community-plugin-acr
103+
disabled: false
104+
- package: ./dynamic-plugins/dist/roadiehq-scaffolder-backend-module-http-request-dynamic
105+
disabled: false
106+
- package: ./dynamic-plugins/dist/backstage-community-plugin-catalog-backend-module-scaffolder-relation-processor-dynamic
107+
disabled: false
108+
- package: ./dynamic-plugins/dist/immobiliarelabs-backstage-plugin-gitlab-backend-dynamic
109+
disabled: false
110+
- package: ./dynamic-plugins/dist/backstage-plugin-catalog-backend-module-gitlab-dynamic
111+
disabled: false
112+
- package: ./dynamic-plugins/dist/backstage-community-plugin-topology
113+
disabled: false
114+
- package: "@pataknight/[email protected]"
115+
disabled: false
116+
integrity: sha512-srTnFDYn3Ett6z33bX4nL2NQY8wqux8TkpgBQNsE8S73nMfsor/wAdmVgHL+xW7pxQ09DT4YTdaG3GkH+cyyNQ==
117+
118+
# -- Upstream Backstage [chart configuration](https://github.com/backstage/charts/blob/main/charts/backstage/values.yaml)
119+
upstream:
120+
nameOverride: backstage
121+
commonLabels:
122+
backstage.io/kubernetes-id: developer-hub
123+
backstage:
124+
image:
125+
pullPolicy: Always
126+
registry: quay.io
127+
repository: rhdh-community/rhdh
128+
tag: next
129+
extraEnvVars:
130+
- name: BACKEND_SECRET
131+
valueFrom:
132+
secretKeyRef:
133+
key: backend-secret
134+
name: '{{ include "janus-idp.backend-secret-name" $ }}'
135+
- name: POSTGRESQL_ADMIN_PASSWORD
136+
valueFrom:
137+
secretKeyRef:
138+
key: postgres-password
139+
name: "{{ .Release.Name }}-postgresql"
140+
# disable telemetry in CI
141+
- name: SEGMENT_TEST_MODE
142+
value: "true"
143+
- name: NODE_OPTIONS
144+
value: "--no-node-snapshot"
145+
extraAppConfig:
146+
- configMapRef: app-config-rhdh
147+
filename: app-config-rhdh.yaml
148+
extraEnvVarsSecrets:
149+
- rhdh-secrets
150+
- redis-secret
151+
ingress:
152+
host: "{{ .Values.global.host }}"

e2e-tests/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
"showcase-operator-nightly": "playwright test --project=showcase-operator",
1818
"showcase-op-rbac-nightly": "playwright test --project=showcase-operator-rbac",
1919
"showcase-runtime": "playwright test --project=showcase-runtime",
20+
"showcase-upgrade-nightly": "playwright test --project=showcase-upgrade",
2021
"showcase-auth-providers": "playwright test --project=showcase-auth-providers --workers 1",
2122
"showcase-sanity-plugins": "playwright test --project=showcase-sanity-plugins",
2223
"lint:check": "eslint . --ext .js,.ts",

e2e-tests/playwright.config.ts

+7
Original file line numberDiff line numberDiff line change
@@ -168,5 +168,12 @@ export default defineConfig({
168168
name: "any-test",
169169
testMatch: "**/*.spec.ts", // Allows running any test file
170170
},
171+
{
172+
name: "showcase-upgrade",
173+
testMatch: [
174+
"**/playwright/e2e/home-page-customization.spec.ts",
175+
"**/playwright/e2e/plugins/quick-access-and-tech-radar.spec.ts",
176+
],
177+
},
171178
],
172179
});

0 commit comments

Comments
 (0)