Commit Graph

48 Commits

Author SHA1 Message Date
Matthew Soulanille 9ebe08f538
Increase cloudbuild.yml timeout to 2 hours (#6902) 2022-10-05 13:11:13 -07:00
Matthew Soulanille c2784d4358
Use the release docker for all cloudbuild steps (#5669)
Make all cloudbuild CI steps use the release docker, as described in #5640.
2021-09-27 15:00:18 -07:00
Matthew Elliott Soulanille 7bd157e2c2
[Fixed] Run CI on a single machine by generating cloudbuild files (#4186)
* Run CI on a single machine by generating cloudbuild files

Instead of running each CI test on a separate Google Cloud machine, generate a cloudbuild.yml file to test all affected packages on a single machine. The benifits of this strategy include the following:
* Fewer machines are required for a single test (2 instead of up to 12), so queuing should happen much less often.
* Packages only need to be built once, instead of once per machine.
* Multithreaded steps have access to more cores.

When CI is run, the root cloudbuild.yml is launched on Google Cloud. This file has only three steps: Install yarn dependencies, run `yarn generate-cloudbuild-for-packages`, and run `run-build.sh`. The second step finds what packages were affected by the change and combines their cloudbuild.yml files into a single `cloudbuild_generated.yml` file, and the third step launches the generated build on Google Cloud. The steps in the generated build are set to `waitFor` each other according to the dependency tree `scripts/package_dependencies.json`, and each package's `build-deps` step is removed in favor of waiting for its dependencies to be built.

Each package's cloudbuild file still works as expected, and there are two new yarn commands at the root:
* `yarn test-packages` tests all packages affected by a change. It performs the same steps as CI.
* `yarn generate-cloudbuild-for-packages [PACKAGE]...` generates the cloudbuild file to test each `PACKAGE` and packages it might affect. If given no packages, it detects what packages have been changed in the current PR.

* Verify the dependency graph is a valid graph

* Add dependencies to e2e

* Use the node:12 docker image for tfjs-node CI

tfjs-node builds N-API bindings that end-to-end tests need to use. End-to-end uses our custom docker image (gcr.io/learnjs-174218/release) since it has to build tfjs-backend-wasm when it's run by itself (which requires emscripten). Our custom image uses node 12, and is incompatible with node 10 N-API bindings. Eventually, we'll want to move everything that's using node:10 to node:12, but that's out of the scope of this commit.

* Remove TODO and allow changes to generate_cloudbuild.js to trigger a full rebuild

* Add tfjs-backend-cpu to tfjs-data in package_dependencies.json

tfjs-backend-cpu is listed in tfjs-data's package.json as a linked dependency, but was missing form package_dependencies.json.

* Don't have tfjs-backend-webgpu build its dependencies in CI

Move tfjs-backend-webgpu's dependency building to the 'build-deps' step so it can be removed during CI.

This commit also updates the test cloudbuild files that should have been updated in f9c1fdd814. It would probably be best to amend that commit, but last time I tried force-pushing in GitHub, I broke the PR I was working on.

* Revert changes in tfjs-backend-webgpu to master

tfjs-backend-webgpu is now pinned at v2.7.0 for all its tfjs dependencies.

* Add the update-cloudbuild-tests script to package.json

update-cloudbuild-tests updates the change detection tests for scripts/generate_cloudbuild.js. It should be run iff a change affects cloudbuild files or the dependency tree.

* Make tfjs-backend-webgpu tests wait for yarn to run

* Add a destination argument to generate_cloudbuild_for_packages.js

Co-authored-by: Ping Yu <4018+pyu10055@users.noreply.github.com>
2020-11-10 14:10:40 -05:00
Na Li e285254f34
Revert "Run CI on a single machine by generating cloudbuild files. (#4147)" (#4163)
This reverts commit cfa756f814.
2020-10-30 13:41:54 -07:00
Matthew Elliott Soulanille cfa756f814
Run CI on a single machine by generating cloudbuild files. (#4147)
FEATURE
INTERNAL
* Run CI on a single machine by generating cloudbuild files.

Instead of running each CI test on a separate Google Cloud machine, generate a cloudbuild.yml file to test all affected packages on a single machine. The benifits of this strategy include the following:
* Fewer machines are required for a single test (2 instead of up to 12), so less queueing is required.
* Packages only need to be built once, instead of once per machine.
* Multithreaded steps have access to more cores.

When CI is run, the root cloudbuild.yml is launched on Google Cloud. This file has only two steps: Install yarn dependencies and run `yarn test-affected-packages`. The latter step finds what packages were affected by the change and combines their cloudbuild.yml files into a single `cloudbuild_generated.yml` file. The steps in this file are set to `waitFor` each other according to the dependency tree `scripts/package_dependencies.json`, and each package's `build-deps` step is removed in favor of waiting for its dependencies to be built.

Each package's cloudbuild file still works as expected, and there are a few new yarn commands at the root:
`yarn test-packages` tests all packages affected by a change. It's run during CI.
`yarn test-packages [PACKAGE]...` tests a given set of packages, including all packages they might affect if changed.

* Split generating the cloudbuild from running it

Google Cloud uses a separate image for node and for spawning more gcloud instances. The node image does not have the gcloud command, so we have to generate the cloudbuild file in one step and launch gcloud in another step.

Also fix the `rm` command in find_packages_with_diff.js to remove recursively.

* Add `yarn` to the `waitFor` field of webgpu tests

* Modularize Sum and Softmax. (#4148)

DEV

* Lint files

* Fix package dependencies for inference and vis

* Run CI on a single machine by generating cloudbuild files.

Instead of running each CI test on a separate Google Cloud machine, generate a cloudbuild.yml file to test all affected packages on a single machine. The benifits of this strategy include the following:
* Fewer machines are required for a single test (2 instead of up to 12), so less queueing is required.
* Packages only need to be built once, instead of once per machine.
* Multithreaded steps have access to more cores.

When CI is run, the root cloudbuild.yml is launched on Google Cloud. This file has only two steps: Install yarn dependencies and run `yarn test-affected-packages`. The latter step finds what packages were affected by the change and combines their cloudbuild.yml files into a single `cloudbuild_generated.yml` file. The steps in this file are set to `waitFor` each other according to the dependency tree `scripts/package_dependencies.json`, and each package's `build-deps` step is removed in favor of waiting for its dependencies to be built.

Each package's cloudbuild file still works as expected, and there are a few new yarn commands at the root:
`yarn test-packages` tests all packages affected by a change. It's run during CI.
`yarn test-packages [PACKAGE]...` tests a given set of packages, including all packages they might affect if changed.

* Split generating the cloudbuild from running it

Google Cloud uses a separate image for node and for spawning more gcloud instances. The node image does not have the gcloud command, so we have to generate the cloudbuild file in one step and launch gcloud in another step.

Also fix the `rm` command in find_packages_with_diff.js to remove recursively.

* Add `yarn` to the `waitFor` field of webgpu tests

* Lint files

* Fix package dependencies for inference and vis

* modularize node kernels (#4154)

Modularizes onesLike, zerosLike, unpack/unstack, batchMatMul, slice, isFinite, isInf, IsNan, reciprocal, squaredDifference

DEV

* Enable incremental typescript builds (#4092)

FEATURE
INTERNAL
Enable incremental builds in the root tsconfig.json to increase build speed during development. For example, running `yarn build` in tfjs-backend-cpu takes ~43 seconds without incremental builds and ~30 seconds with incremental builds (after the first build).

Co-authored-by: Ping Yu <4018+pyu10055@users.noreply.github.com>

* Fix typo in .github/stale.yml (#3642)

INTERNAL

* Address some of the comments

* Re-lint everything with VSCode.
* Hoist consts and use UPPER_SNAKE_CASE.
* Require each step to have an id and add ids to all steps in converter and vis.
* Use argparse for 'generate_cloudbuild_for_packages.js'

* Remove inference, vis, and react-native dependencies in package_dependencies.json

tfjs-inference, vis, and react-native use pinned versions of other tfjs packages, so they do not need to be tested when those pinned packages change.

* Fix generate_cloudbuild_for_packages

generate_cloudbuild_for_packages.js was using argparse functions from a later version of argparse that are not available in 1.0.10.

* [webgl] Modularize batchMatMul, sum. (#4140)

FEATURE

* Add Prod kernel to WASM backend. (#4138)

FEATURE
Co-authored-by: Ann Yuan <annyuan@gmail.com>

* Write tests for generate_cloudbuild.js

Write tests to detect if generate_cloudbuild's output changes. These tests are not unit tests, but they alert us if a change unexpectedly changes the project structure or the generation of cloudbuild files.

* Run CI on a single machine by generating cloudbuild files.

Instead of running each CI test on a separate Google Cloud machine, generate a cloudbuild.yml file to test all affected packages on a single machine. The benifits of this strategy include the following:
* Fewer machines are required for a single test (2 instead of up to 12), so less queueing is required.
* Packages only need to be built once, instead of once per machine.
* Multithreaded steps have access to more cores.

When CI is run, the root cloudbuild.yml is launched on Google Cloud. This file has only two steps: Install yarn dependencies and run `yarn test-affected-packages`. The latter step finds what packages were affected by the change and combines their cloudbuild.yml files into a single `cloudbuild_generated.yml` file. The steps in this file are set to `waitFor` each other according to the dependency tree `scripts/package_dependencies.json`, and each package's `build-deps` step is removed in favor of waiting for its dependencies to be built.

Each package's cloudbuild file still works as expected, and there are a few new yarn commands at the root:
`yarn test-packages` tests all packages affected by a change. It's run during CI.
`yarn test-packages [PACKAGE]...` tests a given set of packages, including all packages they might affect if changed.

* Split generating the cloudbuild from running it

Google Cloud uses a separate image for node and for spawning more gcloud instances. The node image does not have the gcloud command, so we have to generate the cloudbuild file in one step and launch gcloud in another step.

Also fix the `rm` command in find_packages_with_diff.js to remove recursively.

* Add `yarn` to the `waitFor` field of webgpu tests

* Lint files

* Fix package dependencies for inference and vis

* Address some of the comments

* Re-lint everything with VSCode.
* Hoist consts and use UPPER_SNAKE_CASE.
* Require each step to have an id and add ids to all steps in converter and vis.
* Use argparse for 'generate_cloudbuild_for_packages.js'

* Remove inference, vis, and react-native dependencies in package_dependencies.json

tfjs-inference, vis, and react-native use pinned versions of other tfjs packages, so they do not need to be tested when those pinned packages change.

* Fix generate_cloudbuild_for_packages

generate_cloudbuild_for_packages.js was using argparse functions from a later version of argparse that are not available in 1.0.10.

* Write tests for generate_cloudbuild.js

Write tests to detect if generate_cloudbuild's output changes. These tests are not unit tests, but they alert us if a change unexpectedly changes the project structure or the generation of cloudbuild files.

Co-authored-by: Na Li <linazhao@google.com>
Co-authored-by: Yannick Assogba <yassogba@google.com>
Co-authored-by: Ping Yu <4018+pyu10055@users.noreply.github.com>
Co-authored-by: Rajeshwar Reddy T <43972606+rthadur@users.noreply.github.com>
Co-authored-by: Ann Yuan <annyuan@gmail.com>
Co-authored-by: miaowzhang <miaowzhang@gmail.com>
2020-10-29 19:49:55 -07:00
Na Li cd2afcdb1f
Separate release flow into different trigger. (#3691) 2020-07-29 21:26:05 -07:00
Na Li 2e29f98649
Setup release e2e infra. (#3632) 2020-07-23 14:45:01 -07:00
Na Li c4e3297857
Initial check in of the tfjs inference api. (#3399)
DEV Initial check in of the tfjs inference api.
2020-06-08 16:21:31 -07:00
Na Li 04e2c574a0
Start moving integration tests to top level folder. Introduce a tag mechanism for smoke and regression tests. (#3285)
DEV Start moving integration tests to top level folder. Introduce a tag mechanism for smoke and regression tests.
2020-05-21 16:50:36 -07:00
Yannick Assogba ed978b8a33
add tfjs-vis back to test matrix (#3153)
INTERNAL
2020-04-28 12:21:01 -04:00
Yannick Assogba 8c59e2b43a
Update packages to compile to ESM modules by default (#3112)
BREAKING
INTERNAL
2020-04-27 13:29:25 -04:00
Yannick Assogba c823c1f944
move webgl backend out of core (#3056)
BREAKING

This moves the webgl backend out of tfjs-core into its own package. It can be used as a peer dependency alongside tfjs-core and is part of our larger work to modularise tfjs.
2020-04-10 11:59:35 -04:00
Yannick Assogba b72893a610
Move cpu backend out of tfjs-core (#3008)
BREAKING

This moves the javascript cpu backend out of tfjs-core into its own package. It can be used as a peer dependency alongside tfjs-core and is part of our larger work to modularise tfjs.
2020-04-08 11:27:41 -04:00
Na Li 10c3ee469d
Remove test-integration. (#2970)
DEV Remove redundant integration tests.
2020-04-03 10:19:07 -07:00
Na Li 1834ede5be
Turn off nightly run for union package. (#2985) 2020-03-30 11:27:25 -07:00
Na Li c16bbc8fdd
Fix nightly build. (#2975) 2020-03-26 21:05:33 -07:00
Na Li 956672f5fe
[core] Move variations of the same set of tests to nightly. (#2960) 2020-03-25 10:42:32 -07:00
Na Li 575bb2c906
Change diffing logic for the new release process. (#2867) 2020-03-11 11:21:57 -07:00
Na Li 0162a295d1
Add affected packages analysis. (#2793) 2020-02-28 16:46:04 -08:00
Nikhil Thorat 0432239516
Update release notes script to work with the monorepo. (#2538)
DEV

1.4.0 release notes here: https://github.com/tensorflow/tfjs/releases/tag/tfjs-v1.4.0

This change:
- Moves the script out of tfjs.
- Adds support for the monorepo. This now has to filter commits for the folder name. In the future we can support changelogs for other directories.
2019-12-12 12:04:37 -05:00
Daniel Smilkov e196c8e166
Enable CI testing for the WASM backend (#2086)
DEV

- Enable CI testing for the WASM backend
- Improve documentation to depend on EMSDK 1.38.41 since 1.38.42 and later brake bazel.
2019-09-24 12:54:35 -04:00
Nikhil Thorat 4faed8a04c
Create a tfjs-node-gpu directory. (#1925)
Each of the following get copied during "prepare" phase, which is on local NPM install (but not when a dependent package installs): https://docs.npmjs.com/misc/scripts

- tfjs-node/src => tfjs-node-gpu/src
- tfjs-node/binding => tfjs-node-gpu/binding
- tfjs-node/scripts => tfjs-node-gpu/scripts
- tfjs-node/binding.gyp => tfjs-node-gpu/binding.gyp

We do this with a copy because symlinks have the incorrect local directory structure.

This PR also fixes a bug where the node backend file caches the backend (this is incorrect behavior because it may switch out during unit tests or if there are accidentally 2 copies of tfjs-node as a dependency).

DEV
2019-09-11 11:43:38 -04:00
Nikhil Thorat ea0df3f211
Update the diff script to be smarter and diff against the merge… (#1990)
The diff script now clones and the current branch and commit as well as master rewinded to the merge base of the current branch and master to only find changes against where the branch was created (only true for branches on the main repo).

For forks, we diff against tensorflow/tfjs:master.

Test PRs:
- From a fork:master => https://github.com/tensorflow/tfjs/pull/1993
- From a fork:branch => https://github.com/tensorflow/tfjs/pull/2005
- This PR: from a branch that is behind master.

Note that this PR is behind tfjs-node version bump from 1.2.8 => 1.2.9

DEV
2019-09-09 14:02:02 -04:00
Kangyi Zhang 804977597e Increase Cloud CI timeout so integration tests can run (#1973)
DEV
2019-09-04 15:29:31 -04:00
Nikhil Thorat 451f8f665d
Add tfjs-vis to cloudbuild.yml and setup whitelist for files to… (#1874)
DEV
2019-08-22 10:25:08 -04:00
Daniel Smilkov 82d111e63e
Enable Cloud Build CI for tfjs-node (#1863)
DEV
2019-08-21 16:43:51 -04:00
Nikhil Thorat 8964f85a56 Revert "Add tfjs-vis to cloudbuild and setup whitelisted diff files."
This reverts commit af748c1dde.
2019-08-20 13:57:21 -04:00
Nikhil Thorat af748c1dde Add tfjs-vis to cloudbuild and setup whitelisted diff files. 2019-08-20 13:55:30 -04:00
Nikhil Thorat 4df0ab6e8d
Add cloudbuild.yml entry for tfjs-layers. (#1841)
DEV
2019-08-19 09:32:33 -04:00
Ann Yuan b9e43bb998
tfjs-webgpu: Rename tfjs-webgpu to tfjs-backend-webgpu. (#1839)
INTERNAL
2019-08-15 16:55:18 -04:00
Nikhil Thorat f3c503e9f9 Add tfjs-converter to the top-level cloudbuild.yml. (#1837)
DEV
2019-08-15 12:50:39 -04:00
Nikhil Thorat 0d75937cd8
Migrate more scripts to the monorepo setup. (#1828)
DEV

This PR also:
- Fixes the test-integration script by running it as a top-level build (for now just runs against core).
- Adds tfjs-data to the cloudbuild.yml
- Makes tfjs share tslint and tsconfig with the monorepo.
- Adds a directory entry for the tfjs cloudbuild.yml file.
2019-08-14 15:20:50 -04:00
Daniel Smilkov 7057bf0bc3 Add build timeout and log dir settings to top-level cloudbuild.… (#1815)
DEV
2019-08-13 12:26:05 -04:00
Nikhil Thorat 9fd1948cef
Cleanup markdown files after monorepo merge & add tfjs cloudbui… (#1812) 2019-08-13 11:43:39 -04:00
Daniel Smilkov 8c2d9e0564
Move core to its own folder and enable Monorepo Build (#1876)
Move core to its own folder `tfjs-core` and enable Monorepo build system where each package build runs only if the PR touches a file in that package folder.

DEV
2019-08-12 16:59:42 -04:00
Nikhil Thorat 0d795357f8
Wait for yarn in webgpu / react native CI cloudbuild.yml. (#1877)
We need to wait for yarn on the parent folder because child directories will look in the parent node_modules. This introduces a race condition that causes the CI to be flaky.

DEV
2019-08-12 11:34:54 -04:00
Yannick Assogba 8a6d4d5947 Add react native unit tests to ci (#1870)
cla: yes
Add react native unit tests to CI
2019-08-07 15:37:17 -04:00
Nikhil Thorat 781f70658b
Move webgpu code to a top-level tfjs-webgpu folder. (#1797)
DEV

This makes the directory structure align with the NPM package structure more closely.

This has the added effect of making syncing to google3 much saner (one BUILD rule for each of the top-level NPM packages).
2019-06-19 11:45:20 -04:00
Nikhil Thorat 737f792215
Add a test to ensure dataSync is not used in agnostic tests. (#1729)
DEV

We do this with a separate CI test, `yarn test-async-backends` which creates a proxy object around a CPU backend to disallow top-level access to dataSync.

This PR also
- Adds a SYNC_BACKEND predicate which looks for the backend in the registry (and initializes it), checking for whether it is sync and only running sync tests in those environments (so they won't run in webgpu).
- Removes all the dataSync() calls in the backend_cpu and directly calls readSync (since the tests fail without that).
2019-05-09 16:06:35 -07:00
Nikhil Thorat b5a9215786
Make WebGPU CI wait for yarn. (#1737)
DEV
2019-05-03 13:48:25 -04:00
Nikhil Thorat 9960893532
Add snippet testing on CI. (#1715)
DEV

Example failure: https://pantheon.corp.google.com/cloud-build/builds/6ee4fe0b-2c1a-4e7e-aaf9-0707f6889da3?project=learnjs-174218

Also fix errors with snippets
- Add isNaN, isFinite, isInf chaining API
- Don't ignore scripts. This allows layers to depend on this script.
2019-04-30 11:47:55 -04:00
Daniel Smilkov 794758f2f7
Allow for registration of backends with async initialization (#1701)
FEATURE

Some backends can only be initialized in an async way (e.g. WebGPU, Wasm etc). However the current backend registry requires that backends are initialized immediately.

This change relaxes that constraint, allowing `tf.registerBackend(factory)` where `factory` can return either a `KernelBackend`, or a `Promise<KernelBackend>`.

It also introduces `tf.ready(): Promise<void>` which users can call to make sure they await for their backend to initialize. If an op is called without awaiting for the backend to be ready, we throw an Error reminding the user to call `await tf.ready()`.

Also:
- Add CI build and lint for webgpu (no karma yet b/c it requires a custom build of Chrome)
- Allow tests in core to be included selectively in a karma run in webgpu
2019-04-26 20:58:45 -04:00
Daniel Smilkov 5ba78cbd48
Add nightly cloud build (#1674)
DEV

Add 2 cloud functions to achieve nightly builds of tfjs-core. If the build fails, we will get an email and a hangouts chat message.

### `trigger_nightly`
Programatically triggers a Cloud Build on master. This function is called by the Cloud Scheduler at 3am every day.
You can also trigger the function manually via the Cloud UI.

Command to re-deploy:
```sh
gcloud functions deploy nightly \
  --runtime nodejs8 \
  --trigger-topic nightly
```

If a build was triggered by nightly, there is a substitution variable `_NIGHTLY=true`.
You can forward the substitution as the `NIGHTLY` environment variable so the scripts can use it, by specifying `env: ['NIGHTLY=$_NIGHTLY']` in `cloudbuild.yml`.
E.g. `test-integration` uses the `NIGHTLY` bit to always run on nightly.

### `send_email`
Sends an email and a chat message with the nightly build status. Every build sends a message to the `cloud-builds` topic with its build information. The `send_email` function is subscribed to that topic and ignores all builds (e.g. builds triggered by pull requests) **except** for the nightly build and sends an email to an internal mailing list with its build status around 3:10am.

Command to re-deploy:

```sh
gcloud functions deploy send_email \
  --runtime nodejs8 \
  --stage-bucket learnjs-174218_cloudbuild \
  --trigger-topic cloud-builds \
  --set-env-vars MAILGUN_API_KEY="[API_KEY_HERE]",HANGOUTS_URL="[URL_HERE]"
```

### The pipeline

The pipeline looks like this:

1) At 3am, Cloud Scheduler writes to `nightly` topic
2) That triggers the `nightly` function, which starts a build programatically
3) That build runs and writes its status to `cloud-builds` topic
4) That triggers the `send_email` function, which sends email and chat with the build status.
2019-04-15 13:31:03 -04:00
Nikhil Thorat 4d902c010f
Add a script to measure the bundle size. (#1666)
DEV
This adds a CI that measures the impact of the change against master for the bundle size.

The results below are for dropping backend CPU from index.ts.

```
yarn test-bundle-size

~~~~minified bundle~~~~
==> post-gzip
  diff:    -12.25 K  (-10.96%)
  master:  111.73 K
  change:   99.48 K

==> pre-gzip
  diff:    -45.68 K  (-9.83%)
  master:  464.95 K
  change:  419.26 K


~~~~unminified bundle~~~~
==> post-gzip
  diff:    -20.00 K  (-8.67%)
  master:  230.60 K
  change:  210.60 K

==> pre-gzip
  diff:   -145.45 K  (-9.91%)
  master: 1468.07 K
  change: 1322.62 K


~~~~esm bundle~~~~
==> post-gzip
  diff:    -12.31 K  (-11.05%)
  master:  111.39 K
  change:   99.08 K

==> pre-gzip
  diff:    -45.67 K  (-9.84%)
  master:  464.35 K
  change:  418.67 K

Done in 119.29s.
```
2019-04-12 11:57:32 -04:00
Daniel Smilkov 1f8c947352
Update rollup to latest and add ability to visualize bundle (#1668)
DEV

Add ability to visualize our browser bundle.

<img width="780" alt="Screen Shot 2019-04-06 at 1 15 05 PM" src="https://user-images.githubusercontent.com/2294279/55672856-0aa8eb00-586e-11e9-866c-148005669bce.png">

To produce a visualization, call `yarn rollup -c --visualize`
. It will output `dist/tf-core.min.js.html` with the breakdown. 

Details:
- Update rollup and its plugins to latest so we have this ability.
- Change the `build-npm.sh` script to visualize so we always publish the breakdown on npm. That way we can visit http://unpkg.com/@tensorflow/tfjs/dist/tf-core.min.js.html and see the breakdown for any published version.
2019-04-07 20:16:14 -04:00
Daniel Smilkov 4e1e7f26ce
Make build logs viewable for those who join our mailing list (#1661)
DEV
Make build logs viewable for those who join our mailing list by writing the logs to a public gcs bucket.

Also add a pull request template that informs people to join our mailing list if they want to see the build logs.
2019-04-03 09:50:55 -07:00
Daniel Smilkov 4a86e4a4c3
Remove travis (replaced by Cloud Build) (#1658)
DEV
2019-04-02 22:53:14 -07:00
Daniel Smilkov 3be71f6acf
Enable Google Cloud Build (#1657)
DEV
Add a `cloudbuild.yml` to enable Google Cloud Builds
2019-04-02 13:02:14 -07:00