docs: Modify 107 and 108 packages to follow 102 guidelines => work in subdir
Signed-off-by: Guillaume de Rouville <guillaume.derouville@gmail.com>
This commit is contained in:
parent
0375f9bf96
commit
f8d8a68a5e
@ -23,7 +23,7 @@ values={[
|
||||
{label: 'EKS', value: 'eks'},
|
||||
]}>
|
||||
|
||||
<TabItem value="kind">
|
||||
<TabItem value="kind">
|
||||
|
||||
[Kind](https://kind.sigs.k8s.io/docs/user/quick-start) is a tool for running local Kubernetes clusters using Docker.
|
||||
|
||||
@ -80,19 +80,43 @@ This tutorial can be run against a [AWS EKS](https://aws.amazon.com/eks/) cluste
|
||||
|
||||
## 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
|
||||
mkdir dagger-kubernetes && cd dagger-kubernetes
|
||||
dagger init
|
||||
dagger new default
|
||||
git clone https://github.com/dagger/examples
|
||||
```
|
||||
|
||||
Make sure that all commands are run 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 kube
|
||||
```
|
||||
|
||||
## Create a basic plan
|
||||
|
||||
Create a file named `.dagger/env/default/plan/manifest.cue` and add the
|
||||
Create a file named `manifest.cue` and add the
|
||||
following configuration to it.
|
||||
|
||||
```cue title=".dagger/env/default/plan/manifest.cue"
|
||||
package main
|
||||
```cue title="todoapp/kube/manifest.cue"
|
||||
package kube
|
||||
|
||||
// inlined kubernetes manifest as a string
|
||||
manifest: """
|
||||
@ -123,7 +147,7 @@ manifest: """
|
||||
This will define a `manifest` variable containing the inlined Kubernetes YAML
|
||||
used to create a _nginx_ deployment.
|
||||
|
||||
Next, create `.dagger/env/default/plan/main.cue`.
|
||||
Next, create `source.cue`.
|
||||
|
||||
<Tabs
|
||||
defaultValue="kind"
|
||||
@ -136,8 +160,8 @@ values={[
|
||||
|
||||
<TabItem value="kind">
|
||||
|
||||
```cue title=".dagger/env/default/plan/main.cue"
|
||||
package main
|
||||
```cue title="todoapp/kube/source.cue"
|
||||
package kube
|
||||
|
||||
import (
|
||||
"dagger.io/dagger"
|
||||
@ -163,8 +187,8 @@ deploy: kubernetes.#Resources & {
|
||||
|
||||
<TabItem value="gke">
|
||||
|
||||
```cue title=".dagger/env/default/plan/main.cue"
|
||||
package main
|
||||
```cue title="todoapp/kube/source.cue"
|
||||
package kube
|
||||
|
||||
import (
|
||||
"dagger.io/kubernetes"
|
||||
@ -191,8 +215,8 @@ deploy: kubernetes.#Resources & {
|
||||
|
||||
<TabItem value="eks">
|
||||
|
||||
```cue title=".dagger/env/default/plan/main.cue"
|
||||
package main
|
||||
```cue title="todoapp/kube/source.cue"
|
||||
package kube
|
||||
|
||||
import (
|
||||
"dagger.io/kubernetes"
|
||||
@ -225,6 +249,26 @@ This defines:
|
||||
- `deploy`: Deployment step using the package `dagger.io/kubernetes`. It takes
|
||||
the `manifest` defined earlier and deploys it to the Kubernetes cluster specified in `kubeconfig`.
|
||||
|
||||
### Setup the environment
|
||||
|
||||
#### Create a new environment
|
||||
|
||||
Now that your Cue package is ready, let's create an environment to run it:
|
||||
|
||||
```shell
|
||||
dagger new 'kube'
|
||||
```
|
||||
|
||||
#### Load the plan into the environment
|
||||
|
||||
Now let's configure the new environment to use our package as its plan:
|
||||
|
||||
```shell
|
||||
cp kube/*.cue .dagger/env/kube/plan/
|
||||
```
|
||||
|
||||
Note: you need to copy the files from your package into the environment, as shown above. If you make more changes to your package, you will need to copy the new version, or it will not be used. In the future, we will add the ability to reference your Cue package directory, making this manual copy unnecessary.
|
||||
|
||||
### Configure the environment
|
||||
|
||||
Before we can bring up the deployment, we need to provide the `kubeconfig` input
|
||||
@ -379,8 +423,8 @@ For a more advanced example, see the
|
||||
First, let's replace `manifest.cue` with the following configuration. This is a
|
||||
straightforward one-to-one conversion from YAML to CUE, only the syntax has changed.
|
||||
|
||||
```cue title=".dagger/env/default/plan/manifest.cue"
|
||||
package main
|
||||
```cue title="todoapp/kube/manifest.cue"
|
||||
package kube
|
||||
|
||||
import (
|
||||
"encoding/yaml"
|
||||
@ -415,6 +459,12 @@ manifest: yaml.Marshal(nginx)
|
||||
We're using the built-in `yaml.Marshal` function to convert CUE back to YAML so
|
||||
Kubernetes still receives the same manifest.
|
||||
|
||||
You need to copy the changes to the plan in order for Dagger to reference them
|
||||
|
||||
```shell
|
||||
cp kube/*.cue .dagger/env/kube/plan/
|
||||
```
|
||||
|
||||
You can inspect the configuration using `dagger query` to verify it produces the
|
||||
same manifest:
|
||||
|
||||
@ -428,10 +478,10 @@ kind: Deployment
|
||||
Now that the manifest is defined in CUE, we can take advantage of the language
|
||||
to remove a lot of boilerplate and repetition.
|
||||
|
||||
Let's define a re-usable `#Deployment` definition in `.dagger/env/default/plan/deployment.cue"`:
|
||||
Let's define a re-usable `#Deployment` definition in `todoapp/kube/deployment.cue"`:
|
||||
|
||||
```cue title=".dagger/env/default/plan/deployment.cue"
|
||||
package main
|
||||
```cue title="todoapp/kube/deployment.cue"
|
||||
package kube
|
||||
|
||||
// Deployment template containing all the common boilerplate shared by
|
||||
// deployments of this application.
|
||||
@ -478,7 +528,7 @@ package main
|
||||
|
||||
`manifest.cue` can be rewritten as follows:
|
||||
|
||||
```cue title=".dagger/env/default/plan/manifest.cue"
|
||||
```cue title="todoapp/kube/manifest.cue"
|
||||
import (
|
||||
"encoding/yaml"
|
||||
)
|
||||
@ -491,6 +541,12 @@ nginx: #Deployment & {
|
||||
manifest: yaml.Marshal(nginx.manifest)
|
||||
```
|
||||
|
||||
Update the plan
|
||||
|
||||
```shell
|
||||
cp kube/*.cue .dagger/env/kube/plan/
|
||||
```
|
||||
|
||||
Let's make sure it yields the same result:
|
||||
|
||||
```shell
|
||||
@ -524,8 +580,8 @@ The following configuration will:
|
||||
- Use `dagger.io/docker` to build and push the image
|
||||
- Use the registry image reference (`push.ref`) as the image for the deployment.
|
||||
|
||||
```cue title=".dagger/env/default/plan/manifest.cue"
|
||||
package main
|
||||
```cue title="todoapp/kube/manifest.cue"
|
||||
package kube
|
||||
|
||||
import (
|
||||
"encoding/yaml"
|
||||
@ -565,6 +621,12 @@ app: #Deployment & {
|
||||
manifest: yaml.Marshal(app.manifest)
|
||||
```
|
||||
|
||||
Update the plan
|
||||
|
||||
```shell
|
||||
cp kube/*.cue .dagger/env/kube/plan/
|
||||
```
|
||||
|
||||
### Connect the Inputs
|
||||
|
||||
Next, we'll provide the two new inputs, `repository` and `registry`.
|
||||
|
@ -20,28 +20,46 @@ The provisioning strategy detailed below follows S3 best practices. In order to
|
||||
|
||||
When developing a plan based on relays, the first thing to consider is to read their universe reference: it summarizes the expected inputs and their corresponding formats. [<u>Here</u>](https://dagger.io/aws/cloudformation) is the Cloudformation one.
|
||||
|
||||
### Setup
|
||||
## Initialize a Dagger Workspace and Environment
|
||||
|
||||
1.Initialize a new folder and a new workspace
|
||||
### (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
|
||||
mkdir infra-provisioning
|
||||
cd ./infra-provisioning
|
||||
dagger init
|
||||
git clone https://github.com/dagger/examples
|
||||
```
|
||||
|
||||
2.Create a new environment and create a `main.cue` file
|
||||
Make sure that all commands are run from the todoapp directory:
|
||||
|
||||
```shell
|
||||
dagger new s3-provisioning
|
||||
cd ./.dagger/env/s3-provisioning/plan/ #Personal preference to directly work inside the plan
|
||||
touch main.cue
|
||||
cd examples/todoapp
|
||||
```
|
||||
|
||||
3.Create corresponding `main` package
|
||||
### (optional) Initialize a Cue module
|
||||
|
||||
```cue title=".dagger/env/s3-provisioning/plan/main.cue"
|
||||
package main
|
||||
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 cloudformation
|
||||
```
|
||||
|
||||
### Setup the environment
|
||||
|
||||
#### Create a new environment
|
||||
|
||||
Now that your Cue package is ready, let's create an environment to run it:
|
||||
|
||||
```shell
|
||||
dagger new 'cloudformation'
|
||||
```
|
||||
|
||||
## Cloudformation
|
||||
@ -196,9 +214,9 @@ aws cloudformation validate-template --template-body file://template.json
|
||||
|
||||
Once you'll get used to Cue, you might directly write Cloudformation templates in this language. As most of the current examples are either written in JSON or in YAML, let's see how to lazily convert them in Cue (optional but recommended).
|
||||
|
||||
#### 1. Modify main.cue
|
||||
#### 1. Create convert.cue
|
||||
|
||||
We will temporarly modify `main.cue` to process the conversion
|
||||
We will create a `convert.cue` to process the conversion
|
||||
|
||||
<Tabs
|
||||
defaultValue="sv"
|
||||
@ -210,8 +228,8 @@ We will temporarly modify `main.cue` to process the conversion
|
||||
}>
|
||||
<TabItem value="sv">
|
||||
|
||||
```cue title=".dagger/env/s3-provisioning/plan/main.cue"
|
||||
package main
|
||||
```cue title="todoapp/cloudformation/convert.cue"
|
||||
package cloudformation
|
||||
import "encoding/json"
|
||||
|
||||
point: json.Unmarshal(data)
|
||||
@ -223,12 +241,9 @@ data: #"""
|
||||
</TabItem>
|
||||
<TabItem value="fv">
|
||||
|
||||
```cue title=".dagger/env/s3-provisioning/plan/main.cue"
|
||||
package main
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
)
|
||||
```cue title="todoapp/cloudformation/convert.cue"
|
||||
package cloudformation
|
||||
import "encoding/json"
|
||||
|
||||
point: json.Unmarshal(data)
|
||||
data: #"""
|
||||
@ -297,8 +312,8 @@ data: #"""
|
||||
</TabItem>
|
||||
<TabItem value="yv">
|
||||
|
||||
```cue title=".dagger/env/s3-provisioning/plan/main.cue"
|
||||
package main
|
||||
```cue title="todoapp/cloudformation/convert.cue"
|
||||
package cloudformation
|
||||
import "encoding/yaml"
|
||||
|
||||
point: yaml.Unmarshal(data)
|
||||
@ -310,6 +325,12 @@ data: """
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
You need to copy the changes to the plan in order for Dagger to reference them
|
||||
|
||||
```shell
|
||||
cp cloudformation/*.cue .dagger/env/cloudformation/plan/
|
||||
```
|
||||
|
||||
#### 2. Retrieve the Unmarshalled JSON
|
||||
|
||||
Then, still in the same folder, query the `point` value to retrieve the Unmarshalled result of `data`:
|
||||
@ -409,10 +430,11 @@ This Cue version of the JSON template is going to be integrated inside our provi
|
||||
|
||||
With the Cloudformation template now finished, tested and converted in Cue. We can now enter the last part of our guide: piping everything together inside our personal plan.
|
||||
|
||||
Before continuing, don't forget to reset your `main.cue` plan to it's _Setup_ form:
|
||||
Before continuing, don't forget to delete your `convert.cue` plan:
|
||||
|
||||
```cue title=".dagger/env/s3-provisioning/plan/main.cue"
|
||||
package main
|
||||
```shell
|
||||
rm todoapp/cloudformation/convert.cue
|
||||
rm .dagger/env/cloudformation/plan/convert.cue
|
||||
```
|
||||
|
||||
### Cloudformation relay
|
||||
@ -432,7 +454,7 @@ As our plan relies on [<u>Cloudformation's relay</u>](https://dagger.io/aws/clou
|
||||
|
||||
1.General insights
|
||||
|
||||
As seen before in the documentation, values starting with `*` are default values. However, as a plan developer, we may face the need to add default values to inputs from relays that don't have one : Cue gives you this flexibility (cf. `config` value detailed below).
|
||||
As seen before in the documentation, values starting with `*` are default values. However, as a plan developer, we may face the need to add default values to inputs from relays that don't have one : Cue gives you this flexibility.
|
||||
|
||||
> WARNING: All inputs without a default option have to be filled for a proper execution of the relay. In our case:
|
||||
>
|
||||
@ -446,7 +468,7 @@ As seen before in the documentation, values starting with `*` are default values
|
||||
|
||||
The config values are all part of the `aws` relay. Regarding this package, as you can see above, none of the 3 required inputs contain default options.
|
||||
|
||||
For the sake of the exercise, let's say that our company's policy is to mainly deploy on the `us-east-2` region. Having this value set as a default option could be a smart and efficient decision for our dev teams. Let's see how to implement it:
|
||||
Let's implement the first step : use the `aws.#Config` relay and request the user it's first input, the region to deploy in.
|
||||
|
||||
<Tabs
|
||||
defaultValue="av"
|
||||
@ -458,15 +480,15 @@ For the sake of the exercise, let's say that our company's policy is to mainly d
|
||||
}>
|
||||
<TabItem value="bv">
|
||||
|
||||
```cue title=".dagger/env/s3-provisioning/plan/main.cue"
|
||||
package main
|
||||
```cue title="todoapp/cloudformation/source.cue"
|
||||
package cloudformation
|
||||
```
|
||||
|
||||
</TabItem>
|
||||
<TabItem value="av">
|
||||
|
||||
```cue title=".dagger/env/s3-provisioning/plan/main.cue"
|
||||
package main
|
||||
```cue title="todoapp/cloudformation/source.cue"
|
||||
package cloudformation
|
||||
|
||||
import (
|
||||
"dagger.io/aws"
|
||||
@ -474,15 +496,15 @@ import (
|
||||
|
||||
// AWS account: credentials and region
|
||||
awsConfig: aws.#Config & {
|
||||
region: *"us-east-2" | string @dagger(input)
|
||||
region: string @dagger(input)
|
||||
}
|
||||
```
|
||||
|
||||
</TabItem>
|
||||
<TabItem value="dv">
|
||||
|
||||
```cue title=".dagger/env/s3-provisioning/plan/main.cue"
|
||||
package main
|
||||
```cue title="todoapp/cloudformation/source.cue"
|
||||
package cloudformation
|
||||
|
||||
import (
|
||||
"dagger.io/aws" // <-- Import AWS relay to instanciate aws.#Config
|
||||
@ -492,7 +514,7 @@ import (
|
||||
awsConfig: aws.#Config & { // Assign an aws.#Config definition to a field named `awsConfig`
|
||||
// awsConfig will be a directly requestable key : `dagger query awsConfig`
|
||||
// awsConfig sets the region to either an input, or a default string: "us-east-2"
|
||||
region: *"us-east-2" | string @dagger(input)
|
||||
region: string @dagger(input)
|
||||
// As we declare an aws.#Config, Dagger/Cue will automatically know that some others values inside this definition
|
||||
// are inputs, especially secrets (AccessKey, secretKey). Due to the confidential nature of secrets, we won't declare default values to them
|
||||
}
|
||||
@ -501,6 +523,12 @@ awsConfig: aws.#Config & { // Assign an aws.#Config definition to a field named
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
Update the plan
|
||||
|
||||
```shell
|
||||
cp cloudformation/*.cue .dagger/env/cloudformation/plan/
|
||||
```
|
||||
|
||||
Pro tips: In order to check wether it worked or not, these two commands might help
|
||||
|
||||
<Tabs
|
||||
@ -517,7 +545,7 @@ Pro tips: In order to check wether it worked or not, these two commands might he
|
||||
dagger input list # List required input in our personal plan
|
||||
# Output:
|
||||
# Input Value Set by user Description
|
||||
# awsConfig.region *"us-east-2" | string false AWS region
|
||||
# awsConfig.region string false AWS region
|
||||
# awsConfig.accessKey dagger.#Secret false AWS access key
|
||||
# awsConfig.secretKey dagger.#Secret false AWS secret key
|
||||
```
|
||||
@ -568,8 +596,8 @@ Now that we have the `config` definition properly configured, we can now import
|
||||
}>
|
||||
<TabItem value="bv">
|
||||
|
||||
```cue title=".dagger/env/s3-provisioning/plan/main.cue"
|
||||
package main
|
||||
```cue title="todoapp/cloudformation/source.cue"
|
||||
package cloudformation
|
||||
|
||||
import (
|
||||
"dagger.io/aws"
|
||||
@ -577,15 +605,15 @@ import (
|
||||
|
||||
// AWS account: credentials and region
|
||||
awsConfig: aws.#Config & {
|
||||
region: *"us-east-2" | string @dagger(input)
|
||||
region: string @dagger(input)
|
||||
}
|
||||
```
|
||||
|
||||
</TabItem>
|
||||
<TabItem value="av">
|
||||
|
||||
```cue title=".dagger/env/s3-provisioning/plan/main.cue"
|
||||
package main
|
||||
```cue title="todoapp/cloudformation/source.cue"
|
||||
package cloudformation
|
||||
|
||||
import (
|
||||
"dagger.io/aws"
|
||||
@ -595,7 +623,7 @@ import (
|
||||
|
||||
// AWS account: credentials and region
|
||||
awsConfig: aws.#Config & {
|
||||
region: *"us-east-2" | string @dagger(input)
|
||||
region: string @dagger(input)
|
||||
}
|
||||
|
||||
|
||||
@ -623,8 +651,8 @@ cfnStack: cloudformation.#Stack & {
|
||||
</TabItem>
|
||||
<TabItem value="dv">
|
||||
|
||||
```cue title=".dagger/env/s3-provisioning/plan/main.cue"
|
||||
package main
|
||||
```cue title="todoapp/cloudformation/source.cue"
|
||||
package cloudformation
|
||||
|
||||
import (
|
||||
"dagger.io/aws" // <-- Import AWS relay to instanciate aws.#Config
|
||||
@ -636,7 +664,7 @@ import (
|
||||
awsConfig: aws.#Config & { // Assign an aws.#Config definition to a field named `awsConfig`
|
||||
// awsConfig will be a directly requestable key : `dagger query awsConfig`
|
||||
// awsConfig sets the region to either an input, or a default string: "us-east-2"
|
||||
region: *"us-east-2" | string @dagger(input)
|
||||
region: string @dagger(input)
|
||||
// As we declare an aws.#Config, Dagger/Cue will automatically know that some others values inside this definition
|
||||
// are inputs, especially secrets (AccessKey, secretKey). Due to the confidential nature of secrets, we won't declare default values to them
|
||||
}
|
||||
@ -673,8 +701,8 @@ cfnStackName: *"stack-\(suffix.out)" | string @dagger(input) // Has to be uniqu
|
||||
</TabItem>
|
||||
<TabItem value="fv">
|
||||
|
||||
```cue title=".dagger/env/s3-provisioning/plan/main.cue"
|
||||
package main
|
||||
```cue title="todoapp/cloudformation/source.cue"
|
||||
package cloudformation
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
@ -686,7 +714,7 @@ import (
|
||||
|
||||
// AWS account: credentials and region
|
||||
awsConfig: aws.#Config & {
|
||||
region: *"us-east-2" | string @dagger(input)
|
||||
region: string @dagger(input)
|
||||
}
|
||||
|
||||
// Create a random suffix
|
||||
@ -789,7 +817,7 @@ dagger input secret awsConfig.secretKey yourSecretKey
|
||||
|
||||
dagger input list
|
||||
# Input Value Set by user Description
|
||||
# awsConfig.region *"us-east-2" | string false AWS region
|
||||
# awsConfig.region string false AWS region
|
||||
# awsConfig.accessKey dagger.#Secret true AWS access key <-- Specified
|
||||
# awsConfig.secretKey dagger.#Secret true AWS secret key <-- Specified
|
||||
# suffix.length *12 | number false length of the string
|
||||
@ -827,7 +855,7 @@ dagger input secret awsConfig.secretKey yourSecretKey
|
||||
|
||||
dagger input list
|
||||
# Input Value Set by user Description
|
||||
# awsConfig.region *"us-east-2" | string false AWS region
|
||||
# awsConfig.region string false AWS region
|
||||
# awsConfig.accessKey dagger.#Secret true AWS access key <-- Specified
|
||||
# awsConfig.secretKey dagger.#Secret true AWS secret key <-- Specified
|
||||
# suffix.length *12 | number false length of the string
|
||||
|
Reference in New Issue
Block a user