Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
712b864
Chore: devcontainer fail fast, posix equality, force docker gid
tstephen-nhs Nov 3, 2025
b2ebc80
chore: provide docker gid from env
tstephen-nhs Nov 4, 2025
c330f5c
Merge branches 'aea-0000-devcontainer-docker' and 'main' of github.co…
connoravo-nhs Nov 5, 2025
60d7d77
Merge branch 'main' of github.com-nhs:NHSDigital/prescriptionsforpati…
connoravo-nhs Nov 12, 2025
7c85ef3
Merge branch 'main' of github.com-nhs:NHSDigital/prescriptionsforpati…
connoravo-nhs Dec 9, 2025
2ffc014
WIP - Modify pipeline & include full spec
connoravo-nhs Dec 11, 2025
4c10f79
Remove specification as TS package
connoravo-nhs Dec 15, 2025
398771c
Pipeline kickoff
connoravo-nhs Dec 15, 2025
44ab332
Merge branch 'main' into AEA-6037
connoravo-nhs Dec 15, 2025
519d0c5
Pipeline kickoff
connoravo-nhs Dec 15, 2025
0382173
Pipeline kickoff
connoravo-nhs Dec 15, 2025
590d8f6
Merge branch 'AEA-6037' of github.com-nhs:NHSDigital/prescriptionsfor…
connoravo-nhs Dec 15, 2025
ad0dbf4
Pipeline kickoff2
connoravo-nhs Dec 15, 2025
8af4e50
NPM run redocly #skip-qc
connoravo-nhs Dec 15, 2025
08e1e78
Remove unneccessary dependencies
connoravo-nhs Dec 15, 2025
09df7a0
Fix build #skip-qc
connoravo-nhs Dec 15, 2025
b4b3461
Modify path
connoravo-nhs Dec 15, 2025
ccbbf0c
Compile then upload
connoravo-nhs Dec 15, 2025
5fa4728
Add in compile stage on makefile
connoravo-nhs Dec 15, 2025
a95ac8c
Correct proxygen secret name
connoravo-nhs Dec 15, 2025
e1af0ed
Modify apigee client
connoravo-nhs Dec 16, 2025
fea4c42
Kick off pipelines
connoravo-nhs Dec 16, 2025
aa755bb
Include apiclient in payload JSON #skip-qc
connoravo-nhs Dec 16, 2025
ed0307e
Set internal dev server & modify when mtls is set
connoravo-nhs Dec 16, 2025
d3715c2
Adjust API to be p-f-p
connoravo-nhs Dec 16, 2025
d4e6dab
Set MTLS first
connoravo-nhs Dec 16, 2025
4890c36
Kick off pipeline
connoravo-nhs Dec 16, 2025
7f13f21
Switch naming to pfp-proxygen
connoravo-nhs Dec 16, 2025
9800d9a
Set security schemas
connoravo-nhs Dec 16, 2025
eb591e2
Spec adjustments - Output spec always
connoravo-nhs Dec 16, 2025
052c4ab
temp disable enablement of mtls
connoravo-nhs Dec 16, 2025
db692f9
Modify target environment
connoravo-nhs Dec 17, 2025
98383c1
Stop release tag update from PRs
connoravo-nhs Dec 17, 2025
f8077b9
enable tls
connoravo-nhs Dec 17, 2025
bd9ccdb
Kick off pipeline
connoravo-nhs Dec 17, 2025
633e4e6
Modify header given to pfp
connoravo-nhs Dec 18, 2025
b7b70ee
Adjust to nhsd-nhslogin-user
connoravo-nhs Dec 18, 2025
7224f63
Introduce proofing level check
connoravo-nhs Dec 18, 2025
22789ea
Duh
connoravo-nhs Dec 18, 2025
5c7f4e0
Application name attribute output as header to origin
connoravo-nhs Dec 18, 2025
a72ddc2
dont require it
connoravo-nhs Dec 18, 2025
dab4654
Fix reg tests and uts
connoravo-nhs Dec 18, 2025
9a8918e
Disable MTLS
connoravo-nhs Dec 18, 2025
90d6711
Use the branch for proxygen tests to use correct workflow
connoravo-nhs Dec 19, 2025
6f61460
Both use branch?
connoravo-nhs Dec 19, 2025
1821e3e
Kick off pipeline
connoravo-nhs Dec 19, 2025
07c3e8b
Kick off pipeline2
connoravo-nhs Dec 19, 2025
ec0d37f
Merge branch 'main' of github.com-nhs:NHSDigital/prescriptionsforpati…
connoravo-nhs Dec 19, 2025
3888863
Merge branch 'main' into AEA-6037
connoravo-nhs Dec 19, 2025
f9ecf4b
fix target environment
connoravo-nhs Dec 19, 2025
d632fcb
Remove sandbox environment on PRs
connoravo-nhs Dec 19, 2025
ea1dfba
Merge branch 'main' of github.com-nhs:NHSDigital/prescriptionsforpati…
connoravo-nhs Dec 19, 2025
55fae2c
Merge branch 'main' into AEA-6037
connoravo-nhs Dec 19, 2025
260f597
Set latest regression test version for PFP Proxygen changes
connoravo-nhs Dec 19, 2025
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
203 changes: 203 additions & 0 deletions .github/scripts/deploy_api.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,203 @@
#!/usr/bin/env bash
set -eu pipefail

echo "Specification path: ${SPEC_PATH}"
echo "Specification version: ${VERSION_NUMBER}"
echo "Stack name: ${STACK_NAME}"
echo "AWS environment: ${AWS_ENVIRONMENT}"
echo "Apigee environment: ${APIGEE_ENVIRONMENT}"
echo "Proxygen private key name: ${PROXYGEN_PRIVATE_KEY_NAME}"
echo "Proxygen KID: ${PROXYGEN_KID}"
echo "Dry run: ${DRY_RUN}"
echo "ENABLE_MUTUAL_TLS: ${ENABLE_MUTUAL_TLS}"
echo "is_pull_request: ${IS_PULL_REQUEST}"

client_private_key=$(cat ~/.proxygen/tmp/client_private_key)
client_cert=$(cat ~/.proxygen/tmp/client_cert)

if [ -z "${client_private_key}" ]; then
echo "client_private_key is unset or set to the empty string"
exit 1
fi
if [ -z "${client_cert}" ]; then
echo "client_cert is unset or set to the empty string"
exit 1
fi

put_secret_lambda=lambda-resources-ProxygenPTLMTLSSecretPut
instance_put_lambda=lambda-resources-ProxygenPTLInstancePut
spec_publish_lambda=lambda-resources-ProxygenPTLSpecPublish

if [[ "$APIGEE_ENVIRONMENT" =~ ^(int|sandbox|prod)$ ]]; then
put_secret_lambda=lambda-resources-ProxygenProdMTLSSecretPut
instance_put_lambda=lambda-resources-ProxygenProdInstancePut
spec_publish_lambda=lambda-resources-ProxygenProdSpecPublish
fi

instance_suffix=""
if [[ "${IS_PULL_REQUEST}" == "true" ]]; then
# Extracting the PR ID from $STACK_NAME
pr_id=$(echo "$STACK_NAME" | awk -F'-' '{print $NF}')
instance_suffix=-"pr-${pr_id}"
fi

# Determine the proxy instance based on the provided $STACK_NAME
apigee_api=prescriptions-for-patients-proxygen
apigee_client=prescriptions-for-patients-proxygen
instance="pfp-proxygen${instance_suffix}"

echo "Proxy instance: ${instance}"
echo "Apigee api: ${apigee_api}"
echo "Apigee client: ${apigee_client}"

echo

echo "Fixing the spec"
# Find and replace the title
title=$(jq -r '.info.title' "${SPEC_PATH}")
if [[ "${IS_PULL_REQUEST}" == "true" ]]; then
jq --arg title "[PR-${pr_id}] $title" '.info.title = $title' "${SPEC_PATH}" > temp.json && mv temp.json "${SPEC_PATH}"
echo "disabling monitoring for pull request deployment"
jq '."x-nhsd-apim".monitoring = false' "${SPEC_PATH}" > temp.json && mv temp.json "${SPEC_PATH}"
fi

# Find and replace the specification version number
jq --arg version "${VERSION_NUMBER}" '.info.version = $version' "${SPEC_PATH}" > temp.json && mv temp.json "${SPEC_PATH}"

# Find and replace the x-nhsd-apim.target.url value
jq --arg stack_name "${STACK_NAME}" --arg aws_env "${AWS_ENVIRONMENT}" '.["x-nhsd-apim"].target.url = "https://\($stack_name).\($aws_env).eps.national.nhs.uk"' "${SPEC_PATH}" > temp.json && mv temp.json "${SPEC_PATH}"

# Find and replace the servers object
if [[ "${APIGEE_ENVIRONMENT}" == "prod" ]]; then
jq --arg inst "${instance}" '.servers = [ { "url": "https://api.service.nhs.uk/\($inst)" } ]' "${SPEC_PATH}" > temp.json && mv temp.json "${SPEC_PATH}"
else
jq --arg env "${APIGEE_ENVIRONMENT}" --arg inst "${instance}" '.servers = [ { "url": "https://\($env).api.service.nhs.uk/\($inst)" } ]' "${SPEC_PATH}" > temp.json && mv temp.json "${SPEC_PATH}"
fi

# Find and replace securitySchemes
if [[ "${APIGEE_ENVIRONMENT}" == "prod" ]]; then
jq '.components.securitySchemes."nhs-cis2-aal3" = {"$ref": "https://proxygen.prod.api.platform.nhs.uk/components/securitySchemes/nhs-cis2-aal3"}' "${SPEC_PATH}" > temp.json && mv temp.json "${SPEC_PATH}"
jq '.components.securitySchemes."nhs-login-p9" = {"$ref": "https://proxygen.prod.api.platform.nhs.uk/components/securitySchemes/nhs-login-p9"}' "${SPEC_PATH}" > temp.json && mv temp.json "${SPEC_PATH}"
else
jq '.components.securitySchemes."nhs-cis2-aal3" = {"$ref": "https://proxygen.ptl.api.platform.nhs.uk/components/securitySchemes/nhs-cis2-aal3"}' "${SPEC_PATH}" > temp.json && mv temp.json "${SPEC_PATH}"
jq '.components.securitySchemes."nhs-login-p9" = {"$ref": "https://proxygen.ptl.api.platform.nhs.uk/components/securitySchemes/nhs-login-p9"}' "${SPEC_PATH}" > temp.json && mv temp.json "${SPEC_PATH}"
fi

# Find and replace the x-nhsd-apim.target.secret value
jq --arg mtls_key "${MTLS_KEY}" '.["x-nhsd-apim"].target.security.secret = "\($mtls_key)"' "${SPEC_PATH}" > temp.json && mv temp.json "${SPEC_PATH}"

# Remove target attributes if the environment is sandbox
if [[ "${APIGEE_ENVIRONMENT}" == *"sandbox"* ]]; then
echo "Removing target attributes for sandbox environment"
jq 'del(."x-nhsd-apim"."target-attributes")' "$SPEC_PATH" > temp.json && mv temp.json "${SPEC_PATH}"
fi

echo

echo "Retrieving proxygen credentials"

# Retrieve the proxygen private key and client private key and cert from AWS Secrets Manager
proxygen_private_key_arn=$(aws cloudformation list-exports --query "Exports[?Name=='secrets:${PROXYGEN_PRIVATE_KEY_NAME}'].Value" --output text)

if [[ "${ENABLE_MUTUAL_TLS}" == "true" ]]; then
echo
echo "Store the secret used for mutual TLS to AWS using Proxygen proxy lambda"
if [[ "${DRY_RUN}" == "false" ]]; then
jq -n --arg apiName "${apigee_api}" \
--arg apiClient "${apigee_client}" \
--arg environment "${APIGEE_ENVIRONMENT}" \
--arg secretName "${MTLS_KEY}" \
--arg secretKey "${client_private_key}" \
--arg secretCert "${client_cert}" \
--arg kid "${PROXYGEN_KID}" \
--arg proxygenSecretName "${proxygen_private_key_arn}" \
'{apiName: $apiName, apiClient: $apiClient, environment: $environment, secretName: $secretName, secretKey: $secretKey, secretCert: $secretCert, kid, $kid, proxygenSecretName: $proxygenSecretName}' > payload.json

aws lambda invoke --function-name "${put_secret_lambda}" --cli-binary-format raw-in-base64-out --payload file://payload.json out.txt > response.json
if eval "cat response.json | jq -e '.FunctionError' >/dev/null"; then
echo 'Error calling lambda'
cat out.txt
exit 1
fi
echo "Secret stored successfully"
else
echo "Would call ${put_secret_lambda}"
fi
fi

echo
echo "Deploy the API instance using Proxygen proxy lambda"
if [[ "${DRY_RUN}" == "false" ]]; then

jq -n --argfile spec "${SPEC_PATH}" \
--arg apiName "${apigee_api}" \
--arg apiClient "${apigee_client}" \
--arg environment "${APIGEE_ENVIRONMENT}" \
--arg instance "${instance}" \
--arg kid "${PROXYGEN_KID}" \
--arg proxygenSecretName "${proxygen_private_key_arn}" \
'{apiName: $apiName, apiClient: $apiClient, environment: $environment, specDefinition: $spec, instance: $instance, kid: $kid, proxygenSecretName: $proxygenSecretName}' > payload.json

aws lambda invoke --function-name "${instance_put_lambda}" --cli-binary-format raw-in-base64-out --payload file://payload.json out.txt > response.json

if eval "cat response.json | jq -e '.FunctionError' >/dev/null"; then
echo 'Error calling lambda'
cat out.txt
exit 1
fi
echo "Instance deployed"
else
echo "Would call ${instance_put_lambda}"
fi

# if [[ "${APIGEE_ENVIRONMENT}" == "int" ]]; then
# echo
# echo "Deploy the API spec to prod catalogue as it is int environment"
# if [[ "${DRY_RUN}" == "false" ]]; then
# jq -n --argfile spec "${SPEC_PATH}" \
# --arg apiName "${apigee_api}" \
# --arg apiClient "${apigee_client}" \
# --arg environment "prod" \
# --arg instance "${instance}" \
# --arg kid "${PROXYGEN_KID}" \
# --arg proxygenSecretName "${proxygen_private_key_arn}" \
# '{apiName: $apiName, apiClient: $apiClient, environment: $environment, specDefinition: $spec, instance: $instance, kid: $kid, proxygenSecretName: $proxygenSecretName}' > payload.json

# aws lambda invoke --function-name "${spec_publish_lambda}" --cli-binary-format raw-in-base64-out --payload file://payload.json out.txt > response.json

# if eval "cat response.json | jq -e '.FunctionError' >/dev/null"; then
# echo 'Error calling lambda'
# cat out.txt
# exit 1
# fi
# echo "Spec deployed"
# else
# echo "Would call ${spec_publish_lambda}"
# fi
# fi

if [[ "${APIGEE_ENVIRONMENT}" == "internal-dev" && "${IS_PULL_REQUEST}" == "false" ]]; then
echo
echo "Deploy the API spec to uat catalogue as it is internal-dev environment"
if [[ "${DRY_RUN}" == "false" ]]; then
jq -n --argfile spec "${SPEC_PATH}" \
--arg apiName "${apigee_api}" \
--arg apiClient "${apigee_client}" \
--arg environment "uat" \
--arg instance "${instance}" \
--arg kid "${PROXYGEN_KID}" \
--arg proxygenSecretName "${proxygen_private_key_arn}" \
'{apiName: $apiName, apiClient: $apiClient, environment: $environment, specDefinition: $spec, instance: $instance, kid: $kid, proxygenSecretName: $proxygenSecretName}' > payload.json

aws lambda invoke --function-name "${spec_publish_lambda}" --cli-binary-format raw-in-base64-out --payload file://payload.json out.txt > response.json

if eval "cat response.json | jq -e '.FunctionError' >/dev/null"; then
echo 'Error calling lambda'
cat out.txt
exit 1
fi
echo "Spec deployed"
else
echo "Would call ${spec_publish_lambda}"
fi
fi
6 changes: 6 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ jobs:
TARGET_ENVIRONMENT: dev
APIGEE_ENVIRONMENT: internal-dev
ENABLE_MUTUAL_TLS: true
MTLS_KEY: prescriptions-for-patients-mtls-1
BUILD_ARTIFACT: packaged_code
TRUSTSTORE_FILE: pfp-truststore.pem
VERSION_NUMBER: ${{needs.tag_release.outputs.version_tag}}
Expand All @@ -90,6 +91,7 @@ jobs:
INT_CLOUD_FORMATION_CHECK_VERSION_ROLE: ${{ secrets.INT_CLOUD_FORMATION_CHECK_VERSION_ROLE }}
PROD_CLOUD_FORMATION_CHECK_VERSION_ROLE: ${{ secrets.PROD_CLOUD_FORMATION_CHECK_VERSION_ROLE }}
DEV_CLOUD_FORMATION_EXECUTE_LAMBDA_ROLE: ${{ secrets.DEV_CLOUD_FORMATION_EXECUTE_LAMBDA_ROLE }}
PROXYGEN_ROLE: ${{ secrets.PROXYGEN_PTL_ROLE }}

release_dev_sandbox:
needs: [tag_release, package_code, get_commit_id]
Expand All @@ -100,6 +102,7 @@ jobs:
TARGET_ENVIRONMENT: dev
APIGEE_ENVIRONMENT: internal-dev-sandbox
ENABLE_MUTUAL_TLS: true
MTLS_KEY: prescriptions-for-patients-mtls-1
BUILD_ARTIFACT: packaged_sandbox_code
TRUSTSTORE_FILE: pfp-sandbox-truststore.pem
VERSION_NUMBER: ${{needs.tag_release.outputs.version_tag}}
Expand All @@ -114,6 +117,7 @@ jobs:
CLOUD_FORMATION_DEPLOY_ROLE: ${{ secrets.DEV_CLOUD_FORMATION_DEPLOY_ROLE }}
TARGET_SPINE_SERVER: sandbox
TARGET_SERVICE_SEARCH_SERVER: sandbox
PROXYGEN_ROLE: ${{ secrets.PROXYGEN_PTL_ROLE }}

release_qa:
needs:
Expand All @@ -131,6 +135,7 @@ jobs:
TARGET_ENVIRONMENT: qa
APIGEE_ENVIRONMENT: internal-qa
ENABLE_MUTUAL_TLS: true
MTLS_KEY: prescriptions-for-patients-mtls-1
BUILD_ARTIFACT: packaged_code
TRUSTSTORE_FILE: pfp-truststore.pem
VERSION_NUMBER: ${{needs.tag_release.outputs.version_tag}}
Expand All @@ -148,3 +153,4 @@ jobs:
CLOUD_FORMATION_DEPLOY_ROLE: ${{ secrets.QA_CLOUD_FORMATION_DEPLOY_ROLE }}
TARGET_SPINE_SERVER: ${{ secrets.QA_TARGET_SPINE_SERVER }}
TARGET_SERVICE_SEARCH_SERVER: ${{ secrets.QA_TARGET_SERVICE_SEARCH_SERVER }}
PROXYGEN_ROLE: ${{ secrets.PROXYGEN_PTL_ROLE }}
57 changes: 31 additions & 26 deletions .github/workflows/pull_request.yml
Original file line number Diff line number Diff line change
Expand Up @@ -100,13 +100,15 @@ jobs:
needs: [get_issue_number, package_code, get_commit_id]
uses: ./.github/workflows/sam_release_code.yml
with:
IS_PULL_REQUEST: true
STACK_NAME: pfp-pr-${{needs.get_issue_number.outputs.issue_number}}
ARTIFACT_BUCKET_PREFIX: PR-${{needs.get_issue_number.outputs.issue_number}}
TARGET_ENVIRONMENT: dev-pr
TARGET_ENVIRONMENT: dev
APIGEE_ENVIRONMENT: internal-dev
ENABLE_MUTUAL_TLS: false
MTLS_KEY: prescriptions-for-patients-mtls-1
BUILD_ARTIFACT: packaged_code
TRUSTSTORE_FILE: pfp-truststore.pem
TRUSTSTORE_FILE: pfp-truststore-pr.pem # temporary
VERSION_NUMBER: PR-${{ needs.get_issue_number.outputs.issue_number }}
COMMIT_ID: ${{ needs.get_commit_id.outputs.commit_id }}
LOG_LEVEL: DEBUG
Expand All @@ -117,32 +119,35 @@ jobs:
RUN_REGRESSION_TESTS: true
REGRESSION_TEST_PRODUCT: PFP-AWS
FORWARD_CSOC_LOGS: false
DEPLOY_APIGEE: true # temporary
secrets:
REGRESSION_TESTS_PEM: ${{ secrets.REGRESSION_TESTS_PEM }}
CLOUD_FORMATION_DEPLOY_ROLE: ${{ secrets.DEV_CLOUD_FORMATION_DEPLOY_ROLE }}
TARGET_SPINE_SERVER: ${{ secrets.DEV_TARGET_SPINE_SERVER }}
TARGET_SERVICE_SEARCH_SERVER: ${{ secrets.DEV_TARGET_SERVICE_SEARCH_SERVER }}

release_sandbox_code:
needs: [get_issue_number, package_code, get_commit_id]
uses: ./.github/workflows/sam_release_code.yml
with:
STACK_NAME: pfp-pr-${{needs.get_issue_number.outputs.issue_number}}-sandbox
ARTIFACT_BUCKET_PREFIX: PR-sandbox-${{needs.get_issue_number.outputs.issue_number}}
TARGET_ENVIRONMENT: dev-pr
APIGEE_ENVIRONMENT: internal-dev-sandbox
ENABLE_MUTUAL_TLS: false
BUILD_ARTIFACT: packaged_sandbox_code
TRUSTSTORE_FILE: pfp-sandbox-truststore.pem
VERSION_NUMBER: PR-${{ needs.get_issue_number.outputs.issue_number }}
COMMIT_ID: ${{ needs.get_commit_id.outputs.commit_id }}
LOG_LEVEL: DEBUG
LOG_RETENTION_DAYS: 30
STATE_MACHINE_LOG_LEVEL: ALL
RUN_REGRESSION_TESTS: false
FORWARD_CSOC_LOGS: false
secrets:
REGRESSION_TESTS_PEM: ${{ secrets.REGRESSION_TESTS_PEM }}
CLOUD_FORMATION_DEPLOY_ROLE: ${{ secrets.DEV_CLOUD_FORMATION_DEPLOY_ROLE }}
TARGET_SPINE_SERVER: sandbox
TARGET_SERVICE_SEARCH_SERVER: sandbox
PROXYGEN_ROLE: ${{ secrets.PROXYGEN_PTL_ROLE }}
# release_sandbox_code:
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can we just deploy it with DEPLOY_APIGEE: false?

also if we do comment it out, should do the same in ci.yml and release.yml

# needs: [get_issue_number, package_code, get_commit_id]
# uses: ./.github/workflows/sam_release_code.yml
# with:
# STACK_NAME: pfp-pr-${{needs.get_issue_number.outputs.issue_number}}-sandbox
# ARTIFACT_BUCKET_PREFIX: PR-sandbox-${{needs.get_issue_number.outputs.issue_number}}
# TARGET_ENVIRONMENT: dev
# APIGEE_ENVIRONMENT: internal-dev-sandbox
# ENABLE_MUTUAL_TLS: false
# MTLS_KEY: prescriptions-for-patients-mtls-1
# BUILD_ARTIFACT: packaged_sandbox_code
# TRUSTSTORE_FILE: pfp-sandbox-truststore.pem
# VERSION_NUMBER: PR-${{ needs.get_issue_number.outputs.issue_number }}
# COMMIT_ID: ${{ needs.get_commit_id.outputs.commit_id }}
# LOG_LEVEL: DEBUG
# LOG_RETENTION_DAYS: 30
# STATE_MACHINE_LOG_LEVEL: ALL
# RUN_REGRESSION_TESTS: false
# FORWARD_CSOC_LOGS: false
# secrets:
# REGRESSION_TESTS_PEM: ${{ secrets.REGRESSION_TESTS_PEM }}
# CLOUD_FORMATION_DEPLOY_ROLE: ${{ secrets.DEV_CLOUD_FORMATION_DEPLOY_ROLE }}
# TARGET_SPINE_SERVER: sandbox
# TARGET_SERVICE_SEARCH_SERVER: sandbox
# PROXYGEN_ROLE: ${{ secrets.PROXYGEN_PTL_ROLE }}
Loading
Loading