From 7c8494b13d085117d176c7da3a396d111d05794f Mon Sep 17 00:00:00 2001 From: Rick Rackow Date: Tue, 28 Apr 2020 23:10:48 +0200 Subject: [PATCH 1/4] add plaing cloud build --- example-workflows/README.md | 1 + example-workflows/cloud-build/.dockerignore | 4 + .../.github/workflows/cloud-build.yml | 48 +++ example-workflows/cloud-build/Dockerfile | 34 ++ example-workflows/cloud-build/README.md | 100 +++++ example-workflows/cloud-build/index.js | 28 ++ .../cloud-build/package-lock.json | 374 ++++++++++++++++++ example-workflows/cloud-build/package.json | 14 + 8 files changed, 603 insertions(+) create mode 100644 example-workflows/cloud-build/.dockerignore create mode 100644 example-workflows/cloud-build/.github/workflows/cloud-build.yml create mode 100644 example-workflows/cloud-build/Dockerfile create mode 100644 example-workflows/cloud-build/README.md create mode 100644 example-workflows/cloud-build/index.js create mode 100644 example-workflows/cloud-build/package-lock.json create mode 100644 example-workflows/cloud-build/package.json diff --git a/example-workflows/README.md b/example-workflows/README.md index ff85d3c6..6ac843a2 100644 --- a/example-workflows/README.md +++ b/example-workflows/README.md @@ -12,6 +12,7 @@ update values to match your setup. | [Google Kubernetes Engine](gke/)| Deploy a static site to an existing GKE cluster | | [Cloud Run](cloud-run/) | Deploy a container to Cloud Run (Fully Managed)| | [Google Compute Engine](gce/) | Deploy a container to a GCE VM | +| [Google Cloud Build](cloud-build)| Build a container image using CLoud Build| ## Github Actions resources diff --git a/example-workflows/cloud-build/.dockerignore b/example-workflows/cloud-build/.dockerignore new file mode 100644 index 00000000..07efc8ee --- /dev/null +++ b/example-workflows/cloud-build/.dockerignore @@ -0,0 +1,4 @@ +Dockerfile +README.md +node_modules +npm-debug.log diff --git a/example-workflows/cloud-build/.github/workflows/cloud-build.yml b/example-workflows/cloud-build/.github/workflows/cloud-build.yml new file mode 100644 index 00000000..b7853d50 --- /dev/null +++ b/example-workflows/cloud-build/.github/workflows/cloud-build.yml @@ -0,0 +1,48 @@ +# 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. + +name: Build using Cloud Build + +on: + push: + branches: + - master + +env: + PROJECT_ID: ${{ secrets.RUN_PROJECT }} + SERVICE_NAME: helloworld-nodejs + +jobs: + setup-build-deploy: + name: Setup, Build, and Deploy + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v2 + + # Setup gcloud CLI + - uses: GoogleCloudPlatform/github-actions/setup-gcloud@master + with: + version: '286.0.0' + service_account_email: ${{ secrets.RUN_SA_EMAIL }} + service_account_key: ${{ secrets.RUN_SA_KEY }} + project_id: ${{ secrets.RUN_PROJECT }} + + # Build and push image to Google Container Registry + - name: Build + run: |- + gcloud builds submit \ + --quiet \ + --tag "gcr.io/$PROJECT_ID/$SERVICE_NAME:$GITHUB_SHA" diff --git a/example-workflows/cloud-build/Dockerfile b/example-workflows/cloud-build/Dockerfile new file mode 100644 index 00000000..24094ef0 --- /dev/null +++ b/example-workflows/cloud-build/Dockerfile @@ -0,0 +1,34 @@ +# Copyright 2020 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. + +# Use the official lightweight Node.js 12 image. +# https://hub.docker.com/_/node +FROM node:12-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 both package.json AND package-lock.json are copied. +# Copying this separately prevents re-running npm install on every code change. +COPY package*.json ./ + +# Install production dependencies. +RUN npm install --only=production + +# Copy local code to the container image. +COPY . ./ + +# Run the web service on container startup. +CMD [ "npm", "start" ] diff --git a/example-workflows/cloud-build/README.md b/example-workflows/cloud-build/README.md new file mode 100644 index 00000000..a4bf66d7 --- /dev/null +++ b/example-workflows/cloud-build/README.md @@ -0,0 +1,100 @@ +# Cloud Build - GitHub Actions + +An example workflow that uses [GitHub Actions][actions] to build a +[Hello World Node.js app](index.js) container image using [Cloud Build][cloud-build]. + +This code is intended to be an _example_. You will likely need to change or +update values to match your setup. + +## Workflow description + +For pushes to the `master` branch, this workflow will: + +1. Download and configure the Google [Cloud SDK][sdk] with the provided + credentials. + +1. Build, tag, and push a container image to Google Container Registry. + + - The image is built using Cloud Build and pushed to Google Container Registry. + + - The image is available through the following tags: `latest` and first 8 of + the commit SHA. + +## Setup + +1. Create a new Google Cloud Project (or select an existing project) and + [enable the Cloud Build and Cloud Build APIs](https://console.cloud.google.com/flows/enableapi?apiid=cloudbuild.googleapis.com,run.googleapis.com). + +1. Create or reuse a GitHub repository for the example workflow: + + 1. [Create a repository](https://help.github.com/en/github/creating-cloning-and-archiving-repositories/creating-a-new-repository). + + 1. Move into the repository directory: + + ``` + $ cd + ``` + + 1. Copy the example into the repository: + + ``` + $ cp -r /github-actions/example-workflows/cloud-build/ . + ``` + +1. [Create a Google Cloud service account][create-sa] if one does not already + exist. + +1. Add the the following [Cloud IAM roles][roles] to your service account: + + - `Cloud Build Admin` - allows for the creation of new services + + - `Cloud Build Editor` - allows for deploying cloud builds + + - `Cloud Build Service Account` - allows for deploying cloud builds + + - `Viewer` - allows for viewing the project + + - `Service Account User` - required to deploy services to Cloud Build + + Note: These permissions are overly broad to favor a quick start. They do not + represent best practices around the Principle of Least Privledge. To + properly restrict access, you should create a custom IAM role with the most + restrictive permissions. + + +1. [Create a JSON service account key][create-key] for the service account. + +1. Add the following secrets to your repository's secrets: + + - `RUN_PROJECT`: Google Cloud project ID + + - `RUN_SA_EMAIL`: the email of the service account + + - `RUN_SA_KEY`: the content of the service account JSON file + +## Run the workflow + +1. Add and commit your changes: + + ```text + $ git add . + $ git commit -m "Set up GitHub workflow" + ``` + +1. Push to the `master` branch: + + ```text + $ git push -u origin master + ``` + +1. View the GitHub Actions Workflow by selecting the `Actions` tab at the top + of your repository on GitHub. Then click on the `Build using Cloud Build` + element to see the details. + +[actions]: https://help.github.com/en/categories/automating-your-workflow-with-github-actions +[cloud-build]: https://cloud.google.com/cloud-build/ +[create-sa]: https://cloud.google.com/iam/docs/creating-managing-service-accounts +[create-key]: https://cloud.google.com/iam/docs/creating-managing-service-account-keys +[sdk]: https://cloud.google.com/sdk +[secrets]: https://help.github.com/en/actions/automating-your-workflow-with-github-actions/creating-and-using-encrypted-secrets +[roles]: https://cloud.google.com/iam/docs/granting-roles-to-service-accounts#granting_access_to_a_service_account_for_a_resource diff --git a/example-workflows/cloud-build/index.js b/example-workflows/cloud-build/index.js new file mode 100644 index 00000000..cdc2031c --- /dev/null +++ b/example-workflows/cloud-build/index.js @@ -0,0 +1,28 @@ +// Copyright 2020 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. + +const express = require('express'); +const app = express(); + +app.get('/', (req, res) => { + console.log('Hello world received a request.'); + + const target = process.env.TARGET || 'World'; + res.send(`Hello ${target}!`); +}); + +const port = process.env.PORT || 8080; +app.listen(port, () => { + console.log('Hello world listening on port', port); +}); diff --git a/example-workflows/cloud-build/package-lock.json b/example-workflows/cloud-build/package-lock.json new file mode 100644 index 00000000..b8746679 --- /dev/null +++ b/example-workflows/cloud-build/package-lock.json @@ -0,0 +1,374 @@ +{ + "name": "helloworld", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + } + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", + "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==" + }, + "mime-types": { + "version": "2.1.26", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", + "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "requires": { + "mime-db": "1.43.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + } + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + } + } +} diff --git a/example-workflows/cloud-build/package.json b/example-workflows/cloud-build/package.json new file mode 100644 index 00000000..b1f81256 --- /dev/null +++ b/example-workflows/cloud-build/package.json @@ -0,0 +1,14 @@ +{ + "name": "helloworld", + "version": "1.0.0", + "description": "Simple hello world sample in Node", + "main": "index.js", + "scripts": { + "start": "node index.js" + }, + "author": "", + "license": "Apache-2.0", + "dependencies": { + "express": "^4.17.1" + } +} From a333abdde10a1df7324617e971aa68bd756d5ade Mon Sep 17 00:00:00 2001 From: Seth Vargo Date: Tue, 28 Apr 2020 11:39:25 -0400 Subject: [PATCH 2/4] Add clarity around service_account_email Fixes GH-95 --- .../get-secretmanager-secrets-it.yml | 1 - .github/workflows/setup-gcloud-it.yml | 24 ++++++++++++++++--- action.yml | 9 +++---- .../cloud-run/.github/workflows/cloud-run.yml | 3 +-- example-workflows/cloud-run/README.md | 2 -- .../gae/.github/workflows/app-engine.yml | 3 +-- example-workflows/gae/README.md | 1 - .../gce/.github/workflows/gce.yaml | 3 +-- example-workflows/gce/README.md | 2 -- .../gke/.github/workflows/gke.yml | 3 +-- example-workflows/gke/README.md | 2 -- setup-gcloud/README.md | 11 ++++----- setup-gcloud/action.yml | 9 +++---- 13 files changed, 40 insertions(+), 33 deletions(-) diff --git a/.github/workflows/get-secretmanager-secrets-it.yml b/.github/workflows/get-secretmanager-secrets-it.yml index 5c7476f2..140a0457 100644 --- a/.github/workflows/get-secretmanager-secrets-it.yml +++ b/.github/workflows/get-secretmanager-secrets-it.yml @@ -13,7 +13,6 @@ jobs: - uses: actions/checkout@v2 - uses: ./setup-gcloud with: - service_account_email: ${{ secrets.GET_SECRETMANAGER_SECRETS_SA_EMAIL }} service_account_key: ${{ secrets.GET_SECRETMANAGER_SECRETS_SA_KEY_B64 }} export_default_credentials: true - id: secrets diff --git a/.github/workflows/setup-gcloud-it.yml b/.github/workflows/setup-gcloud-it.yml index 6893f829..221ac02b 100644 --- a/.github/workflows/setup-gcloud-it.yml +++ b/.github/workflows/setup-gcloud-it.yml @@ -24,8 +24,7 @@ jobs: - name: setup-gcloud uses: ./setup-gcloud/ with: - version: '286.0.0' - service_account_email: ${{ secrets.SETUP_GCLOUD_IT_EMAIL }} + version: '290.0.1' service_account_key: ${{ secrets.SETUP_GCLOUD_IT_KEY }} - name: Integration Tests @@ -42,6 +41,26 @@ jobs: steps: - uses: actions/checkout@v2 + - name: setup-gcloud + uses: ./setup-gcloud/ + with: + version: 'latest' + service_account_key: ${{ secrets.SETUP_GCLOUD_IT_KEY }} + + - name: Integration Tests + shell: bash + run: ./setup-gcloud/tests/integration-tests.sh + + email: + name: setup-gcloud user-defined email + runs-on: ${{ matrix.operating-system }} + strategy: + fail-fast: false + matrix: + operating-system: [ubuntu-latest, windows-latest, macos-latest] + steps: + - uses: actions/checkout@v2 + - name: setup-gcloud uses: ./setup-gcloud/ with: @@ -67,7 +86,6 @@ jobs: uses: ./setup-gcloud/ with: version: 'latest' - service_account_email: ${{ secrets.SETUP_GCLOUD_IT_EMAIL }} service_account_key: ${{ secrets.SETUP_GCLOUD_IT_KEY }} export_default_credentials: true diff --git a/action.yml b/action.yml index d06fd9c9..8dceaf22 100644 --- a/action.yml +++ b/action.yml @@ -23,14 +23,15 @@ inputs: description: |- Version of the gcloud SDK to install. If unspecified or set to "latest", the latest available gcloud SDK version for the target platform will be - installed. Example: "286.0.0". + installed. Example: "290.0.1". default: latest required: false service_account_email: description: |- - Service account email address to use for authentication. This is usually - of the format @.iam.gserviceaccount.com. + Service account email address to use for authentication. This is required + for legacy .p12 keys but can be omitted for .json keys. This is usually of + the format @.iam.gserviceaccount.com. required: false service_account_key: @@ -38,7 +39,7 @@ inputs: Service account key to use for authentication. This should be the JSON formatted private key which can be exported from the Cloud Console. The value can be raw or base64-encoded. - required: true + required: false project_id: description: |- diff --git a/example-workflows/cloud-run/.github/workflows/cloud-run.yml b/example-workflows/cloud-run/.github/workflows/cloud-run.yml index cd983129..79bf1337 100644 --- a/example-workflows/cloud-run/.github/workflows/cloud-run.yml +++ b/example-workflows/cloud-run/.github/workflows/cloud-run.yml @@ -36,8 +36,7 @@ jobs: # Setup gcloud CLI - uses: GoogleCloudPlatform/github-actions/setup-gcloud@master with: - version: '286.0.0' - service_account_email: ${{ secrets.RUN_SA_EMAIL }} + version: '290.0.1' service_account_key: ${{ secrets.RUN_SA_KEY }} project_id: ${{ secrets.RUN_PROJECT }} diff --git a/example-workflows/cloud-run/README.md b/example-workflows/cloud-run/README.md index f42b390a..8b076af5 100644 --- a/example-workflows/cloud-run/README.md +++ b/example-workflows/cloud-run/README.md @@ -70,8 +70,6 @@ For pushes to the `master` branch, this workflow will: - `RUN_PROJECT`: Google Cloud project ID - - `RUN_SA_EMAIL`: the email of the service account - - `RUN_SA_KEY`: the content of the service account JSON file ## Run the workflow diff --git a/example-workflows/gae/.github/workflows/app-engine.yml b/example-workflows/gae/.github/workflows/app-engine.yml index e0f9680e..bab2b9b5 100644 --- a/example-workflows/gae/.github/workflows/app-engine.yml +++ b/example-workflows/gae/.github/workflows/app-engine.yml @@ -31,9 +31,8 @@ jobs: # Setup and configure gcloud CLI - uses: GoogleCloudPlatform/github-actions/setup-gcloud@master with: - version: '286.0.0' + version: '290.0.1' project_id: ${{ secrets.PROJECT_ID }} - service_account_email: ${{ secrets.SA_EMAIL }} service_account_key: ${{ secrets.GOOGLE_APPLICATION_CREDENTIALS}} # Deploy App to App Engine diff --git a/example-workflows/gae/README.md b/example-workflows/gae/README.md index c798c152..fd8e49dd 100644 --- a/example-workflows/gae/README.md +++ b/example-workflows/gae/README.md @@ -34,7 +34,6 @@ For pushes to the _default_ branch, `master`, the workflow will: 1. Fill in the [repository's secret][secrets]: * `PROJECT_ID` Your Project Id - * `SA_EMAIL` Service Account email * `GOOGLE_APPLICATION_CREDENTIALS` Service Account Key 1. Enable the [App Engine API and Cloud Build API.](https://console.cloud.google.com/flows/enableapi?apiid=appengine.googleapis.com,cloudbuild.googleapis.com&redirect=https://console.cloud.google.com&_ga=2.248833607.-1346582427.1578963531). diff --git a/example-workflows/gce/.github/workflows/gce.yaml b/example-workflows/gce/.github/workflows/gce.yaml index 0aa9e780..2b8ab852 100644 --- a/example-workflows/gce/.github/workflows/gce.yaml +++ b/example-workflows/gce/.github/workflows/gce.yaml @@ -36,8 +36,7 @@ jobs: # Setup gcloud CLI - uses: GoogleCloudPlatform/github-actions/setup-gcloud@master with: - version: '286.0.0' - service_account_email: ${{ secrets.GCE_SA_EMAIL }} + version: '290.0.1' service_account_key: ${{ secrets.GCE_SA_KEY }} project_id: ${{ secrets.GCE_PROJECT }} diff --git a/example-workflows/gce/README.md b/example-workflows/gce/README.md index 2e899ef6..94d0d33c 100644 --- a/example-workflows/gce/README.md +++ b/example-workflows/gce/README.md @@ -64,8 +64,6 @@ For pushes to the `master` branch, this workflow will: - `GCE_PROJECT`: Google Cloud project ID - - `GCE_SA_EMAIL`: the email of the service account - - `GCE_SA_KEY`: the content of the service account JSON file 1. Update `.github/workflows/gce.yml` to match the values corresponding to your diff --git a/example-workflows/gke/.github/workflows/gke.yml b/example-workflows/gke/.github/workflows/gke.yml index ec43e903..fd020ecf 100644 --- a/example-workflows/gke/.github/workflows/gke.yml +++ b/example-workflows/gke/.github/workflows/gke.yml @@ -37,8 +37,7 @@ jobs: # Setup gcloud CLI - uses: GoogleCloudPlatform/github-actions/setup-gcloud@master with: - version: '286.0.0' - service_account_email: ${{ secrets.GKE_SA_EMAIL }} + version: '290.0.1' service_account_key: ${{ secrets.GKE_SA_KEY }} project_id: ${{ secrets.GKE_PROJECT }} diff --git a/example-workflows/gke/README.md b/example-workflows/gke/README.md index 7479bdfd..97d844ee 100644 --- a/example-workflows/gke/README.md +++ b/example-workflows/gke/README.md @@ -64,8 +64,6 @@ For pushes to the `master` branch, this workflow will: - `GKE_PROJECT`: Google Cloud project ID - - `GKE_SA_EMAIL`: the email of the service account - - `GKE_SA_KEY`: the content of the service account JSON file 1. Update `.github/workflows/gce.yml` to match the values corresponding to your diff --git a/setup-gcloud/README.md b/setup-gcloud/README.md index 570522ba..c3be467f 100644 --- a/setup-gcloud/README.md +++ b/setup-gcloud/README.md @@ -30,8 +30,8 @@ It does the following: per-invocation basis using the `--project` flag. 1. If `service_account_key` is specified, authenticates the gcloud CLI tool - using the inputs: `service_account_email` and `service_account_key`. Please - see the [Service Account documentation][sa-iam-docs] for more information. + using the service account key. For legacy .p12 keys, you must also specify a + `service_account_email`. 1. If `export_default_credentials` is specified, exports the path to the credentials in the environment variable `GOOGLE_APPLICATION_CREDENTIALS` to @@ -56,9 +56,8 @@ steps: - uses: actions/checkout@v2 - uses: GoogleCloudPlatform/github-actions/setup-gcloud@master with: - version: '285.0.0' + version: '290.0.1' project_id: ${{ secrets.GCP_PROJECT_ID }} - service_account_email: ${{ secrets.GCP_SA_EMAIL }} service_account_key: ${{ secrets.GCP_SA_KEY }} export_default_credentials: true - run: gcloud info @@ -66,9 +65,9 @@ steps: ## Inputs -* `version`: (Optional) The version of the gcloud to be installed. Example: `285.0.0`, Default: `latest` +* `version`: (Optional) The version of the gcloud to be installed. Example: `290.0.1`, Default: `latest` -* `service_account_email`: (Optional) The service account email which will be used for authentication. +* `service_account_email`: (Optional) Service account email address to use for authentication. This is required for legacy .p12 keys but can be omitted for .json keys. This is usually of the format `@.iam.gserviceaccount.com`. * `service_account_key`: (Optional) The service account key which will be used for authentication. This key should be [created](https://cloud.google.com/iam/docs/creating-managing-service-account-keys), encoded as a [Base64](https://en.wikipedia.org/wiki/Base64) string (eg. `cat my-key.json | base64` on macOS), and stored as a [secret](https://help.github.com/en/actions/automating-your-workflow-with-github-actions/creating-and-using-encrypted-secrets). diff --git a/setup-gcloud/action.yml b/setup-gcloud/action.yml index 24402c26..44ee73ca 100644 --- a/setup-gcloud/action.yml +++ b/setup-gcloud/action.yml @@ -23,14 +23,15 @@ inputs: description: |- Version of the gcloud SDK to install. If unspecified or set to "latest", the latest available gcloud SDK version for the target platform will be - installed. Example: "286.0.0". + installed. Example: "290.0.1". default: latest required: false service_account_email: description: |- - Service account email address to use for authentication. This is usually - of the format @.iam.gserviceaccount.com. + Service account email address to use for authentication. This is required + for legacy .p12 keys but can be omitted for .json keys. This is usually of + the format @.iam.gserviceaccount.com. required: false service_account_key: @@ -38,7 +39,7 @@ inputs: Service account key to use for authentication. This should be the JSON formatted private key which can be exported from the Cloud Console. The value can be raw or base64-encoded. - required: true + required: false project_id: description: |- From c2cf2051640879fa864b4b6babe78233cb231474 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 29 Apr 2020 18:00:12 +0000 Subject: [PATCH 3/4] Bump @actions/http-client from 1.0.7 to 1.0.8 in /setup-gcloud Bumps [@actions/http-client](https://github.com/actions/http-client) from 1.0.7 to 1.0.8. - [Release notes](https://github.com/actions/http-client/releases) - [Changelog](https://github.com/actions/http-client/blob/master/RELEASES.md) - [Commits](https://github.com/actions/http-client/commits) Signed-off-by: dependabot[bot] --- setup-gcloud/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/setup-gcloud/package-lock.json b/setup-gcloud/package-lock.json index fff9be49..f8a0b641 100644 --- a/setup-gcloud/package-lock.json +++ b/setup-gcloud/package-lock.json @@ -18,9 +18,9 @@ } }, "@actions/http-client": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-1.0.7.tgz", - "integrity": "sha512-PY3ys/XH5WMekkHyZhYSa/scYvlE5T/TV/T++vABHuY5ZRgtiBZkn2L2tV5Pv/xDCl59lSZb9WwRuWExDyAsSg==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-1.0.8.tgz", + "integrity": "sha512-G4JjJ6f9Hb3Zvejj+ewLLKLf99ZC+9v+yCxoYf9vSyH+WkzPLB2LuUtRMGNkooMqdugGBFStIKXOuvH1W+EctA==", "requires": { "tunnel": "0.0.6" } From 08b28dcb1da33b07659d13ec638848a96714cef3 Mon Sep 17 00:00:00 2001 From: Averi Kitsch Date: Thu, 30 Apr 2020 10:30:46 -0700 Subject: [PATCH 4/4] fix typo --- appengine-deploy/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appengine-deploy/README.md b/appengine-deploy/README.md index 7417e3c1..69dffc65 100644 --- a/appengine-deploy/README.md +++ b/appengine-deploy/README.md @@ -20,7 +20,7 @@ later build steps via outputs. This allows you to parameterize your App Engine deployments. **Note** This action will install gcloud in the background if not using in with -the [`setup-gcloud` action](../setup-gclou/README.md). +the [`setup-gcloud` action](../setup-gcloud/README.md). ## Prerequisites