diff --git a/docs/learn/106-cloudrun.md b/docs/learn/106-cloudrun.md new file mode 100644 index 00000000..96aec4ca --- /dev/null +++ b/docs/learn/106-cloudrun.md @@ -0,0 +1,115 @@ +--- +slug: /learn/106-cloudrun +--- + +# Dagger 106: deploy to Cloud Run + +This tutorial illustrates how to use Dagger to build, push and deploy Docker images to Cloud Run. + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +## Initialize a Dagger Workspace and Environment + +### (optional) Setup example app + +You will need the local copy of the [Dagger examples repository](https://github.com/dagger/examples) used in previous guides + +```shell +git clone https://github.com/dagger/examples +``` + +Make sure that all commands are being ran from the todoapp directory: + +```shell +cd examples/todoapp +``` + +### (optional) Initialize a Cue module + +In this guide we will use the same directory as the root of the Dagger workspace and the root of the Cue module; but you can create your Cue module anywhere inside the Dagger workspace. + +```shell +cue mod init +``` + +### Organize your package + +Let's create a new directory for our Cue package: + +```shell +mkdir cue.mod/gcpcloudrun +``` + +### Create a basic plan + +```cue title="todoapp/cue.mod/gcpcloudrun/source.cue" +package gcpcloudrun + +import ( + "alpha.dagger.io/dagger" + "alpha.dagger.io/docker" + "alpha.dagger.io/gcp" + "alpha.dagger.io/gcp/cloudrun" + "alpha.dagger.io/gcp/gcr" +) + +// Source code of the sample application +src: dagger.#Artifact & dagger.#Input + +// GCR full image name +imageRef: string & dagger.#Input + +image: docker.#Build & { + source: src +} + +gcpConfig: gcp.#Config + +creds: gcr.#Credentials & { + config: gcpConfig +} + +push: docker.#Push & { + target: imageRef + source: image + auth: { + username: creds.username + secret: creds.secret + } +} + +deploy: cloudrun.#Service & { + config: gcpConfig + image: push.ref +} +``` + +## Set up the environment + +### Create a new environment + +Now that your Cue package is ready, let's create an environment to run it: + +```shell +dagger new 'gcpcloudrun' -m cue.mod/gcpcloudrun +``` + +### Configure user inputs + +```shell +dagger input dir src . -e gcpcloudrun +dagger input text deploy.name todoapp -e gcpcloudrun +dagger input text imageRef gcr.io//todoapp -e gcpcloudrun +dagger input text gcpConfig.region us-west2 -e gcpcloudrun +dagger input text gcpConfig.project -e gcpcloudrun +dagger input secret gcpConfig.serviceKey -f ./gcp-sa-key.json -e gcpcloudrun +``` + +## Deploy + +Now that everything is properly set, let's deploy on Cloud Run: + +```shell +dagger up -e gcpcloudrun +``` diff --git a/docs/reference/universe/README.md b/docs/reference/universe/README.md index 139b2b41..c0458a15 100644 --- a/docs/reference/universe/README.md +++ b/docs/reference/universe/README.md @@ -14,6 +14,7 @@ - [docker](./docker/README.md) - Docker container operations - [docker/compose](./docker/compose.md) - Docker-compose operations - [gcp](./gcp/README.md) - Google Cloud Platform +- [gcp/cloudrun](./gcp/cloudrun.md) - - - [gcp/gcr](./gcp/gcr.md) - Google Container Registry - [gcp/gcs](./gcp/gcs.md) - Google Cloud Storage - [gcp/gke](./gcp/gke.md) - Google Kubernetes Engine diff --git a/docs/reference/universe/gcp/cloudrun.md b/docs/reference/universe/gcp/cloudrun.md new file mode 100644 index 00000000..74bc240b --- /dev/null +++ b/docs/reference/universe/gcp/cloudrun.md @@ -0,0 +1,29 @@ +--- +sidebar_label: cloudrun +--- + +# alpha.dagger.io/gcp/cloudrun + +```cue +import "alpha.dagger.io/gcp/cloudrun" +``` + +## cloudrun.#Service + +Service deploys a Cloud Run service based on provided GCR image + +### cloudrun.#Service Inputs + +| Name | Type | Description | +| ------------- |:-------------: |:-------------: | +|*config.region* | `string` |GCP region | +|*config.project* | `string` |GCP project | +|*config.serviceKey* | `dagger.#Secret` |GCP service key | +|*name* | `string` |Cloud Run service name | +|*image* | `string` |GCR image ref | +|*platform* | `*"managed" \| string` |Cloud Run platform | +|*port* | `*"80" \| string` |Cloud Run service exposed port | + +### cloudrun.#Service Outputs + +_No output._ diff --git a/examples/cloudrun-app/main.cue b/examples/cloudrun-app/main.cue new file mode 100644 index 00000000..4491394e --- /dev/null +++ b/examples/cloudrun-app/main.cue @@ -0,0 +1,20 @@ +package main + +import ( + "dagger.io/gcp" + "dagger.io/gcp/cloudrun" +) + +// Cloud Run service name +serviceName: *"cloudrun-test" | string @dagger(input) + +// Image name +image: string @dagger(input) + +gcpConfig: gcp.#Config + +deploy: cloudrun.#Deploy & { + "serviceName": serviceName + "image": image + config: gcpConfig +} diff --git a/stdlib/.dagger/env/google-cloudrun/.gitignore b/stdlib/.dagger/env/google-cloudrun/.gitignore new file mode 100644 index 00000000..01ec19b0 --- /dev/null +++ b/stdlib/.dagger/env/google-cloudrun/.gitignore @@ -0,0 +1,2 @@ +# dagger state +state/** diff --git a/stdlib/.dagger/env/google-cloudrun/values.yaml b/stdlib/.dagger/env/google-cloudrun/values.yaml new file mode 100644 index 00000000..72682a01 --- /dev/null +++ b/stdlib/.dagger/env/google-cloudrun/values.yaml @@ -0,0 +1,31 @@ +plan: + module: ./gcp/cloudrun/ + package: ./tests +name: google-cloudrun +inputs: + TestConfig.gcpConfig.project: + text: dagger-ci + TestConfig.gcpConfig.region: + text: us-west2 + TestConfig.gcpConfig.serviceKey: + secret: ENC[AES256_GCM,data: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,iv:4TEnsQAMYuk8x4EYkT+i1ibsIovbt6pzYGv685SKBjI=,tag:JV4R9kOnAYefNjDiXNUzdA==,type:str] +sops: + kms: [] + gcp_kms: [] + azure_kv: [] + hc_vault: [] + age: + - recipient: age1gxwmtwahzwdmrskhf90ppwlnze30lgpm056kuesrxzeuyclrwvpsupwtpk + enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBFMkRmY0dVcWVieEg5QWNw + MVRxMXVjZXBqTnQ4bmNEK1FBSTdZckdJZWhzCmk4ZFhrUUJVYXU0V2V1MmdPVDIz + LzlBSHFrR0xIVFlMblNHN3EyZ2lHNWsKLS0tIFZPNVVDUUFzclRXYUwrdnVuUTJW + MS9KVmtwczR3R3luU3pzaExXdEVMck0KBDEHK2xu5xnaIuX3vxJV5kUVJvtdWXbs + UU1xOdXor67vnppQuydXjmS4KHj9sUuv7ZieJdb6ncnuNxClizlWYA== + -----END AGE ENCRYPTED FILE----- + lastmodified: "2021-07-01T07:05:02Z" + mac: ENC[AES256_GCM,data:JToQ5grcEkfvUPxMKTdSW2lx3B6oRJdOwduQA7/F+7GJweaAcsxc7LjMRCvEv2uoeUcWS7et/T3Nei9tk59lEPNjqLhHjF+Mc1lBJFZN2BXZiOhX58TEr+klfnmxAsLOiWFFubnlQxSoVv/GiiE9KCE7/sYo4Fs9siIhps4T+bM=,iv:YxLqCwJWGYkBtzC6XcAsuRGfszhYc0D50PyAbiLuXn4=,tag:ZXaPOH75+BSJWL0DOxsecw==,type:str] + pgp: [] + encrypted_suffix: secret + version: 3.7.1 diff --git a/stdlib/gcp/cloudrun/cloudrun.cue b/stdlib/gcp/cloudrun/cloudrun.cue new file mode 100644 index 00000000..ada3fdf0 --- /dev/null +++ b/stdlib/gcp/cloudrun/cloudrun.cue @@ -0,0 +1,53 @@ +package cloudrun + +import ( + "alpha.dagger.io/dagger/op" + "alpha.dagger.io/gcp" +) + +// Service deploys a Cloud Run service based on provided GCR image +#Service: { + // GCP Config + config: gcp.#Config + + // Cloud Run service name + name: string @dagger(input) + + // GCR image ref + image: string @dagger(input) + + // Cloud Run platform + platform: *"managed" | string @dagger(input) + + // Cloud Run service exposed port + port: *"80" | string @dagger(input) + + #up: [ + op.#Load & { + from: gcp.#GCloud & { + "config": config + } + }, + + op.#Exec & { + args: [ + "/bin/bash", + "--noprofile", + "--norc", + "-eo", + "pipefail", + "-c", + #""" + gcloud run deploy "$SERVICE_NAME" --image "$IMAGE" --region "$REGION" --port "$PORT" --platform "$PLATFORM" --allow-unauthenticated + """#, + ] + env: { + SERVICE_NAME: name + PLATFORM: platform + REGION: config.region + IMAGE: image + PORT: port + } + }, + ] +} diff --git a/stdlib/gcp/cloudrun/tests/cloudrun.cue b/stdlib/gcp/cloudrun/tests/cloudrun.cue new file mode 100644 index 00000000..18112608 --- /dev/null +++ b/stdlib/gcp/cloudrun/tests/cloudrun.cue @@ -0,0 +1,14 @@ +package cloudrun + +import ( + "alpha.dagger.io/gcp" + "alpha.dagger.io/gcp/cloudrun" +) + +TestConfig: gcpConfig: gcp.#Config + +TestCloudRun: deploy: cloudrun.#Service & { + config: TestConfig.gcpConfig + name: "todoapp" + image: "gcr.io/dagger-ci/todoapp:latest" +} diff --git a/stdlib/universe.bats b/stdlib/universe.bats index 3dc58ec4..79a0e680 100644 --- a/stdlib/universe.bats +++ b/stdlib/universe.bats @@ -152,6 +152,10 @@ setup() { dagger -e google-gke up } +@test "google cloud: cloudrun" { + dagger -e google-cloudrun up +} + @test "terraform" { # it must fail because of a missing var run dagger -e terraform up diff --git a/tests/README.md b/tests/README.md index 5d4bb2de..3f600c67 100644 --- a/tests/README.md +++ b/tests/README.md @@ -3,7 +3,7 @@ ## TL;DR ```shell -# Install dependancies +# Install dependencies yarn install # Install gnu parallel if needed