-
Notifications
You must be signed in to change notification settings - Fork 2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
run: add hello-broken sample #1480
Merged
Merged
Changes from all commits
Commits
Show all changes
11 commits
Select commit
Hold shift + click to select a range
fb380c9
run: add hello-broken sample
grayside 1df2198
run: incorporate --quiet and comment feedback
grayside f316b33
run/broken: add full license headers
grayside 3ebb6c9
Merge branch 'master' into run/broken
grayside b85de4d
run: remove unintended wip sample
grayside 8bb8199
rename TARGET env var to NAME
grayside 6a9a8aa
fix eslint spacing on error text
grayside eb5bb2c
README wording refinements
grayside 09f7f49
return error response on same line
grayside a06ed59
align package.json with feedback on system package, add eslint scripts
grayside d2e195f
Merge branch 'master' into run/broken
grayside File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
# Copyright 2019 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 | ||
# | ||
# https://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. | ||
|
||
# [START run_broken_dockerfile] | ||
|
||
# Use the official lightweight Node.js 10 image. | ||
# https://hub.docker.com/_/node | ||
FROM node:10-slim | ||
|
||
# Create and change to the app directory. | ||
WORKDIR /usr/src/app | ||
|
||
# Copy application dependency manifests to the container image. | ||
# A wildcard is used to ensure copying both package.json AND package-lock.json (when available). | ||
# Copying this first prevents re-running npm install on every code change. | ||
COPY package*.json ./ | ||
|
||
# Install production dependencies. | ||
# If you add a package-lock.json, speed your build by switching to 'npm ci'. | ||
# RUN npm ci --only=production | ||
RUN npm install --only=production | ||
|
||
# Copy local code to the container image. | ||
COPY . ./ | ||
|
||
# Run the web service on container startup. | ||
CMD [ "npm", "start" ] | ||
|
||
# [END run_broken_dockerfile] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,68 @@ | ||
# Cloud Run Broken Sample | ||
|
||
This sample presents broken code in need of troubleshooting. An alternate | ||
resource at `/improved` shows a more stable implementation with more informative | ||
errors and default values. | ||
|
||
Use it with the [Local Container Troubleshooting tutorial](http://cloud.google.com/run/docs/tutorials/local-troubleshooting). | ||
|
||
For more details on how to work with this sample read the [Google Cloud Run Node.js Samples README](https://github.com/GoogleCloudPlatform/nodejs-docs-samples/run). | ||
|
||
## Local Development | ||
|
||
### `npm run e2e-test` | ||
|
||
``` | ||
export SERVICE_NAME=broken | ||
export CONTAINER_IMAGE=gcr.io/${GOOGLE_CLOUD_PROJECT}/broken | ||
npm run e2e-test | ||
``` | ||
|
||
## Using Testing Scripts | ||
|
||
### url.sh | ||
|
||
The `url.sh` script derives the automatically provisioned URL of a deployed | ||
Cloud Run service. | ||
|
||
```sh | ||
export SERVICE_NAME=broken | ||
export REGION=us-central1 | ||
test/url.sh | ||
``` | ||
|
||
### deploy.sh | ||
|
||
The `deploy.sh` script deploys a Cloud Run service. | ||
|
||
```sh | ||
export SERVICE_NAME=broken | ||
export CONTAINER_IMAGE=gcr.io/${GOOGLE_CLOUD_PROJECT}/broken | ||
export REGION=us-central1 | ||
test/deploy.sh | ||
``` | ||
|
||
### runner.sh | ||
|
||
The `runner.sh` script: | ||
|
||
* Deploys the service to Cloud Run based on the `deploy.sh` script. | ||
* Sets the `BASE_URL` and `ID_TOKEN` environment variables. | ||
* Runs any arguments passed to the `runner.sh` script. | ||
* Tears down the Cloud Run service on completion. | ||
|
||
```sh | ||
test/runner.sh sleep 20 | ||
``` | ||
|
||
## Environment Variables (Testing) | ||
|
||
* `BASE_URL`: Specifies the Cloud Run service URL for end-to-end tests. | ||
* `ID_TOKEN`: JWT token used to authenticate with Cloud Run's IAM-based authentication. | ||
* `REGION`: [`us-central1`] Optional override region for the location of the Cloud Run service. | ||
* `SERVICE_NAME`: The name of the deployed service, used in some API calls and test assertions. | ||
|
||
## Dependencies | ||
|
||
* **express**: Web server framework. | ||
* **got**: [Testing] Used to make HTTP requests of the running service in end-to-end testing. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
// Copyright 2019 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 | ||
// | ||
// https://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. | ||
|
||
// [START run_broken_service] | ||
const express = require('express'); | ||
const app = express(); | ||
|
||
app.get('/', (req, res) => { | ||
console.log('hello: received request.'); | ||
|
||
// [START run_broken_service_problem] | ||
const {NAME} = process.env; | ||
if (!NAME) { | ||
// Plain error logs do not appear in Stackdriver Error Reporting. | ||
console.error('Environment validation failed.'); | ||
console.error(new Error('Missing required server parameter')); | ||
return res.status(500).send('Internal Server Error'); | ||
} | ||
// [END run_broken_service_problem] | ||
res.send(`Hello ${NAME}!`); | ||
}); | ||
// [END run_broken_service] | ||
|
||
app.get('/improved', (req, res) => { | ||
console.log('hello: received request.'); | ||
|
||
// [START run_broken_service_upgrade] | ||
const NAME = process.env.NAME || 'World'; | ||
if (!process.env.NAME) { | ||
console.log( | ||
JSON.stringify({ | ||
severity: 'WARNING', | ||
message: `NAME not set, default to '${NAME}'`, | ||
}) | ||
); | ||
} | ||
// [END run_broken_service_upgrade] | ||
res.send(`Hello ${NAME}!`); | ||
}); | ||
|
||
// [START run_broken_service] | ||
const port = process.env.PORT || 8080; | ||
app.listen(port, () => { | ||
console.log(`hello: listening on port ${port}`); | ||
}); | ||
// [END run_broken_service] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
{ | ||
"name": "hello-broken", | ||
"description": "Broken Cloud Run service for troubleshooting practice", | ||
"version": "1.0.0", | ||
"private": true, | ||
"main": "index.js", | ||
"scripts": { | ||
"start": "node index.js", | ||
"test": "echo \"Error: no test specified\" && exit 0", | ||
"e2e-test": "TARGET=Cloud test/runner.sh mocha test/system.test.js --timeout=20000", | ||
"lint": "eslint '**/*.js'", | ||
"fix": "eslint --fix '**/*.js'" | ||
}, | ||
"author": "Google LLC", | ||
"license": "Apache-2.0", | ||
"dependencies": { | ||
"express": "^4.17.1" | ||
}, | ||
"devDependencies": { | ||
"got": "^9.6.0" | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
#!/usr/bin/env bash | ||
|
||
# Copyright 2019 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. | ||
|
||
set -eo pipefail; | ||
|
||
requireEnv() { | ||
test "${!1}" || (echo "Environment Variable '$1' not found" && exit 1) | ||
} | ||
|
||
requireEnv SERVICE_NAME | ||
requireEnv CONTAINER_IMAGE | ||
|
||
# Deploy the service | ||
set -x | ||
gcloud beta run deploy "${SERVICE_NAME}" \ | ||
--image="${CONTAINER_IMAGE}" \ | ||
--region="${REGION:-us-central1}" \ | ||
${FLAGS} \ | ||
--platform=managed \ | ||
--quiet | ||
|
||
echo 'Cloud Run Links:' | ||
echo "- Logs: https://console.cloud.google.com/logs/viewer?project=${GOOGLE_CLOUD_PROJECT}&resource=cloud_run_revision%2Fservice_name%2F${SERVICE_NAME}" | ||
echo "- Console: https://console.cloud.google.com/run/detail/${REGION:-us-central1}/${SERVICE_NAME}/metrics?project=${GOOGLE_CLOUD_PROJECT}" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
#!/usr/bin/env bash | ||
|
||
# Copyright 2019 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. | ||
|
||
set -eo pipefail; | ||
|
||
requireEnv() { | ||
test "${!1}" || (echo "Environment Variable '$1' not found" && exit 1) | ||
} | ||
requireEnv SERVICE_NAME | ||
|
||
# The hello-broken sample needs to be tested with the NAME environment variable | ||
# both set and unset. | ||
SERVICE_OVERRIDE="${SERVICE_NAME}-override" | ||
|
||
echo '---' | ||
test/deploy.sh | ||
FLAGS="--set-env-vars NAME=$NAME" SERVICE_NAME=${SERVICE_OVERRIDE} test/deploy.sh | ||
|
||
echo | ||
echo '---' | ||
echo | ||
|
||
# Register post-test cleanup. | ||
# Only needed if deploy completed. | ||
function cleanup { | ||
set -x | ||
gcloud beta run services delete ${SERVICE_NAME} \ | ||
--platform=managed \ | ||
--region="${REGION:-us-central1}" \ | ||
--quiet | ||
gcloud beta run services delete ${SERVICE_OVERRIDE} \ | ||
--platform=managed \ | ||
--region="${REGION:-us-central1}" \ | ||
--quiet | ||
} | ||
trap cleanup EXIT | ||
|
||
# TODO: Perform authentication inside the test. | ||
export ID_TOKEN=$(gcloud auth print-identity-token) | ||
export BASE_URL=$(test/url.sh) | ||
export BASE_URL_OVERRIDE=$(SERVICE_NAME=${SERVICE_OVERRIDE} test/url.sh) | ||
# Do not use exec to preserve trap behavior. | ||
"$@" |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't think you need a forward slash here.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
While the previous practice was to use
COPY . .
, this is a newer practice I think we should use in COPY statements. The issue is COPY supports having multiple source arguments and one destination argument, but if the source arguments are:Then the destination needs to have the trailing slash otherwise it will error.
This is intended to future proof the use of the Dockerfile should a developer use it as a template.