Skip to content

Commit ec98167

Browse files
authored
docs: add new envvar/secret docs, incl ID_TOKEN usage (#3997)
* docs: add new envvar/secret docs, incl ID_TOKEN usage * formatting * exact audience is important * correct correct name
1 parent 1001702 commit ec98167

File tree

1 file changed

+62
-0
lines changed

1 file changed

+62
-0
lines changed

.github/config/README.md

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ Additionally to the environment variables you define in the `ci-setup.json` file
5050

5151
- `PROJECT_ID`: The project used by the testing infrastructure.
5252
- `RUN_ID`: A random unique identifier, different on every test run.
53+
- `SERVICE_ACCOUNT`: The email of the testing service account.
5354

5455
> **Note**: An environment variable explicitly defined under `env` with the same name as an automatic variable overrides the automatic variable.
5556
@@ -98,6 +99,67 @@ For example:
9899

99100
The test infrastructure then fetches the actual secret data and exports them as environment variables.
100101

102+
### Automatic secret values
103+
104+
Additional to any secret values you define in the `ci-setup.json` file, the test infrastructure always exports the following secret value:
105+
106+
- `ID_TOKEN`: an ID token for interacting with private Cloud Run services.
107+
108+
109+
<details>
110+
<summary>
111+
Adapting <b>`ID_TOKEN`</b> use in system testing
112+
</summary>
113+
114+
Due to organization policies, Cloud Run services cannot be deployed with public
115+
access. This means authentication is required in order to perform integration
116+
testing. We do this by using ID Tokens (JWT) provided by [Google GitHub Actions
117+
Auth](https://github.com/google-github-actions/auth/blob/main/docs/EXAMPLES.md#generating-an-id-token-jwt).
118+
119+
By default, the audience of a Cloud Run service is [the full URL of the service
120+
itself](https://cloud.google.com/run/docs/configuring/custom-audiences#:~:text=By%20convention%2C%20the%20audience%20is).
121+
Since we cannot know all the URLs for all samples ahead of time (since unique
122+
IDs are in use), we instead define a custom audience in the GitHub Action, then
123+
apply that as an additional audience to all Cloud Run services.
124+
125+
To use this method, some changes are required:
126+
127+
1. As part of testing setup, add a step to customize the Cloud Run service to have the custom audience `https://action.test/`
128+
129+
```shell
130+
gcloud run services deploy ${_SERVICE} \
131+
... \
132+
--add-custom-audiences="https://action.test/"
133+
```
134+
135+
1. Use the environment variable ID_TOKEN in any Authorization: Bearer calls.
136+
137+
For example, a curl command:
138+
139+
```shell
140+
# ❌ Previous version: calls gcloud
141+
curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" https://my-service-hash.a.run.app
142+
143+
# ✅ New version: uses environment variable
144+
curl -H "Authorization: Bearer ${ID_TOKEN}" https://my-service-hash.a.run.app
145+
```
146+
147+
For example, a Node.JS script:
148+
149+
```javascript
150+
// ❌ Previous version: auth.getIdTokenClient()
151+
const client = await auth.getIdTokenClient(BASE_URL);
152+
const clientHeaders = await client.getRequestHeaders();
153+
ID_TOKEN = clientHeaders['Authorization'].trim();
154+
if (!ID_TOKEN) throw Error('Unable to acquire an ID token.');
155+
156+
// ✅ New version: uses environment variable
157+
{ID_TOKEN} = process.env;
158+
if (!ID_TOKEN) throw Error('"ID_TOKEN" not found in environment variables.');
159+
```
160+
161+
</details>
162+
101163
### Secrets vs environment variables
102164
103165
Most configuration should be directly set with environment variables.

0 commit comments

Comments
 (0)