Skip to content

ahmetb/rundev

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

91 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

rundev (αlpha)

rundev is a tool that provides rapid inner-loop development (save, build, deploy, browse) cycles for Cloud Run and Cloud Run on GKE.

It syncs code from your development machine to Cloud Run container instances and circumvents the docker image build and Cloud Run re-deployment steps to provide rapid feedback loops.

When you’re using Cloud Run, building a docker image, pushing the image, redeploying the app, and visiting the URL takes over a minute.

Rundev brings the inner-loop latency to under a second for dynamic languages (like Python, Node.js). For compiled languages (like Go, Java), it shows nearly identical (or faster) compilation speeds to your development machine:

Sample app iteration time Cloud Run Cloud Run on GKE
Python <1s <1s
Node.js ~1s <1s
Go ~3s ~1s

User Guide

Limitations

  • Supports only Cloud Run, and Cloud Run on GKE (only HTTP apps listening on $PORT)
  • Requires your app to have a Dockerfile (Jib, pack etc. not supported)
  • Requires local docker daemon (only to build/push the image one-time)
  • For compiled languages, the compiler/SDK must be present in the final stage of the image (e.g. javac or go compiler)

Installation

  • Install a local docker-engine (e.g. Docker for Desktop)
  • Install gcloud CLI

Install the nightly build of rundev client to your developer machine.

Currently only macOS or Linux are supported:

install_dir="/usr/local/bin" && \
  curl -sSLfo "${install_dir}/rundev" \
    "https://storage.googleapis.com/rundev-test/nightly/client/$(uname | tr '[:upper:]' '[:lower:]')/rundev-latest" && \
  chmod +x "${install_dir}/rundev"

Start developing

For an application that picks up new source code by restarting, just run:

rundev

If you have a compiled application, or an app that needs to specify build steps, annotate the RUN directives in the Dockerfile with # rundev comments:

RUN go build -o /out/server . # rundev
RUN npm install --production  # rundev

You can use #rundev comment to run commands only when some files are updated:

RUN go build -o /out/server .        # rundev[**/**.go, go.*]
RUN pip install -r requirements.txt  # rundev[requirements.txt]

After rundev command deploys an app to Cloud Run for development, you see a log line as follows:

local proxy server starting at http://localhost:8080 (proxying to https://...

Visit http://localhost:8080 to access your application with live code syncing.

Every time you visit this local server, rundev will ensure your local filesystem is in sync with the container’s filesystem:

  • if necessary, the modified files will be synced to Cloud Run app
  • your app will be rebuilt (if there are any build steps) and restarted
  • your query will be proxied to Cloud Run container instances.

Try changing the code, and visit your address again to see the updated application.

When you're done developing, hit Ctrl+C once for cleanup and exit.

Syncing files

Rundev uses a file-sync-over-HTTP protocol to securely sync files between the rundev client (running on your developer machine) and the rundevd daemon (running inside the container on Cloud Run).

If you have any files that you don’t want to syncronize to the container (such as .pyc files, .swp files, or node_modules directory, or .git directory), use a .dockerignore file to specify such files.

If you change the .dockerignore file or Dockerfile, you must restart the rundev session.

Debug endpoints

These are useful for me to debug when something is going wrong with fs syncing or process lifecycle.

/rundev/debugz : debug data for rundev client
/rundev/fsz    : local fs tree (+ ?full)

/rundevd/fsz     : remote fs tree (+ ?full)
/rundevd/debugz  : debug data for rundevd daemon
/rundevd/procz   : logs of current process
/rundevd/pstree  : process tree
/rundevd/restart : restart the user process
/rundevd/kill    : kill the user process (or specify ?pid=)

This is not an official Google product. See LICENSE.

About

(alpha, contact me if you’re using)

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published