actions/steps/setup-custard/action.yaml (79 lines of code) (raw):
# Copyright 2025 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
name: Setup Custard
description: Sets up the Custard testing environment.
inputs:
path:
description: Path of the package to run.
required: true
ci-setup:
description: The CI setup for the package path.
required: true
id-token:
description: The ID token to export variable, not exported if not provided.
required: false
runs:
# TODO: This should all be handled by the local runner.
# When that's ready, we can call it directly and get rid of this.
using: composite
steps:
- name: Export environment variables
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7
id: vars
with:
script: |
function uniqueId(length = 6) {
const min = 2 ** 32;
const max = 2 ** 64;
return Math.floor(Math.random() * max + min)
.toString(36)
.slice(0, length);
}
function substituteVars(value, env) {
for (const key in env) {
const re = new RegExp(`\\$(${key}\\b|\\{\\s*${key}\\s*\\})`, 'g');
value = value.replaceAll(re, env[key]);
}
return value;
}
const setup = ${{ inputs.ci-setup }};
// Define automatic variables plus custom variables.
const vars = {
PROJECT_ID: '${{ inputs.project-id }}',
RUN_ID: uniqueId(),
SERVICE_ACCOUNT: '${{ inputs.service-account }}',
...(setup.env || {}),
};
// Apply variable interpolation.
const env = Object.fromEntries(
Object.keys(vars).map(key => [key, substituteVars(vars[key], vars)])
);
// Export environment variables.
console.log('env:');
for (const key in env) {
const value = env[key];
console.log(` ${key}: ${value}`);
core.exportVariable(key, value);
}
// Show exported secrets, for logging purposes.
// TODO: We might want to fetch the secrets here and export them directly.
// https://cloud.google.com/secret-manager/docs/create-secret-quickstart#secretmanager-quickstart-nodejs
console.log('secrets:');
for (const key in setup.secrets || {}) {
// This is the Google Cloud Secret Manager secret ID.
// NOT the secret value, so it's ok to show.
console.log(` ${key}: ${setup.secrets[key]}`);
}
// Set global secret for the Service Account identity token
// Use in place of 'gcloud auth print-identity-token' or auth.getIdTokenClient
// usage: curl -H 'Bearer: $ID_TOKEN' https://
const idToken = '${{ inputs.id-token }}';
if (idToken) {
core.exportVariable('ID_TOKEN', idToken)
core.setSecret(idToken)
// For logging, show the source of the ID_TOKEN
console.log(` ID_TOKEN: steps.auth.outputs.id_token (from GitHub Action)`);
}
// Return env and secrets to use for further steps.
return {
env: env,
// Transform secrets into the format needed for the GHA secret manager step.
secrets: Object.keys(setup.secrets || {})
.map(key => `${key}:${setup.secrets[key]}`)
.join('\n'),
};
- name: Fetch secrets
uses: google-github-actions/get-secretmanager-secrets@e5bb06c2ca53b244f978d33348d18317a7f263ce # v2
if: ${{ fromJson(steps.vars.outputs.result).secrets }}
with:
secrets: ${{ fromJson(steps.vars.outputs.result).secrets }}
export_to_environment: true