From 6f0a0b4e0ff075284757e5d57eddaa84a36f3d4c Mon Sep 17 00:00:00 2001 From: Guillaume de Rouville Date: Thu, 12 Aug 2021 12:15:16 +0200 Subject: [PATCH 01/24] Doc test suite integration Signed-off-by: Guillaume de Rouville --- website/docusaurus.config.js | 2 ++ website/package.json | 1 + website/yarn.lock | 23 +++++++++++++++++++++++ 3 files changed, 26 insertions(+) diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js index 3e55821a..2253de8e 100644 --- a/website/docusaurus.config.js +++ b/website/docusaurus.config.js @@ -1,4 +1,5 @@ const path = require("path"); +const remarkCodeImport = require('remark-code-import'); /** @type {import('@docusaurus/types').DocusaurusConfig} */ module.exports = { @@ -83,6 +84,7 @@ module.exports = { sidebarPath: require.resolve("./sidebars.js"), editUrl: "https://github.com/dagger/dagger/blob/main", routeBasePath: "/", + remarkPlugins: [remarkCodeImport], }, theme: { customCss: require.resolve("./src/css/custom.scss"), diff --git a/website/package.json b/website/package.json index efe5f8da..21f6c033 100644 --- a/website/package.json +++ b/website/package.json @@ -31,6 +31,7 @@ "react-dom": "^17.0.1", "react-social-login-buttons": "^3.5.1", "sass": "^1.38.1", + "remark-code-import": "^0.3.0", "url-loader": "^4.1.1" }, "browserslist": { diff --git a/website/yarn.lock b/website/yarn.lock index 058a8c7d..88eb6641 100644 --- a/website/yarn.lock +++ b/website/yarn.lock @@ -7901,6 +7901,14 @@ remark-admonitions@^1.2.1: unified "^8.4.2" unist-util-visit "^2.0.1" +remark-code-import@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/remark-code-import/-/remark-code-import-0.3.0.tgz#adc5b407e98ba50ad633b696a7843268cb227430" + integrity sha512-OAidTyShEroWMVP/WDEeth+DtbpnfCiOA03sDK86/EH+tukTxZaKakzSM5YlU9pb38v9NAX6FztZTazXunSKjQ== + dependencies: + to-gatsby-remark-plugin "^0.1.0" + unist-util-visit "^2.0.1" + remark-emoji@^2.1.0: version "2.2.0" resolved "https://registry.yarnpkg.com/remark-emoji/-/remark-emoji-2.2.0.tgz#1c702090a1525da5b80e15a8f963ef2c8236cac7" @@ -8979,6 +8987,13 @@ to-fast-properties@^2.0.0: resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= +to-gatsby-remark-plugin@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/to-gatsby-remark-plugin/-/to-gatsby-remark-plugin-0.1.0.tgz#34167b2c3cf3209745cf97e5a488042586f9990d" + integrity sha512-blmhJ/gIrytWnWLgPSRCkhCPeki6UBK2daa3k9mGahN7GjwHu8KrS7F70MvwlsG7IE794JLgwAdCbi4hU4faFQ== + dependencies: + to-vfile "^6.1.0" + to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" @@ -9016,6 +9031,14 @@ to-regex@^3.0.1, to-regex@^3.0.2: regex-not "^1.0.2" safe-regex "^1.1.0" +to-vfile@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/to-vfile/-/to-vfile-6.1.0.tgz#5f7a3f65813c2c4e34ee1f7643a5646344627699" + integrity sha512-BxX8EkCxOAZe+D/ToHdDsJcVI4HqQfmw0tCkp31zf3dNP/XWIAjU4CmeuSwsSoOzOTqHPOL0KUzyZqJplkD0Qw== + dependencies: + is-buffer "^2.0.0" + vfile "^4.0.0" + toidentifier@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" From ad2f9b3f1790a1c3386a89caf718b836a0bfb33a Mon Sep 17 00:00:00 2001 From: Guillaume de Rouville Date: Thu, 12 Aug 2021 12:47:50 +0200 Subject: [PATCH 02/24] 1003 test implementation Signed-off-by: Guillaume de Rouville --- Makefile | 5 ++ docs/learn/tests/cue.mod/module.cue | 1 + docs/learn/tests/cue.mod/pkg/.gitignore | 2 + docs/learn/tests/doc.bats | 29 ++++++++ docs/learn/tests/helpers.bash | 89 +++++++++++++++++++++++++ docs/learn/tests/package.json | 12 ++++ 6 files changed, 138 insertions(+) create mode 100644 docs/learn/tests/cue.mod/module.cue create mode 100644 docs/learn/tests/cue.mod/pkg/.gitignore create mode 100644 docs/learn/tests/doc.bats create mode 100644 docs/learn/tests/helpers.bash create mode 100644 docs/learn/tests/package.json diff --git a/Makefile b/Makefile index a11c410f..f585dc95 100644 --- a/Makefile +++ b/Makefile @@ -48,6 +48,11 @@ universe-test: dagger-debug yarn --cwd "./universe" install DAGGER_BINARY="../cmd/dagger/dagger-debug" yarn --cwd "./universe" test +.PHONY: doc-test +doc-test: dagger-debug + yarn --cwd "./docs/learn/tests" install + DAGGER_BINARY="$(shell pwd)/cmd/dagger/dagger-debug" yarn --cwd "./docs/learn/tests" test + .PHONY: install install: dagger go install ./cmd/dagger diff --git a/docs/learn/tests/cue.mod/module.cue b/docs/learn/tests/cue.mod/module.cue new file mode 100644 index 00000000..f8af9cef --- /dev/null +++ b/docs/learn/tests/cue.mod/module.cue @@ -0,0 +1 @@ +module: "" diff --git a/docs/learn/tests/cue.mod/pkg/.gitignore b/docs/learn/tests/cue.mod/pkg/.gitignore new file mode 100644 index 00000000..a572e9ee --- /dev/null +++ b/docs/learn/tests/cue.mod/pkg/.gitignore @@ -0,0 +1,2 @@ +# dagger universe +alpha.dagger.io diff --git a/docs/learn/tests/doc.bats b/docs/learn/tests/doc.bats new file mode 100644 index 00000000..1aaf017e --- /dev/null +++ b/docs/learn/tests/doc.bats @@ -0,0 +1,29 @@ +## Doc commands are being extracted from this file and helpers. +## Indentation is important, please append at the end + +setup() { + load 'helpers' + + common_setup +} + +# Test 1003-get-started +@test "doc-1003-get-started" { + setup_example_sandbox "doc" + + # Set examples private key + ./import-tutorial-key.sh + + # Collect url + dagger up + url=$(dagger query -f text url) + + # More commands + dagger list + ls -l ./s3 + dagger input list + + # Check output + run curl $url + assert_output --partial "My Todo app" +} \ No newline at end of file diff --git a/docs/learn/tests/helpers.bash b/docs/learn/tests/helpers.bash new file mode 100644 index 00000000..3729d857 --- /dev/null +++ b/docs/learn/tests/helpers.bash @@ -0,0 +1,89 @@ +## Doc commands are being extracted from this file and helpers. +## Indentation is important, please append at the end + +common_setup() { + load 'node_modules/bats-support/load' + load 'node_modules/bats-assert/load' + + # Dagger Binary + # FIXME: `command -v` must be wrapped in a sub-bash, + # otherwise infinite recursion when DAGGER_BINARY is not set. + export DAGGER="${DAGGER_BINARY:-$(bash -c 'command -v dagger')}" + + # Set the workspace to the universe directory (so tests can run from anywhere) + UNIVERSE="$( cd "$( dirname "$BATS_TEST_FILENAME" )" >/dev/null 2>&1 && pwd )" + DAGGER_WORKSPACE="$UNIVERSE" + export DAGGER_WORKSPACE + + # Force pretty printing for error reporting + DAGGER_LOG_FORMAT="pretty" + export DAGGER_LOG_FORMAT + + # Sandbox workspace. + DAGGER_SANDBOX="$(mktemp -d -t dagger-workspace-XXXXXX)" + export DAGGER_SANDBOX + dagger init -w "$DAGGER_SANDBOX" + + # allows the use of `sops` + SOPS_AGE_KEY_FILE=~/.config/dagger/keys.txt + export SOPS_AGE_KEY_FILE +} + +# dagger helper to execute the right binary +dagger() { + "${DAGGER}" "$@" +} + +# dagger helper to run doc examples in clean environment +setup_example_sandbox() { + # Tell Dagger not to use DAGGER WORKSPACE env var + unset DAGGER_WORKSPACE + + export CODEBLOC_SRC="$(pwd)" + local tmpdir=$(mktemp -d) + cd $tmpdir + git clone https://github.com/dagger/examples + if [ "$1" = "doc" ]; then + cd examples/todoapp + cue mod init + fi +} + +# copy an environment from the current workspace to the sandbox. +# +# this is needed if the test requires altering inputs without dirtying the +# current environment. +# Usage: +# copy_to_sandbox myenv +# dagger input secret -w "$DAGGER_SANDBOX" -e myenv "temporary change" +# dagger up -w "$DAGGER_SANDBOX" -e myenv +# +# To use testdata directory in tests, add the package name as second flag +# Usage: +# copy_to_sandbox myenv mypackage +copy_to_sandbox() { + local name="$1" + local source="$DAGGER_WORKSPACE"/.dagger/env/"$name" + local target="$DAGGER_SANDBOX"/.dagger/env/"$name" + + cp -a "$source" "$target" + + if [ -d "$2" ]; then + local package="$2" + local source_package="$DAGGER_WORKSPACE"/"$package" + local target_package="$DAGGER_SANDBOX"/ + + cp -a "$source_package" "$target_package" + fi +} + +# Check if there is a local kubernetes cluster. +# +# This is need to do kubernetes test in the CI. +skip_unless_local_kube() { + if [ -f ~/.kube/config ] && grep -q "127.0.0.1" ~/.kube/config &> /dev/null; then + echo "Kubernetes available" + else + skip "local kubernetes cluster not available" + fi +} \ No newline at end of file diff --git a/docs/learn/tests/package.json b/docs/learn/tests/package.json new file mode 100644 index 00000000..805413da --- /dev/null +++ b/docs/learn/tests/package.json @@ -0,0 +1,12 @@ +{ + "license": "Apache-2.0", + "scripts": { + "test": "bats --report-formatter junit --jobs 4 ." + }, + "devDependencies": { + "bats": "https://github.com/bats-core/bats-core#master", + "bats-assert": "https://github.com/bats-core/bats-assert", + "bats-support": "https://github.com/bats-core/bats-support" + } +} + From 82d45985a5553b8c7dfb707de08e56916258e356 Mon Sep 17 00:00:00 2001 From: Guillaume de Rouville Date: Fri, 13 Aug 2021 01:47:59 +0200 Subject: [PATCH 03/24] 1004 test implementation Signed-off-by: Guillaume de Rouville --- docs/learn/1004-first-env.md | 36 +++---------------- .../tests/.dagger/env/multibucket/.gitignore | 2 ++ .../tests/.dagger/env/multibucket/values.yaml | 28 +++++++++++++++ docs/learn/tests/doc.bats | 32 +++++++++++++++++ docs/learn/tests/multibucket/netlify.cue | 10 ++++++ docs/learn/tests/multibucket/source.cue | 8 +++++ docs/learn/tests/multibucket/yarn.cue | 10 ++++++ 7 files changed, 94 insertions(+), 32 deletions(-) create mode 100644 docs/learn/tests/.dagger/env/multibucket/.gitignore create mode 100644 docs/learn/tests/.dagger/env/multibucket/values.yaml create mode 100644 docs/learn/tests/multibucket/netlify.cue create mode 100644 docs/learn/tests/multibucket/source.cue create mode 100644 docs/learn/tests/multibucket/yarn.cue diff --git a/docs/learn/1004-first-env.md b/docs/learn/1004-first-env.md index 11b31665..c1307338 100644 --- a/docs/learn/1004-first-env.md +++ b/docs/learn/1004-first-env.md @@ -68,7 +68,7 @@ Although not strictly necessary, for an optimal development experience, we recom If you are new to Cue, we recommend keeping the following resources in browser tabs: -The unofficial but excellent [Cuetorials](https://cuetorials.com/overview/foundations/) in a browser tab, to look up Cue concepts as they appear. +- The unofficial but excellent [Cuetorials](https://cuetorials.com/overview/foundations/) in a browser tab, to look up Cue concepts as they appear. - The official [Cue interactive sandbox](https://cuelang.org/play) for easy experimentation. @@ -130,15 +130,7 @@ In Dagger terms, this component has two essential properties: Let's write the corresponding Cue code to a new file in our package: -```cue title="todoapp/multibucket/source.cue" -package multibucket - -import ( - "alpha.dagger.io/dagger" -) - -// Source code of the sample application -src: dagger.#Artifact & dagger.#Input +```cue file=./tests/multibucket/source.cue title="todoapp/cue.mod/multibucket/source.cue" ``` This code defines a component at the key `src` and specifies that it is both an artifact and an input. @@ -147,17 +139,7 @@ This code defines a component at the key `src` and specifies that it is both an The second component of our plan is the Yarn package built from the app source code: -```cue title="todoapp/multibucket/yarn.cue" -package multibucket - -import ( - "alpha.dagger.io/js/yarn" -) - -// Build the source code using Yarn -app: yarn.#Package & { - source: src -} +```cue file=./tests/multibucket/yarn.cue title="todoapp/cue.mod/multibucket/yarn.cue" ``` Let's break it down: @@ -176,17 +158,7 @@ _FIXME_: this section is not yet available because the [Amazon S3 package](https The third component of our plan is the Netlify site to which the app will be deployed: -```cue title="todoapp/multibucket/netlify.cue" -package multibucket - -import ( - "alpha.dagger.io/netlify" -) - -// Netlify site -site: "netlify": netlify.#Site & { - contents: app.build -} +```cue file=./tests/multibucket/netlify.cue title="todoapp/cue.mod/multibucket/netlify.cue" ``` This component is very similar to the previous one: diff --git a/docs/learn/tests/.dagger/env/multibucket/.gitignore b/docs/learn/tests/.dagger/env/multibucket/.gitignore new file mode 100644 index 00000000..01ec19b0 --- /dev/null +++ b/docs/learn/tests/.dagger/env/multibucket/.gitignore @@ -0,0 +1,2 @@ +# dagger state +state/** diff --git a/docs/learn/tests/.dagger/env/multibucket/values.yaml b/docs/learn/tests/.dagger/env/multibucket/values.yaml new file mode 100644 index 00000000..1fafe75a --- /dev/null +++ b/docs/learn/tests/.dagger/env/multibucket/values.yaml @@ -0,0 +1,28 @@ +plan: + package: ./multibucket +name: multibucket +inputs: + site.netlify.account.token: + secret: ENC[AES256_GCM,data:e5cILcdqbaFdz6ZMM4sNYrChQS+VSMJTZA9cJ0kPvNEDlQj2n7ldlBeO9A==,iv:4SlRRlXyJ8/9ewAPXJ9KdhdVo4FrvVeRwSip2FfMTIM=,tag:JdxkVTR6SOLgzHUWtoSjyw==,type:str] + site.netlify.name: + text: dagger-test-doc-102 +sops: + kms: [] + gcp_kms: [] + azure_kv: [] + hc_vault: [] + age: + - recipient: age1gxwmtwahzwdmrskhf90ppwlnze30lgpm056kuesrxzeuyclrwvpsupwtpk + enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBOVFI4NU40NXF1Um4vR1No + MTByOC9HVWJYUCtzYUc4WGh2UG1EQnJCSm5FCnFrZ1BaMEZJLzBIRUVTUUdhWWRv + N2xRYTR4NlhwclBYME9ZZ3JQejJoUFkKLS0tIDEwa0dXbVhzRWMrMFc3U0FtaEdr + RERQRVp2VjR3K0VwQlZRWEJrQUNpNkUK78CsKmOJp1kKUcytprs0SKLLuo0YDucp + oLuxQQd0X3/8x2c/YfJ3R15e1EQDC73HjSXDbhlgOScR9bxGVqn36A== + -----END AGE ENCRYPTED FILE----- + lastmodified: "2021-08-12T23:19:07Z" + mac: ENC[AES256_GCM,data:9jc3lwlbsJ6CdiSBF4ALNiv/zD7Rv5ZodftuEQpZuJVEpjJCKSq3C7LNyJKxV7fTg/tZ+RDx/q+x0xN9reRRrmvUCsbmLRL2h20rrfsVj3npCSkRiQFcmoHd6ULjf/kbkgUanLt8YmncDzJqNTQfafCxTo1RY3+U2WH/QSIIebQ=,iv:dcXQsq5de6LElOoqvGfs7nmHELkoTs0jddeY3vf4fJg=,tag:j0Eeu5NrNyhBYUzMwarj+w==,type:str] + pgp: [] + encrypted_suffix: secret + version: 3.7.1 diff --git a/docs/learn/tests/doc.bats b/docs/learn/tests/doc.bats index 1aaf017e..ed9821e6 100644 --- a/docs/learn/tests/doc.bats +++ b/docs/learn/tests/doc.bats @@ -26,4 +26,36 @@ setup() { # Check output run curl $url assert_output --partial "My Todo app" +} + +@test "doc-1004-first-env" { + setup_example_sandbox "doc" + + # Follow tutorial + mkdir multibucket + cp $CODEBLOC_SRC/multibucket/source.cue multibucket + cp $CODEBLOC_SRC/multibucket/yarn.cue multibucket + cp $CODEBLOC_SRC/multibucket/netlify.cue multibucket + + dagger doc alpha.dagger.io/netlify + dagger doc alpha.dagger.io/js/yarn + + # Initialize new env + dagger new 'multibucket' -p ./multibucket + + # Check inputs + dagger input list -e multibucket + + # Copy corresponding env + cp -r $CODEBLOC_SRC/.dagger/env/multibucket .dagger/env/ + # Add missing src input + dagger -e multibucket input dir src . + + # Run test + dagger -e multibucket up + url=$(dagger -e multibucket query -f text site.netlify.deployUrl) + + # Check output : + run curl $url + assert_output --partial "./static/css/main.9149988f.chunk.css" } \ No newline at end of file diff --git a/docs/learn/tests/multibucket/netlify.cue b/docs/learn/tests/multibucket/netlify.cue new file mode 100644 index 00000000..f133b0b5 --- /dev/null +++ b/docs/learn/tests/multibucket/netlify.cue @@ -0,0 +1,10 @@ +package multibucket + +import ( + "alpha.dagger.io/netlify" +) + +// Netlify site +site: "netlify": netlify.#Site & { + contents: app.build +} diff --git a/docs/learn/tests/multibucket/source.cue b/docs/learn/tests/multibucket/source.cue new file mode 100644 index 00000000..638c2dcc --- /dev/null +++ b/docs/learn/tests/multibucket/source.cue @@ -0,0 +1,8 @@ +package multibucket + +import ( + "alpha.dagger.io/dagger" +) + +// Source code of the sample application +src: dagger.#Artifact & dagger.#Input diff --git a/docs/learn/tests/multibucket/yarn.cue b/docs/learn/tests/multibucket/yarn.cue new file mode 100644 index 00000000..951ae321 --- /dev/null +++ b/docs/learn/tests/multibucket/yarn.cue @@ -0,0 +1,10 @@ +package multibucket + +import ( + "alpha.dagger.io/js/yarn" +) + +// Build the source code using Yarn +app: yarn.#Package & { + source: src +} From 6744045ce7f5ee23366ba1a1aeebef85aeff3a4e Mon Sep 17 00:00:00 2001 From: Guillaume de Rouville Date: Fri, 13 Aug 2021 03:01:13 +0200 Subject: [PATCH 04/24] 1006 test implementation Signed-off-by: Guillaume de Rouville --- docs/learn/1006-google-cloud-run.md | 41 +------------------ .../tests/.dagger/env/gcpcloudrun/.gitignore | 2 + .../tests/.dagger/env/gcpcloudrun/values.yaml | 34 +++++++++++++++ docs/learn/tests/doc.bats | 19 +++++++++ docs/learn/tests/gcpcloudrun/source.cue | 39 ++++++++++++++++++ 5 files changed, 95 insertions(+), 40 deletions(-) create mode 100644 docs/learn/tests/.dagger/env/gcpcloudrun/.gitignore create mode 100644 docs/learn/tests/.dagger/env/gcpcloudrun/values.yaml create mode 100644 docs/learn/tests/gcpcloudrun/source.cue diff --git a/docs/learn/1006-google-cloud-run.md b/docs/learn/1006-google-cloud-run.md index 071e101e..84c2d997 100644 --- a/docs/learn/1006-google-cloud-run.md +++ b/docs/learn/1006-google-cloud-run.md @@ -43,46 +43,7 @@ mkdir gcpcloudrun ### Create a basic plan -```cue title="todoapp/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 -} +```cue file=./tests/gcpcloudrun/source.cue title="todoapp/cue.mod/gcpcloudrun/source.cue" ``` ## Set up the environment diff --git a/docs/learn/tests/.dagger/env/gcpcloudrun/.gitignore b/docs/learn/tests/.dagger/env/gcpcloudrun/.gitignore new file mode 100644 index 00000000..01ec19b0 --- /dev/null +++ b/docs/learn/tests/.dagger/env/gcpcloudrun/.gitignore @@ -0,0 +1,2 @@ +# dagger state +state/** diff --git a/docs/learn/tests/.dagger/env/gcpcloudrun/values.yaml b/docs/learn/tests/.dagger/env/gcpcloudrun/values.yaml new file mode 100644 index 00000000..7f8c0777 --- /dev/null +++ b/docs/learn/tests/.dagger/env/gcpcloudrun/values.yaml @@ -0,0 +1,34 @@ +plan: + package: ./gcpcloudrun +name: gcpcloudrun +inputs: + deploy.name: + text: test-cloudrun-doc + gcpConfig.project: + text: dagger-ci + gcpConfig.region: + text: us-west2 + gcpConfig.serviceKey: + secret: ENC[AES256_GCM,data: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,iv:S4nRrhMHlBEq58i0WJS7CzFQELlCExSgA0NxTAP6ckw=,tag:Jt6C/CSNFcZAb1oqQP7h0A==,type:str] + imageRef: + text: gcr.io/dagger-ci/test-cloudrun-doc +sops: + kms: [] + gcp_kms: [] + azure_kv: [] + hc_vault: [] + age: + - recipient: age1gxwmtwahzwdmrskhf90ppwlnze30lgpm056kuesrxzeuyclrwvpsupwtpk + enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBaTkF6bUFZVXZmQ1ZlV1cx + dDVEUnZiRVBOanlNb1lHVU9BdDVjV01QeDNvCjZmV1ZKckE2eVpYS0JHU0l4V0VW + NDdpVHloQjRWM01Kak81Z1dKZnB2UnMKLS0tIE1rZmo5YkFCUjZ5VVJXcmt0YlU1 + bnhOalppZXdFbFArTndlWnU1TUZDOFkKY4irnpH33+GagucvGkVcEw1KKCJivlCW + rpLd+7EE5bXheiHFphtXTtkUIDCkbC4nTAJ1/37iEKrWsRRFv/CL/g== + -----END AGE ENCRYPTED FILE----- + lastmodified: "2021-08-13T00:57:43Z" + mac: ENC[AES256_GCM,data:2Pk+6XFyPayexXsUFbDIXG/m6O7WkttraML4D0Y74XKsIjoq8gqNSAJrRmF+brw58j4F2h28PScp8t068byA97QIaWG8Q201vCJ6bpgMcZ4OEXRTLMuoZtpDLa9AoOT/rBaSIu7G5uA4oivVkfed90Nuq5+TGBSp/+me81679us=,iv:gUMpTjR0TwFonLed1fdegaRXtM4NghdZxVjGPJRdLSM=,tag:5SW7uAabLrrNx4h2Tf+9Ww==,type:str] + pgp: [] + encrypted_suffix: secret + version: 3.7.1 diff --git a/docs/learn/tests/doc.bats b/docs/learn/tests/doc.bats index ed9821e6..498b5b4a 100644 --- a/docs/learn/tests/doc.bats +++ b/docs/learn/tests/doc.bats @@ -58,4 +58,23 @@ setup() { # Check output : run curl $url assert_output --partial "./static/css/main.9149988f.chunk.css" +} + +@test "doc-1006-google-cloud-run" { + setup_example_sandbox "doc" + + mkdir gcpcloudrun + cp $CODEBLOC_SRC/gcpcloudrun/source.cue gcpcloudrun + + # Initialize new env + dagger new 'gcpcloudrun' -p gcpcloudrun + + # Copy corresponding env + cp -r $CODEBLOC_SRC/.dagger/env/gcpcloudrun .dagger/env/ + # Add missing src input + dagger -e gcpcloudrun input dir src . + + # Run test + run dagger -e gcpcloudrun up + assert_success } \ No newline at end of file diff --git a/docs/learn/tests/gcpcloudrun/source.cue b/docs/learn/tests/gcpcloudrun/source.cue new file mode 100644 index 00000000..f0ee785d --- /dev/null +++ b/docs/learn/tests/gcpcloudrun/source.cue @@ -0,0 +1,39 @@ +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 +} From dc865bf2be788406bef2773e753a2f75069bfd86 Mon Sep 17 00:00:00 2001 From: Guillaume de Rouville Date: Fri, 13 Aug 2021 04:18:56 +0200 Subject: [PATCH 05/24] 1008 test implementation Signed-off-by: Guillaume de Rouville --- docs/learn/1008-aws-cloudformation.md | 299 +----------------- .../.dagger/env/cloudformation/.gitignore | 2 + .../.dagger/env/cloudformation/values.yaml | 32 ++ docs/learn/tests/cloudformation/deletion.cue | 24 ++ .../tests/cloudformation/source-begin.cue | 8 + .../learn/tests/cloudformation/source-end.cue | 26 ++ docs/learn/tests/cloudformation/template.cue | 61 ++++ .../tests/cloudformation/template/convert.cue | 5 + .../cloudformation/template/deployment.cue | 75 +++++ .../template/template-begin.cue | 60 ++++ .../cloudformation/template/template-end.cue | 10 + docs/learn/tests/doc.bats | 67 ++++ 12 files changed, 379 insertions(+), 290 deletions(-) create mode 100644 docs/learn/tests/.dagger/env/cloudformation/.gitignore create mode 100644 docs/learn/tests/.dagger/env/cloudformation/values.yaml create mode 100644 docs/learn/tests/cloudformation/deletion.cue create mode 100644 docs/learn/tests/cloudformation/source-begin.cue create mode 100644 docs/learn/tests/cloudformation/source-end.cue create mode 100644 docs/learn/tests/cloudformation/template.cue create mode 100644 docs/learn/tests/cloudformation/template/convert.cue create mode 100644 docs/learn/tests/cloudformation/template/deployment.cue create mode 100644 docs/learn/tests/cloudformation/template/template-begin.cue create mode 100644 docs/learn/tests/cloudformation/template/template-end.cue diff --git a/docs/learn/1008-aws-cloudformation.md b/docs/learn/1008-aws-cloudformation.md index 63ef450e..7884bcb4 100644 --- a/docs/learn/1008-aws-cloudformation.md +++ b/docs/learn/1008-aws-cloudformation.md @@ -66,68 +66,7 @@ The idea here is to follow best practices in [S3 buckets](https://docs.aws.amazo Create a file named `template.cue` and add the following configuration to it. -```cue title="todoapp/cloudformation/template.cue" -package cloudformation - -// inlined s3 cloudformation template as a string -template: """ - { - "AWSTemplateFormatVersion": "2010-09-09", - "Resources": { - "S3Bucket": { - "Type": "AWS::S3::Bucket", - "Properties": { - "AccessControl": "PublicRead", - "WebsiteConfiguration": { - "IndexDocument": "index.html", - "ErrorDocument": "error.html" - } - }, - "DeletionPolicy": "Retain" - }, - "BucketPolicy": { - "Type": "AWS::S3::BucketPolicy", - "Properties": { - "PolicyDocument": { - "Id": "MyPolicy", - "Version": "2012-10-17", - "Statement": [ - { - "Sid": "PublicReadForGetBucketObjects", - "Effect": "Allow", - "Principal": "*", - "Action": "s3:GetObject", - "Resource": { - "Fn::Join": [ - "", - [ - "arn:aws:s3:::", - { - "Ref": "S3Bucket" - }, - "/*" - ] - ] - } - } - ] - }, - "Bucket": { - "Ref": "S3Bucket" - } - } - } - }, - "Outputs": { - "Name": { - "Value": { - "Fn::GetAtt": ["S3Bucket", "Arn"] - }, - "Description": "Name S3 Bucket" - } - } - } -""" +```cue file=./tests/cloudformation/template.cue title="todoapp/cloudformation/template.cue" ``` ##### 2. Cloudformation relay @@ -164,15 +103,7 @@ The config values are all part of the `aws` relay. Regarding this package, as yo Let's implement the first step, use the `aws.#Config` relay, and request its first inputs: the region to deploy and the AWS credentials. -```cue title="todoapp/cloudformation/source.cue" -package cloudformation - -import ( - "alpha.dagger.io/aws" -) - -// AWS account: credentials and region -awsConfig: aws.#Config +```cue file=./tests/cloudformation/source-begin.cue title="todoapp/cloudformation/source.cue" ``` This defines: @@ -214,33 +145,7 @@ dagger up -e cloudformation # Try to run the plan. As expected, we encounter a f Now that we have the `config` definition properly configured, let's modify the Cloudformation one: -```cue title="todoapp/cloudformation/source.cue" -package cloudformation - -import ( - "alpha.dagger.io/aws" - "alpha.dagger.io/dagger" - "alpha.dagger.io/random" - "alpha.dagger.io/aws/cloudformation" -) - -// AWS account: credentials and region -awsConfig: aws.#Config - -// Create a random suffix -suffix: random.#String & { - seed: "" -} - -// Query the Cloudformation stackname, or create one with a random suffix to keep unicity -cfnStackName: *"stack-\(suffix.out)" | string & dagger.#Input - -// AWS Cloudformation stdlib -cfnStack: cloudformation.#Stack & { - config: awsConfig - stackName: cfnStackName - source: template -} +```cue file=./tests/cloudformation/source-end.cue title="todoapp/cloudformation/source.cue" ``` This defines: @@ -359,35 +264,9 @@ We will create a new `convert.cue` file to process the conversion import Tabs from "@theme/Tabs"; import TabItem from "@theme/TabItem"; - - - -```cue title="todoapp/cloudformation/convert.cue" -package cloudformation -import "encoding/json" - -s3Template: json.Unmarshal(template) +```cue file=./tests/cloudformation/template/convert.cue title="todoapp/cloudformation/convert.cue" ``` - - - -```cue title="todoapp/cloudformation/convert.cue" -package cloudformation -import "encoding/yaml" - -s3Template: yaml.Unmarshal(template) -``` - - - - This defines: - `s3Template`: contains the unmarshalled template. @@ -428,74 +307,7 @@ rm cloudformation/convert.cue Open `cloudformation/template.cue` and append below elements with copied Cue definition of the JSON: -```cue title="todoapp/cloudformation/template.cue" -// Add this line, to make it part to the cloudformation template -package cloudformation -import "encoding/json" - -// Wrap exported Cue in previous point inside the `s3` value -s3: { - "AWSTemplateFormatVersion": "2010-09-09", - "Outputs": { - "Name": { - "Description": "Name S3 Bucket", - "Value": { - "Fn::GetAtt": [ - "S3Bucket", - "Arn" - ] - } - } - }, - "Resources": { - "BucketPolicy": { - "Properties": { - "Bucket": { - "Ref": "S3Bucket" - }, - "PolicyDocument": { - "Id": "MyPolicy", - "Statement": [ - { - "Action": "s3:GetObject", - "Effect": "Allow", - "Principal": "*", - "Resource": { - "Fn::Join": [ - "", - [ - "arn:aws:s3:::", - { - "Ref": "S3Bucket" - }, - "/*" - ] - ] - }, - "Sid": "PublicReadForGetBucketObjects" - } - ], - "Version": "2012-10-17" - } - }, - "Type": "AWS::S3::BucketPolicy" - }, - "S3Bucket": { - "DeletionPolicy": "Retain", - "Properties": { - "AccessControl": "PublicRead", - "WebsiteConfiguration": { - "ErrorDocument": "error.html", - "IndexDocument": "index.html" - } - }, - "Type": "AWS::S3::Bucket" - } - } -} - -// Template contains the marshalled value of the s3 template -template: json.Marshal(s3) +```cue file=./tests/cloudformation/template/template-begin.cue title="todoapp/cloudformation/template.cue" ``` We're using the built-in `json.Marshal` function to convert CUE back to JSON, so Cloudformation still receives the same template. @@ -510,104 +322,12 @@ Now that the template is defined in CUE, we can use the language to add more fle Let's define a re-usable `#Deployment` definition in `todoapp/cloudformation/deployment.cue`: -```cue title="todoapp/cloudformation/deployment.cue" -package cloudformation - -#Deployment: { - - // Bucket's output description - description: string - - // index file - indexDocument: *"index.html" | string - - // error file - errorDocument: *"error.html" | string - - // Bucket policy version - version: *"2012-10-17" | string - - // Retain as default deletion policy. Delete is also accepted but requires the s3 bucket to be empty - deletionPolicy: *"Retain" | "Delete" - - // Canned access control list (ACL) that grants predefined permissions to the bucket - accessControl: *"PublicRead" | "Private" | "PublicReadWrite" | "AuthenticatedRead" | "LogDeliveryWrite" | "BucketOwnerRead" | "BucketOwnerFullControl" | "AwsExecRead" - - // Modified copy of s3 value in `todoapp/cloudformation/template.cue` - template: { - "AWSTemplateFormatVersion": "2010-09-09", - "Outputs": { - "Name": { - "Description": description, - "Value": { - "Fn::GetAtt": [ - "S3Bucket", - "Arn" - ] - } - } - }, - "Resources": { - "BucketPolicy": { - "Properties": { - "Bucket": { - "Ref": "S3Bucket" - }, - "PolicyDocument": { - "Id": "MyPolicy", - "Statement": [ - { - "Action": "s3:GetObject", - "Effect": "Allow", - "Principal": "*", - "Resource": { - "Fn::Join": [ - "", - [ - "arn:aws:s3:::", - { - "Ref": "S3Bucket" - }, - "/*" - ] - ] - }, - "Sid": "PublicReadForGetBucketObjects" - } - ], - "Version": version - } - }, - "Type": "AWS::S3::BucketPolicy" - }, - "S3Bucket": { - "DeletionPolicy": deletionPolicy, - "Properties": { - "AccessControl": "PublicRead", - "WebsiteConfiguration": { - "ErrorDocument": errorDocument, - "IndexDocument": indexDocument - } - }, - "Type": "AWS::S3::Bucket" - } - } - } -} +```cue file=./tests/cloudformation/template/deployment.cue title="todoapp/cloudformation/deployment.cue" ``` `template.cue` can be rewritten as follows: -```cue title="todoapp/cloudformation/template.cue" -package cloudformation -import "encoding/json" - -s3: #Deployment & { - description: "Name S3 Bucket" -} - -// Template contains the marshalled value of the s3 template -template: json.Marshal(s3.template) +```cue file=./tests/cloudformation/template/template-end.cue title="todoapp/cloudformation/template.cue" ``` Verify template @@ -637,10 +357,9 @@ dagger query template -f text -e cloudformation # "Value": { ``` -You need to move back the `source.cue` for Dagger to instanciate a bucket: +Reimplement `source.cue`: -```shell -mv ~/tmp/source.cue cloudformation/source.cue +```cue file=./tests/cloudformation/source-end.cue title="todoapp/cloudformation/source.cue" ``` And we can now deploy it: diff --git a/docs/learn/tests/.dagger/env/cloudformation/.gitignore b/docs/learn/tests/.dagger/env/cloudformation/.gitignore new file mode 100644 index 00000000..01ec19b0 --- /dev/null +++ b/docs/learn/tests/.dagger/env/cloudformation/.gitignore @@ -0,0 +1,2 @@ +# dagger state +state/** diff --git a/docs/learn/tests/.dagger/env/cloudformation/values.yaml b/docs/learn/tests/.dagger/env/cloudformation/values.yaml new file mode 100644 index 00000000..985f9aa9 --- /dev/null +++ b/docs/learn/tests/.dagger/env/cloudformation/values.yaml @@ -0,0 +1,32 @@ +plan: + package: ./cloudformation +name: cloudformation +inputs: + awsConfig.accessKey: + secret: ENC[AES256_GCM,data:MJSSjaXpMawrpM5trPQzZR2Cg/M=,iv:D8Ff3Uy8hpzFPKg+okFkVM5DRam9Dyk31GjIizklvP0=,tag:J/7/+xjHdy94mYTQmB0sUw==,type:str] + awsConfig.region: + text: us-east-2 + awsConfig.secretKey: + secret: ENC[AES256_GCM,data:BnBc29SIbLj3DDWwpem7mcLQSPoP6a/opqIYxLZyQPdSJojL/Jy9jA==,iv:nK3mj7jOgJdAwcO2i5OYj1FxHsYnoodyXMih9eqLnOQ=,tag:1zaXCkwL8d8ilyxCGzPN6Q==,type:str] + cfnStack.onFailure: + text: DELETE +sops: + kms: [] + gcp_kms: [] + azure_kv: [] + hc_vault: [] + age: + - recipient: age1gxwmtwahzwdmrskhf90ppwlnze30lgpm056kuesrxzeuyclrwvpsupwtpk + enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB0TW4xNVMzQkZueGY1NC91 + WUplK09CRXpPSGMyTGhZYjZubDI1Sk96YVRFClJhVlNGT2VMMEtjeTcxbThaMHNq + MTgwdlFObTc3VVYxU3FFZ1lpMDAxVWcKLS0tIFJMQ2F6bWo4OEY2VnZoajJMMDVq + Lzd0bU1qMXF0dzIzTG05cmlzZURxUncKp2wNXD/HKXgGv16pM/yvaYfWL5lsQyWo + CDsT4rHHMZ21XtS9W+7oL9IqMMmDUQf6RZgDgoqLVmTjdBeA8yB2yg== + -----END AGE ENCRYPTED FILE----- + lastmodified: "2021-08-13T02:12:09Z" + mac: ENC[AES256_GCM,data:tZ35vWWlepyQOuKtzO1pau51YQZZ+Lg2LKK9PlSJvJZYzp+QaUVMCsoTAkZXgMH12C9ced6Jo1pfV9kQjxG1/g+5JmjgClFCWCMTIRa8Z9iI3hGu35SjxG4KVRlmeZsjstEW+78JBOekBUWYzkX0vAlKq44qLLug3FDc+sxFetQ=,iv:yB85C7b5X4y/koB3zN3ktUoYrYdB7N07FvJigwjxao0=,tag:3PSTd39bLyPRa4uZzHycjg==,type:str] + pgp: [] + encrypted_suffix: secret + version: 3.7.1 diff --git a/docs/learn/tests/cloudformation/deletion.cue b/docs/learn/tests/cloudformation/deletion.cue new file mode 100644 index 00000000..ed57a23a --- /dev/null +++ b/docs/learn/tests/cloudformation/deletion.cue @@ -0,0 +1,24 @@ +package main + +import ( + "alpha.dagger.io/os" + "alpha.dagger.io/aws" + "alpha.dagger.io/dagger" +) + +// Remove Cloudformation Stack +stackRemoval: { + // Cloudformation Stackname + stackName: string & dagger.#Input + + ctr: os.#Container & { + image: aws.#CLI & { + config: awsConfig + } + always: true + env: STACK_NAME: stackName + command: """ + aws cloudformation delete-stack --stack-name $STACK_NAME + """ + } +} diff --git a/docs/learn/tests/cloudformation/source-begin.cue b/docs/learn/tests/cloudformation/source-begin.cue new file mode 100644 index 00000000..7cede99c --- /dev/null +++ b/docs/learn/tests/cloudformation/source-begin.cue @@ -0,0 +1,8 @@ +package main + +import ( + "alpha.dagger.io/aws" +) + +// AWS account: credentials and region +awsConfig: aws.#Config diff --git a/docs/learn/tests/cloudformation/source-end.cue b/docs/learn/tests/cloudformation/source-end.cue new file mode 100644 index 00000000..769331d5 --- /dev/null +++ b/docs/learn/tests/cloudformation/source-end.cue @@ -0,0 +1,26 @@ +package main + +import ( + "alpha.dagger.io/aws" + "alpha.dagger.io/dagger" + "alpha.dagger.io/random" + "alpha.dagger.io/aws/cloudformation" +) + +// AWS account: credentials and region +awsConfig: aws.#Config + +// Create a random suffix +suffix: random.#String & { + seed: "" +} + +// Query the Cloudformation stackname, or create one with a random suffix to keep unicity +cfnStackName: *"stack-\(suffix.out)" | string & dagger.#Input + +// AWS Cloudformation stdlib +cfnStack: cloudformation.#Stack & { + config: awsConfig + stackName: cfnStackName + source: template +} diff --git a/docs/learn/tests/cloudformation/template.cue b/docs/learn/tests/cloudformation/template.cue new file mode 100644 index 00000000..827ab6c0 --- /dev/null +++ b/docs/learn/tests/cloudformation/template.cue @@ -0,0 +1,61 @@ +package main + +// inlined s3 cloudformation template as a string +template: """ + { + "AWSTemplateFormatVersion": "2010-09-09", + "Resources": { + "S3Bucket": { + "Type": "AWS::S3::Bucket", + "Properties": { + "AccessControl": "PublicRead", + "WebsiteConfiguration": { + "IndexDocument": "index.html", + "ErrorDocument": "error.html" + } + }, + "DeletionPolicy": "Retain" + }, + "BucketPolicy": { + "Type": "AWS::S3::BucketPolicy", + "Properties": { + "PolicyDocument": { + "Id": "MyPolicy", + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "PublicReadForGetBucketObjects", + "Effect": "Allow", + "Principal": "*", + "Action": "s3:GetObject", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:aws:s3:::", + { + "Ref": "S3Bucket" + }, + "/*" + ] + ] + } + } + ] + }, + "Bucket": { + "Ref": "S3Bucket" + } + } + } + }, + "Outputs": { + "Name": { + "Value": { + "Fn::GetAtt": ["S3Bucket", "Arn"] + }, + "Description": "Name S3 Bucket" + } + } + } + """ diff --git a/docs/learn/tests/cloudformation/template/convert.cue b/docs/learn/tests/cloudformation/template/convert.cue new file mode 100644 index 00000000..a08c9210 --- /dev/null +++ b/docs/learn/tests/cloudformation/template/convert.cue @@ -0,0 +1,5 @@ +package main + +import "encoding/json" + +s3Template: json.Unmarshal(template) diff --git a/docs/learn/tests/cloudformation/template/deployment.cue b/docs/learn/tests/cloudformation/template/deployment.cue new file mode 100644 index 00000000..be7ea2c9 --- /dev/null +++ b/docs/learn/tests/cloudformation/template/deployment.cue @@ -0,0 +1,75 @@ +package main + +#Deployment: { + + // Bucket's output description + description: string + + // index file + indexDocument: *"index.html" | string + + // error file + errorDocument: *"error.html" | string + + // Bucket policy version + version: *"2012-10-17" | string + + // Retain as default deletion policy. Delete is also accepted but requires the s3 bucket to be empty + deletionPolicy: *"Retain" | "Delete" + + // Canned access control list (ACL) that grants predefined permissions to the bucket + accessControl: *"PublicRead" | "Private" | "PublicReadWrite" | "AuthenticatedRead" | "LogDeliveryWrite" | "BucketOwnerRead" | "BucketOwnerFullControl" | "AwsExecRead" + + // Modified copy of s3 value in `todoapp/cloudformation/template.cue` + template: { + AWSTemplateFormatVersion: "2010-09-09" + Outputs: Name: { + Description: description + Value: "Fn::GetAtt": [ + "S3Bucket", + "Arn", + ] + } + Resources: { + BucketPolicy: { + Properties: { + Bucket: Ref: "S3Bucket" + PolicyDocument: { + Id: "MyPolicy" + Statement: [ + { + Action: "s3:GetObject" + Effect: "Allow" + Principal: "*" + Resource: "Fn::Join": [ + "", + [ + "arn:aws:s3:::", + { + Ref: "S3Bucket" + }, + "/*", + ], + ] + Sid: "PublicReadForGetBucketObjects" + }, + ] + Version: version + } + } + Type: "AWS::S3::BucketPolicy" + } + S3Bucket: { + DeletionPolicy: deletionPolicy + Properties: { + AccessControl: "PublicRead" + WebsiteConfiguration: { + ErrorDocument: errorDocument + IndexDocument: indexDocument + } + } + Type: "AWS::S3::Bucket" + } + } + } +} diff --git a/docs/learn/tests/cloudformation/template/template-begin.cue b/docs/learn/tests/cloudformation/template/template-begin.cue new file mode 100644 index 00000000..490ac179 --- /dev/null +++ b/docs/learn/tests/cloudformation/template/template-begin.cue @@ -0,0 +1,60 @@ +// Add this line, to make it part to the cloudformation template +package main + +import "encoding/json" + +// Wrap exported Cue in previous point inside the `s3` value +s3: { + AWSTemplateFormatVersion: "2010-09-09" + Outputs: Name: { + Description: "Name S3 Bucket" + Value: "Fn::GetAtt": [ + "S3Bucket", + "Arn", + ] + } + Resources: { + BucketPolicy: { + Properties: { + Bucket: Ref: "S3Bucket" + PolicyDocument: { + Id: "MyPolicy" + Statement: [ + { + Action: "s3:GetObject" + Effect: "Allow" + Principal: "*" + Resource: "Fn::Join": [ + "", + [ + "arn:aws:s3:::", + { + Ref: "S3Bucket" + }, + "/*", + ], + ] + Sid: "PublicReadForGetBucketObjects" + }, + ] + Version: "2012-10-17" + } + } + Type: "AWS::S3::BucketPolicy" + } + S3Bucket: { + DeletionPolicy: "Retain" + Properties: { + AccessControl: "PublicRead" + WebsiteConfiguration: { + ErrorDocument: "error.html" + IndexDocument: "index.html" + } + } + Type: "AWS::S3::Bucket" + } + } +} + +// Template contains the marshalled value of the s3 template +template: json.Marshal(s3) diff --git a/docs/learn/tests/cloudformation/template/template-end.cue b/docs/learn/tests/cloudformation/template/template-end.cue new file mode 100644 index 00000000..c59fa5a4 --- /dev/null +++ b/docs/learn/tests/cloudformation/template/template-end.cue @@ -0,0 +1,10 @@ +package main + +import "encoding/json" + +s3: #Deployment & { + description: "Name S3 Bucket" +} + +// Template contains the marshalled value of the s3 template +template: json.Marshal(s3.template) diff --git a/docs/learn/tests/doc.bats b/docs/learn/tests/doc.bats index 498b5b4a..cf139ea1 100644 --- a/docs/learn/tests/doc.bats +++ b/docs/learn/tests/doc.bats @@ -77,4 +77,71 @@ setup() { # Run test run dagger -e gcpcloudrun up assert_success +} + +@test "doc-1008-aws-cloudformation" { + setup_example_sandbox "doc" + + ### Create a basic plan + ## Construct + mkdir cloudformation + cp $CODEBLOC_SRC/cloudformation/template.cue cloudformation + + # Cloudformation relay + dagger doc alpha.dagger.io/aws/cloudformation + cp $CODEBLOC_SRC/cloudformation/source-begin.cue cloudformation/source.cue + + # Initialize new env + dagger new 'cloudformation' -p cloudformation + + # Finish template setup + cp $CODEBLOC_SRC/cloudformation/source-end.cue cloudformation/source.cue + # Copy corresponding env + cp -r $CODEBLOC_SRC/.dagger/env/cloudformation .dagger/env/ + + # Run test + dagger -e cloudformation up + stackName=$(dagger -e cloudformation query cfnStackName -f text) + + ## Cleanup + # Place back empty source + cp $CODEBLOC_SRC/cloudformation/source-begin.cue cloudformation/source.cue + cp $CODEBLOC_SRC/cloudformation/deletion.cue cloudformation/deletion.cue + # Prepare and run cloudformation cleanup + dagger -e cloudformation input text stackRemoval.stackName $stackName + dagger -e cloudformation up + + ### Template part + ## Create convert.cue + cp $CODEBLOC_SRC/cloudformation/template/convert.cue cloudformation/convert.cue + rm cloudformation/source.cue cloudformation/deletion.cue + + ## Retrieve Unmarshalled JSON + dagger query -e cloudformation s3Template + + ## Remove convert.cue + rm cloudformation/convert.cue + ## Store the output + cp $CODEBLOC_SRC/cloudformation/template/template-begin.cue cloudformation/template.cue + # Inspect conf + dagger query -e cloudformation template -f text + + cp $CODEBLOC_SRC/cloudformation/template/deployment.cue cloudformation/deployment.cue + cp $CODEBLOC_SRC/cloudformation/template/template-end.cue cloudformation/template.cue + cp $CODEBLOC_SRC/cloudformation/source-end.cue cloudformation/source.cue + + # Deploy again + dagger -e cloudformation query template -f text + dagger -e cloudformation up + dagger -e cloudformation output list + + ## Cleanup again + stackName=$(dagger -e cloudformation query cfnStackName -f text) + rm -rf cloudformation/* + # Place back empty source + cp $CODEBLOC_SRC/cloudformation/source-begin.cue cloudformation/source.cue + cp $CODEBLOC_SRC/cloudformation/deletion.cue cloudformation/deletion.cue + # Prepare and run cloudformation cleanup + dagger -e cloudformation input text stackRemoval.stackName $stackName + dagger -e cloudformation up } \ No newline at end of file From 8e9a56a0242d386821d6ec5bec2da06b04c2b4e4 Mon Sep 17 00:00:00 2001 From: Guillaume de Rouville Date: Fri, 13 Aug 2021 04:32:43 +0200 Subject: [PATCH 06/24] Add doc-test to CI - Add Cue dependency to integration CI test Signed-off-by: Guillaume de Rouville --- .github/workflows/ci.yml | 12 ++++++++++-- Makefile | 2 +- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5305c6b1..2e249dc4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,9 +2,9 @@ name: CI on: push: - branches: [main] + branches: [ main ] pull_request: - branches: [main] + branches: [ main ] jobs: lint: @@ -76,6 +76,14 @@ jobs: with: go-version: 1.16 + - name: Install Dependencies + run: | + # Cue + export CUE_VERSION="$(grep cue ./go.mod | cut -d' ' -f2)" + export CUE_TARBALL="cue_${CUE_VERSION}_linux_amd64.tar.gz" + echo "Installing cue version $CUE_VERSION" + curl -L https://github.com/cuelang/cue/releases/download/${CUE_VERSION}/${CUE_TARBALL} | sudo tar zxf - -C /usr/local/bin + - name: Install Dependencies run: | # SOPS diff --git a/Makefile b/Makefile index f585dc95..5b6de955 100644 --- a/Makefile +++ b/Makefile @@ -36,7 +36,7 @@ shellcheck: lint: shellcheck cuelint golint docslint .PHONY: integration -integration: core-integration universe-test +integration: core-integration universe-test doc-test .PHONY: core-integration core-integration: dagger-debug From 2bcd7a7dbfcadaa0b93c510577f118f3dc995279 Mon Sep 17 00:00:00 2001 From: Guillaume de Rouville Date: Fri, 13 Aug 2021 12:37:56 +0200 Subject: [PATCH 07/24] bats - fix 1004 wrong cmd + move helper.bats cmd to make it more generic Signed-off-by: Guillaume de Rouville --- docs/learn/tests/doc.bats | 3 --- docs/learn/tests/helpers.bash | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/docs/learn/tests/doc.bats b/docs/learn/tests/doc.bats index cf139ea1..e638cfee 100644 --- a/docs/learn/tests/doc.bats +++ b/docs/learn/tests/doc.bats @@ -43,9 +43,6 @@ setup() { # Initialize new env dagger new 'multibucket' -p ./multibucket - # Check inputs - dagger input list -e multibucket - # Copy corresponding env cp -r $CODEBLOC_SRC/.dagger/env/multibucket .dagger/env/ # Add missing src input diff --git a/docs/learn/tests/helpers.bash b/docs/learn/tests/helpers.bash index 3729d857..6c5b30d8 100644 --- a/docs/learn/tests/helpers.bash +++ b/docs/learn/tests/helpers.bash @@ -42,8 +42,8 @@ setup_example_sandbox() { export CODEBLOC_SRC="$(pwd)" local tmpdir=$(mktemp -d) cd $tmpdir - git clone https://github.com/dagger/examples if [ "$1" = "doc" ]; then + git clone https://github.com/dagger/examples cd examples/todoapp cue mod init fi From 00f7e63c4aaa48a3837be5122837d2cd6fa2c308 Mon Sep 17 00:00:00 2001 From: Guillaume de Rouville Date: Fri, 13 Aug 2021 12:43:13 +0200 Subject: [PATCH 08/24] 1010 test implementation Signed-off-by: Guillaume de Rouville --- docs/learn/1010-dev-cue-package.md | 78 +++------------------ docs/learn/tests/dev-cue-package/script.sh | 15 ++++ docs/learn/tests/dev-cue-package/source.cue | 41 +++++++++++ docs/learn/tests/doc.bats | 21 +++++- 4 files changed, 87 insertions(+), 68 deletions(-) create mode 100644 docs/learn/tests/dev-cue-package/script.sh create mode 100644 docs/learn/tests/dev-cue-package/source.cue diff --git a/docs/learn/1010-dev-cue-package.md b/docs/learn/1010-dev-cue-package.md index 86729bf9..17d8dee5 100644 --- a/docs/learn/1010-dev-cue-package.md +++ b/docs/learn/1010-dev-cue-package.md @@ -4,10 +4,9 @@ slug: /1010/dev-cue-package/ # Develop a new CUE package for Dagger -This tutorial illustrates how to create new packages, manually distribute them among your applications and contribute to -the Dagger stdlib packages. +This tutorial illustrates how to create new packages, manually distribute them among your applications and contribute to the Dagger stdlib packages. -## Creating your own package +## Creating your package ### Initializing workspace @@ -24,7 +23,7 @@ As described in the previous tutorials, initialize your Dagger workspace: dagger init ``` -That will create 2 directories: `.dagger` and `cue.mod` where our package will reside: +That will create two directories: `.dagger` and `cue.mod`, where our package will reside: ```shell . @@ -38,8 +37,8 @@ That will create 2 directories: `.dagger` and `cue.mod` where our package will r ### Writing the package -Now that you've initialized your workspace it's time to write a simple package. Package name usually starts with a -domain name (as in Go) followed with a descriptive name. In this example we reuse the Cloud Run example and create a +Now that you've initialized your workspace, it's time to write a simple package. Package name usually starts with a +domain name (as in Go) followed by a descriptive name. In this example, we reuse the Cloud Run example and create a package from it. ```shell @@ -52,69 +51,15 @@ Let's write the package logic. It is basically what we've seen in the 106-cloudr touch cue.mod/pkg/github.com/tjovicic/gcpcloudrun/source.cue ``` -```cue title="cue.mod/pkg/github.com/tjovicic/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" -) - -#Run: { - // 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 - } -} +```cue file=./tests/dev-cue-package/source.cue title="cue.mod/pkg/github.com/tjovicic/gcpcloudrun/source.cue" ``` ### Running the package -Now that you've successfully created a package, let's run it in a new environment. Create a new test package using +Now that you've successfully created a package let's run it in a new environment. Create a new test package using our reusable `gcpcloudrun`: -```shell -mkdir test - -cat > test/source.cue << EOF -package test - -import ( - "github.com/tjovicic/gcpcloudrun" -) - -run: gcpcloudrun.#Run -EOF - -dagger new staging -p ./test +```cue file=./tests/dev-cue-package/script.sh#L3-L16 ``` Run it: @@ -138,7 +83,7 @@ You should see a familiar output: ## Manually distributing packages You've probably guessed this package isn't tied to just your workspace. You can easily copy/paste it into any number -of different workspaces and use it as we've showed above. +of different workspaces and use it as we've shown above. ```shell mkdir -p /my-new-workspace/cue.mod/pkg/github.com/tjovicic/gcpcloudrun @@ -147,7 +92,7 @@ cp ./cue.mod/pkg/github.com/tjovicic/gcpcloudrun/source.cue /new-workspace/cue.m ## Contributing to Dagger stdlib -Our [stdlib](https://github.com/dagger/dagger/tree/main/stdlib) has many useful packages that you can use. +Our [stdlib](https://github.com/dagger/dagger/tree/main/stdlib) has many valuable packages that you can use. You've probably seen it when you've initialized your workspace: ```shell @@ -160,6 +105,5 @@ You've probably seen it when you've initialized your workspace: │ └── usr ``` -We are still a small community and are constantly looking for new contributors that will work with us improve this -amazing project. If you feel like we are missing a package or want to improve an existing one, please start with our +We are still a small community and are constantly looking for new contributors that will work with us to improve this fantastic project. If you feel like we are missing a package or want to improve an existing one, please start with our [contributing docs](https://github.com/dagger/dagger/blob/main/CONTRIBUTING.md) and open a PR. diff --git a/docs/learn/tests/dev-cue-package/script.sh b/docs/learn/tests/dev-cue-package/script.sh new file mode 100644 index 00000000..3862188c --- /dev/null +++ b/docs/learn/tests/dev-cue-package/script.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +mkdir test + +cat > test/source.cue << EOF +package test + +import ( + "github.com/tjovicic/gcpcloudrun" +) + +run: gcpcloudrun.#Run +EOF + +dagger new staging -p ./test diff --git a/docs/learn/tests/dev-cue-package/source.cue b/docs/learn/tests/dev-cue-package/source.cue new file mode 100644 index 00000000..fdac138f --- /dev/null +++ b/docs/learn/tests/dev-cue-package/source.cue @@ -0,0 +1,41 @@ +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" +) + +#Run: { + // 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 + } +} diff --git a/docs/learn/tests/doc.bats b/docs/learn/tests/doc.bats index e638cfee..7080d8ea 100644 --- a/docs/learn/tests/doc.bats +++ b/docs/learn/tests/doc.bats @@ -141,4 +141,23 @@ setup() { # Prepare and run cloudformation cleanup dagger -e cloudformation input text stackRemoval.stackName $stackName dagger -e cloudformation up -} \ No newline at end of file +} + +@test "doc-1010-dev-cue-package" { + setup_example_sandbox "" + + # Initializing workspace + mkdir workspace + cd workspace + + # Writing the package + dagger init + mkdir -p cue.mod/pkg/github.com/tjovicic/gcpcloudrun + cp $CODEBLOC_SRC/dev-cue-package/source.cue cue.mod/pkg/github.com/tjovicic/gcpcloudrun/source.cue + cp $CODEBLOC_SRC/dev-cue-package/script.sh . + + chmod +x script.sh + ./script.sh + run dagger up -e staging + assert_output --partial "environment=staging input=run.gcpConfig.serviceKey" +} From 6a442fae6c0ea6fe3ef4f050d2c9078b2c2b5155 Mon Sep 17 00:00:00 2001 From: Tom Chauveau Date: Fri, 13 Aug 2021 16:34:02 +0200 Subject: [PATCH 09/24] Update kubernetes documentation to directly use cue files Previously, we were embedding cue files directly in the doc, now we display it from real cue file that we also use to test our doc. I've add the first step of the kubernetes documentation adapted for kind Signed-off-by: Tom Chauveau --- docs/learn/1007-kubernetes.md | 28 ++------------------ docs/learn/tests/kube-kind/basic/todoapp.cue | 16 +++++++++++ docs/learn/tests/kube-kind/config.cue | 8 ++++++ 3 files changed, 26 insertions(+), 26 deletions(-) create mode 100644 docs/learn/tests/kube-kind/basic/todoapp.cue create mode 100644 docs/learn/tests/kube-kind/config.cue diff --git a/docs/learn/1007-kubernetes.md b/docs/learn/1007-kubernetes.md index f30583cd..fc63e01f 100644 --- a/docs/learn/1007-kubernetes.md +++ b/docs/learn/1007-kubernetes.md @@ -159,23 +159,7 @@ kubectl delete -f k8s/ Create a file named `todoapp.cue` and add the following configuration to it. -```cue title="todoapp/kube/todoapp.cue" -package main - -import ( - "alpha.dagger.io/dagger" - "alpha.dagger.io/kubernetes" -) - -// input: kubernetes objects directory to deploy to -// set with `dagger input dir manifest ./k8s -e kube` -manifest: dagger.#Artifact & dagger.#Input - -// Deploy the manifest to a kubernetes cluster -todoApp: kubernetes.#Resources & { - "kubeconfig": kubeconfig - source: manifest -} +```cue file=tests/kube-kind/basic/todoapp.cue title="todoapp/kube/todoapp.cue" ``` This defines a `todoApp` variable containing the Kubernetes objects used to create a todoapp deployment. It also @@ -193,15 +177,7 @@ The following `config.cue` defines: - `kubeconfig` a generic value created to embed this string `kubeconfig` value -```cue title="todoapp/kube/config.cue" -package main - -import ( - "alpha.dagger.io/dagger" -) - -// set with `dagger input text kubeconfig -f "$HOME"/.kube/config -e kube` -kubeconfig: string & dagger.#Input +```cue file=tests/kube-kind/config.cue title="todoapp/kube/config.cue" ``` diff --git a/docs/learn/tests/kube-kind/basic/todoapp.cue b/docs/learn/tests/kube-kind/basic/todoapp.cue new file mode 100644 index 00000000..878f3f85 --- /dev/null +++ b/docs/learn/tests/kube-kind/basic/todoapp.cue @@ -0,0 +1,16 @@ +package main + +import ( + "alpha.dagger.io/dagger" + "alpha.dagger.io/kubernetes" +) + +// input: kubernetes objects directory to deploy to +// set with `dagger input dir manifest ./k8s -e kube` +manifest: dagger.#Artifact & dagger.#Input + +// Deploy the manifest to a kubernetes cluster +todoApp: kubernetes.#Resources & { + "kubeconfig": kubeconfig + source: manifest +} diff --git a/docs/learn/tests/kube-kind/config.cue b/docs/learn/tests/kube-kind/config.cue new file mode 100644 index 00000000..9169451d --- /dev/null +++ b/docs/learn/tests/kube-kind/config.cue @@ -0,0 +1,8 @@ +package main + +import ( + "alpha.dagger.io/dagger" +) + +// set with `dagger input text kubeconfig -f "$HOME"/.kube/config -e kube` +kubeconfig: string & dagger.#Input From a8e218d808f5ccb03b484853e54830d0392fdfbc Mon Sep 17 00:00:00 2001 From: Tom Chauveau Date: Fri, 13 Aug 2021 16:35:53 +0200 Subject: [PATCH 10/24] Add basic test for kubernetes kind documentation Signed-off-by: Tom Chauveau --- .gitignore | 3 +- .../.dagger/env/kube-kind-basic/.gitignore | 2 + .../.dagger/env/kube-kind-basic/values.yaml | 23 ++ docs/learn/tests/doc.bats | 244 ++++++++++-------- docs/learn/tests/kube-kind/basic/manifest.cue | 11 + docs/learn/tests/yarn.lock | 15 ++ 6 files changed, 185 insertions(+), 113 deletions(-) create mode 100644 docs/learn/tests/.dagger/env/kube-kind-basic/.gitignore create mode 100644 docs/learn/tests/.dagger/env/kube-kind-basic/values.yaml create mode 100644 docs/learn/tests/kube-kind/basic/manifest.cue create mode 100644 docs/learn/tests/yarn.lock diff --git a/.gitignore b/.gitignore index 43cb1378..8a6a6c9c 100644 --- a/.gitignore +++ b/.gitignore @@ -12,7 +12,7 @@ # Test binary, build with `go test -c` *.test -tests/report.xml +**/*/report.xml # Output of the go coverage tool, specifically when used with LiteIDE *.out @@ -26,3 +26,4 @@ tests/report.xml # node_modules tests/node_modules dist/ +docs/learn/tests/node_modules diff --git a/docs/learn/tests/.dagger/env/kube-kind-basic/.gitignore b/docs/learn/tests/.dagger/env/kube-kind-basic/.gitignore new file mode 100644 index 00000000..01ec19b0 --- /dev/null +++ b/docs/learn/tests/.dagger/env/kube-kind-basic/.gitignore @@ -0,0 +1,2 @@ +# dagger state +state/** diff --git a/docs/learn/tests/.dagger/env/kube-kind-basic/values.yaml b/docs/learn/tests/.dagger/env/kube-kind-basic/values.yaml new file mode 100644 index 00000000..11457850 --- /dev/null +++ b/docs/learn/tests/.dagger/env/kube-kind-basic/values.yaml @@ -0,0 +1,23 @@ +plan: + package: ./kube-kind/basic +name: kube-kind-basic +sops: + kms: [] + gcp_kms: [] + azure_kv: [] + hc_vault: [] + age: + - recipient: age1gxwmtwahzwdmrskhf90ppwlnze30lgpm056kuesrxzeuyclrwvpsupwtpk + enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAwZ3FnR0NRay9TM1FaZXhT + T2hvQ1ZDRkNLMHpMMnh6a3QrZUpRcHhkQVVBCm5NWXdRZXVPVWhEQXdwSnQwQkZ3 + NE1wL3VyNjlVbmdqM2t2MDc1ZHVNd2sKLS0tIEZNUUtnUFVBOTEyMGVWbXgycHo4 + Z0RqSGxzN3pyc1RLcGN5b29GbHpkbWsKhNI37Ws2sWSW2ZKZSSFH5a2LD9meOQrH + MM2Xd0+Kh4OwYIfMXmCU1CmNRP/W1MUf6Eq/21uM3fDU8GDbpOV/pA== + -----END AGE ENCRYPTED FILE----- + lastmodified: "2021-08-13T12:56:16Z" + mac: ENC[AES256_GCM,data:ODBv7782ofOQzVtETFu9wdMdmK/22jl1CqPzTqdOu6oZFWklbQ4grJ3N1cemE2Ud1Awb/x41QgpSuvVHaO2dHkVEF1FmlVDIqhqm6BNQlDg81RFuvs86FP60cW8rfr4K2dhCnQ1mRKGdTLsNUjUqBd3uwPDu5f49o3Ai/EpOg0A=,iv:1UdjtEKhKyFEnkjUOPAYlyIp8xYieDBIXKGxmxcYUbs=,tag:e6YcVmSVdsfLLMOPQXrN8A==,type:str] + pgp: [] + encrypted_suffix: secret + version: 3.7.1 diff --git a/docs/learn/tests/doc.bats b/docs/learn/tests/doc.bats index 7080d8ea..71e8ed67 100644 --- a/docs/learn/tests/doc.bats +++ b/docs/learn/tests/doc.bats @@ -2,162 +2,182 @@ ## Indentation is important, please append at the end setup() { - load 'helpers' + load 'helpers' - common_setup + common_setup } # Test 1003-get-started @test "doc-1003-get-started" { - setup_example_sandbox "doc" + setup_example_sandbox "doc" - # Set examples private key - ./import-tutorial-key.sh + # Set examples private key + ./import-tutorial-key.sh - # Collect url - dagger up - url=$(dagger query -f text url) + # Collect url + dagger up + url=$(dagger query -f text url) - # More commands - dagger list - ls -l ./s3 - dagger input list + # More commands + dagger list + ls -l ./s3 + dagger input list - # Check output - run curl $url - assert_output --partial "My Todo app" + # Check output + run curl $url + assert_output --partial "My Todo app" } @test "doc-1004-first-env" { - setup_example_sandbox "doc" + setup_example_sandbox "doc" - # Follow tutorial - mkdir multibucket - cp $CODEBLOC_SRC/multibucket/source.cue multibucket - cp $CODEBLOC_SRC/multibucket/yarn.cue multibucket - cp $CODEBLOC_SRC/multibucket/netlify.cue multibucket + # Follow tutorial + mkdir multibucket + cp $CODEBLOC_SRC/multibucket/source.cue multibucket + cp $CODEBLOC_SRC/multibucket/yarn.cue multibucket + cp $CODEBLOC_SRC/multibucket/netlify.cue multibucket - dagger doc alpha.dagger.io/netlify - dagger doc alpha.dagger.io/js/yarn + dagger doc alpha.dagger.io/netlify + dagger doc alpha.dagger.io/js/yarn - # Initialize new env - dagger new 'multibucket' -p ./multibucket + # Initialize new env + dagger new 'multibucket' -p ./multibucket - # Copy corresponding env - cp -r $CODEBLOC_SRC/.dagger/env/multibucket .dagger/env/ - # Add missing src input - dagger -e multibucket input dir src . + # Copy corresponding env + cp -r $CODEBLOC_SRC/.dagger/env/multibucket .dagger/env/ + # Add missing src input + dagger -e multibucket input dir src . - # Run test - dagger -e multibucket up - url=$(dagger -e multibucket query -f text site.netlify.deployUrl) + # Run test + dagger -e multibucket up + url=$(dagger -e multibucket query -f text site.netlify.deployUrl) - # Check output : - run curl $url - assert_output --partial "./static/css/main.9149988f.chunk.css" + # Check output : + run curl $url + assert_output --partial "./static/css/main.9149988f.chunk.css" } @test "doc-1006-google-cloud-run" { - setup_example_sandbox "doc" + setup_example_sandbox "doc" - mkdir gcpcloudrun - cp $CODEBLOC_SRC/gcpcloudrun/source.cue gcpcloudrun + mkdir gcpcloudrun + cp $CODEBLOC_SRC/gcpcloudrun/source.cue gcpcloudrun - # Initialize new env - dagger new 'gcpcloudrun' -p gcpcloudrun + # Initialize new env + dagger new 'gcpcloudrun' -p gcpcloudrun - # Copy corresponding env - cp -r $CODEBLOC_SRC/.dagger/env/gcpcloudrun .dagger/env/ - # Add missing src input - dagger -e gcpcloudrun input dir src . + # Copy corresponding env + cp -r $CODEBLOC_SRC/.dagger/env/gcpcloudrun .dagger/env/ + # Add missing src input + dagger -e gcpcloudrun input dir src . - # Run test - run dagger -e gcpcloudrun up - assert_success + # Run test + run dagger -e gcpcloudrun up + assert_success +} + +@test "doc-1007-kube-kind" { + skip_unless_local_kube + + #################### BASIC #################### + # Copy deployment to sendbox + copy_to_sandbox kube-kind-basic kube-kind + + # Add kubeconfig + dagger -w "$DAGGER_SANDBOX" -e kube-kind-basic input text kubeconfig -f "$HOME"/.kube/config + + # Up deployment + dagger -w "$DAGGER_SANDBOX" -e kube-kind-basic up + + # Check deployment + kubectl get deployment + + # Clean + kubectl delete deployments --all } @test "doc-1008-aws-cloudformation" { - setup_example_sandbox "doc" + setup_example_sandbox "doc" - ### Create a basic plan - ## Construct - mkdir cloudformation - cp $CODEBLOC_SRC/cloudformation/template.cue cloudformation + ### Create a basic plan + ## Construct + mkdir cloudformation + cp $CODEBLOC_SRC/cloudformation/template.cue cloudformation - # Cloudformation relay - dagger doc alpha.dagger.io/aws/cloudformation - cp $CODEBLOC_SRC/cloudformation/source-begin.cue cloudformation/source.cue + # Cloudformation relay + dagger doc alpha.dagger.io/aws/cloudformation + cp $CODEBLOC_SRC/cloudformation/source-begin.cue cloudformation/source.cue - # Initialize new env - dagger new 'cloudformation' -p cloudformation + # Initialize new env + dagger new 'cloudformation' -p cloudformation - # Finish template setup - cp $CODEBLOC_SRC/cloudformation/source-end.cue cloudformation/source.cue - # Copy corresponding env - cp -r $CODEBLOC_SRC/.dagger/env/cloudformation .dagger/env/ + # Finish template setup + cp $CODEBLOC_SRC/cloudformation/source-end.cue cloudformation/source.cue + # Copy corresponding env + cp -r $CODEBLOC_SRC/.dagger/env/cloudformation .dagger/env/ - # Run test - dagger -e cloudformation up - stackName=$(dagger -e cloudformation query cfnStackName -f text) + # Run test + dagger -e cloudformation up + stackName=$(dagger -e cloudformation query cfnStackName -f text) - ## Cleanup - # Place back empty source - cp $CODEBLOC_SRC/cloudformation/source-begin.cue cloudformation/source.cue - cp $CODEBLOC_SRC/cloudformation/deletion.cue cloudformation/deletion.cue - # Prepare and run cloudformation cleanup - dagger -e cloudformation input text stackRemoval.stackName $stackName - dagger -e cloudformation up + ## Cleanup + # Place back empty source + cp $CODEBLOC_SRC/cloudformation/source-begin.cue cloudformation/source.cue + cp $CODEBLOC_SRC/cloudformation/deletion.cue cloudformation/deletion.cue + # Prepare and run cloudformation cleanup + dagger -e cloudformation input text stackRemoval.stackName $stackName + dagger -e cloudformation up - ### Template part - ## Create convert.cue - cp $CODEBLOC_SRC/cloudformation/template/convert.cue cloudformation/convert.cue - rm cloudformation/source.cue cloudformation/deletion.cue + ### Template part + ## Create convert.cue + cp $CODEBLOC_SRC/cloudformation/template/convert.cue cloudformation/convert.cue + rm cloudformation/source.cue cloudformation/deletion.cue - ## Retrieve Unmarshalled JSON - dagger query -e cloudformation s3Template + ## Retrieve Unmarshalled JSON + dagger query -e cloudformation s3Template - ## Remove convert.cue - rm cloudformation/convert.cue - ## Store the output - cp $CODEBLOC_SRC/cloudformation/template/template-begin.cue cloudformation/template.cue - # Inspect conf - dagger query -e cloudformation template -f text + ## Remove convert.cue + rm cloudformation/convert.cue + ## Store the output + cp $CODEBLOC_SRC/cloudformation/template/template-begin.cue cloudformation/template.cue + # Inspect conf + dagger query -e cloudformation template -f text - cp $CODEBLOC_SRC/cloudformation/template/deployment.cue cloudformation/deployment.cue - cp $CODEBLOC_SRC/cloudformation/template/template-end.cue cloudformation/template.cue - cp $CODEBLOC_SRC/cloudformation/source-end.cue cloudformation/source.cue + cp $CODEBLOC_SRC/cloudformation/template/deployment.cue cloudformation/deployment.cue + cp $CODEBLOC_SRC/cloudformation/template/template-end.cue cloudformation/template.cue + cp $CODEBLOC_SRC/cloudformation/source-end.cue cloudformation/source.cue - # Deploy again - dagger -e cloudformation query template -f text - dagger -e cloudformation up - dagger -e cloudformation output list + # Deploy again + dagger -e cloudformation query template -f text + dagger -e cloudformation up + dagger -e cloudformation output list - ## Cleanup again - stackName=$(dagger -e cloudformation query cfnStackName -f text) - rm -rf cloudformation/* - # Place back empty source - cp $CODEBLOC_SRC/cloudformation/source-begin.cue cloudformation/source.cue - cp $CODEBLOC_SRC/cloudformation/deletion.cue cloudformation/deletion.cue - # Prepare and run cloudformation cleanup - dagger -e cloudformation input text stackRemoval.stackName $stackName - dagger -e cloudformation up + ## Cleanup again + stackName=$(dagger -e cloudformation query cfnStackName -f text) + rm -rf cloudformation/* + # Place back empty source + cp $CODEBLOC_SRC/cloudformation/source-begin.cue cloudformation/source.cue + cp $CODEBLOC_SRC/cloudformation/deletion.cue cloudformation/deletion.cue + # Prepare and run cloudformation cleanup + dagger -e cloudformation input text stackRemoval.stackName $stackName + dagger -e cloudformation up } @test "doc-1010-dev-cue-package" { - setup_example_sandbox "" + setup_example_sandbox "" - # Initializing workspace - mkdir workspace - cd workspace + # Initializing workspace + mkdir workspace + cd workspace - # Writing the package - dagger init - mkdir -p cue.mod/pkg/github.com/tjovicic/gcpcloudrun - cp $CODEBLOC_SRC/dev-cue-package/source.cue cue.mod/pkg/github.com/tjovicic/gcpcloudrun/source.cue - cp $CODEBLOC_SRC/dev-cue-package/script.sh . + # Writing the package + dagger init + mkdir -p cue.mod/pkg/github.com/tjovicic/gcpcloudrun + cp $CODEBLOC_SRC/dev-cue-package/source.cue cue.mod/pkg/github.com/tjovicic/gcpcloudrun/source.cue + cp $CODEBLOC_SRC/dev-cue-package/script.sh . - chmod +x script.sh - ./script.sh - run dagger up -e staging - assert_output --partial "environment=staging input=run.gcpConfig.serviceKey" + chmod +x script.sh + ./script.sh + run dagger up -e staging + assert_output --partial "environment=staging input=run.gcpConfig.serviceKey" } diff --git a/docs/learn/tests/kube-kind/basic/manifest.cue b/docs/learn/tests/kube-kind/basic/manifest.cue new file mode 100644 index 00000000..95c4430a --- /dev/null +++ b/docs/learn/tests/kube-kind/basic/manifest.cue @@ -0,0 +1,11 @@ +package main + +import ( + "alpha.dagger.io/git" +) + +manifest: git.#Repository & { + remote: "https://github.com/dagger/examples.git" + ref: "main" + subdir: "todoapp/k8s" +} diff --git a/docs/learn/tests/yarn.lock b/docs/learn/tests/yarn.lock new file mode 100644 index 00000000..b2efa236 --- /dev/null +++ b/docs/learn/tests/yarn.lock @@ -0,0 +1,15 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"bats-assert@https://github.com/bats-core/bats-assert": + version "2.0.0" + resolved "https://github.com/bats-core/bats-assert#e0de84e9c011223e7f88b7ccf1c929f4327097ba" + +"bats-support@https://github.com/bats-core/bats-support": + version "0.3.0" + resolved "https://github.com/bats-core/bats-support#d140a65044b2d6810381935ae7f0c94c7023c8c3" + +"bats@https://github.com/bats-core/bats-core#master": + version "1.4.1" + resolved "https://github.com/bats-core/bats-core#7ff2f3efc738976feaccfdf374164b61599f9e36" From b145d03192c50a80e0dca270b024eebcdbeb8bdd Mon Sep 17 00:00:00 2001 From: Tom Chauveau Date: Fri, 13 Aug 2021 16:36:10 +0200 Subject: [PATCH 11/24] Update CI workflow to test documentation Signed-off-by: Tom Chauveau --- .github/workflows/ci.yml | 54 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2e249dc4..fedc5589 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -185,3 +185,57 @@ jobs: with: name: cypress-videos path: website/cypress/videos + doc: + name: Documentation + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - name: Check out + uses: actions/checkout@v2 + + - name: Set up Go + uses: actions/setup-go@v1 + with: + go-version: 1.16 + + - name: Install Dependencies + run: | + # Cue + export CUE_VERSION="$(grep cue ./go.mod | cut -d' ' -f2)" + export CUE_TARBALL="cue_${CUE_VERSION}_linux_amd64.tar.gz" + echo "Installing cue version $CUE_VERSION" + curl -L https://github.com/cuelang/cue/releases/download/${CUE_VERSION}/${CUE_TARBALL} | sudo tar zxf - -C /usr/local/bin + + - name: Run local registry + run: | + docker run -d -p 5000:5000 --name registry registry:2 + + - name: Write kind echo + run: | + echo 'kind: Cluster + apiVersion: kind.x-k8s.io/v1alpha4 + containerdConfigPatches: + - |- + [plugins."io.containerd.grpc.v1.cri".registry.mirrors."localhost:5000"] + endpoint = ["http://registry:5000"]' > ./kind-config.yaml + cat ./kind-config.yaml + + - name: Setup Kind Kubernetes Cluster + uses: helm/kind-action@v1.2.0 + with: + config: "./kind-config.yaml" + + - name: Connect registry to cluster + run: | + docker network connect kind registry + + - name: Import Dagger private key + env: + DAGGER_AGE_KEY: ${{ secrets.DAGGER_AGE_KEY }} + run: | + mkdir -p ~/.config/dagger + echo "$DAGGER_AGE_KEY" > ~/.config/dagger/keys.txt + + - name: Documentation Test + run: | + make doc-test From bdcb917943c9ff062fcdbad0b298724c68ed4b8a Mon Sep 17 00:00:00 2001 From: Tom Chauveau Date: Fri, 13 Aug 2021 18:42:49 +0200 Subject: [PATCH 12/24] Add kubernetes test for kind deployment Signed-off-by: Tom Chauveau --- docs/learn/1007-kubernetes.md | 59 +------------------ .../env/kube-kind-deployment/.gitignore | 2 + .../env/kube-kind-deployment/values.yaml | 26 ++++++++ docs/learn/tests/doc.bats | 17 +++++- .../tests/kube-kind/deployment/manifest.cue | 17 ++++++ .../tests/kube-kind/deployment/todoapp.cue | 57 ++++++++++++++++++ 6 files changed, 119 insertions(+), 59 deletions(-) create mode 100644 docs/learn/tests/.dagger/env/kube-kind-deployment/.gitignore create mode 100644 docs/learn/tests/.dagger/env/kube-kind-deployment/values.yaml create mode 100644 docs/learn/tests/kube-kind/deployment/manifest.cue create mode 100644 docs/learn/tests/kube-kind/deployment/todoapp.cue diff --git a/docs/learn/1007-kubernetes.md b/docs/learn/1007-kubernetes.md index fc63e01f..3e101250 100644 --- a/docs/learn/1007-kubernetes.md +++ b/docs/learn/1007-kubernetes.md @@ -434,64 +434,7 @@ Let's see how to deploy an image locally and push it to the local cluster - `remoteImage`, push an image to the registry - `kustomization`, apply kustomization to image -```cue title="todoapp/kube/todoapp.cue" -package main - -import ( - "encoding/yaml" - - "alpha.dagger.io/dagger" - "alpha.dagger.io/docker" - "alpha.dagger.io/kubernetes" - "alpha.dagger.io/kubernetes/kustomize" -) - -// input: source code repository, must contain a Dockerfile -// set with `dagger input dir repository . -e kube` -repository: dagger.#Artifact & dagger.#Input - -// Registry to push images to -registry: string & dagger.#Input -tag: "test-kind" - -// input: kubernetes objects directory to deploy to -// set with `dagger input dir manifest ./k8s -e kube` -manifest: dagger.#Artifact & dagger.#Input - -// Todoapp deployment pipeline -todoApp: { - // Build the image from repositoru artifact - image: docker.#Build & { - source: repository - } - - // Push image to registry - remoteImage: docker.#Push & { - target: "\(registry):\(tag)" - source: image - } - - // Update the image from manifest to use the deployed one - kustomization: kustomize.#Kustomize & { - source: manifest - - // Convert CUE to YAML. - kustomization: yaml.Marshal({ - resources: ["deployment.yaml", "service.yaml"] - - images: [{ - name: "public.ecr.aws/j7f8d3t2/todoapp" - newName: remoteImage.ref - }] - }) - } - - // Deploy the customized manifest to a kubernetes cluster - kubeSrc: kubernetes.#Resources & { - "kubeconfig": kubeconfig - source: kustomization - } -} +```cue file=tests/kube-kind/deployment/todoapp.cue title="todoapp/kube/todoapp.cue" ``` diff --git a/docs/learn/tests/.dagger/env/kube-kind-deployment/.gitignore b/docs/learn/tests/.dagger/env/kube-kind-deployment/.gitignore new file mode 100644 index 00000000..01ec19b0 --- /dev/null +++ b/docs/learn/tests/.dagger/env/kube-kind-deployment/.gitignore @@ -0,0 +1,2 @@ +# dagger state +state/** diff --git a/docs/learn/tests/.dagger/env/kube-kind-deployment/values.yaml b/docs/learn/tests/.dagger/env/kube-kind-deployment/values.yaml new file mode 100644 index 00000000..c078173c --- /dev/null +++ b/docs/learn/tests/.dagger/env/kube-kind-deployment/values.yaml @@ -0,0 +1,26 @@ +plan: + package: ./kube-kind/deployment +name: kube-kind-deployment +inputs: + registry: + text: localhost:5000/kind +sops: + kms: [] + gcp_kms: [] + azure_kv: [] + hc_vault: [] + age: + - recipient: age1gxwmtwahzwdmrskhf90ppwlnze30lgpm056kuesrxzeuyclrwvpsupwtpk + enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBxRlpLcVVoTnVLUkVOMlpN + eXRzdkgvNjNGYWNzaVBBNUJEZFdnbXhMTzI0CjlsNGVDcHlHTDk3VU1ycEVvVmti + SmlGVDFZUTlKWm9OVWdwK1Q4ZmZXZDgKLS0tIDRNRW4razlkbnFMdDV1UU52aHdT + d1pSR1VtUU12VmlDTEdyazgwdkdwQkkK6NZclDyaf5YwBWAbL6VmJWzCNT+cFXsU + gM9y8Bo/VXHx2uR5ceLVtAGvTl4XuIGTqBEqpIelTJAD3TUj2C2upg== + -----END AGE ENCRYPTED FILE----- + lastmodified: "2021-08-13T16:37:05Z" + mac: ENC[AES256_GCM,data:qO6rbMUVpVs5dwmZm7nHSsGPysJXcIkvpRMeEhihUXGcZ6IeVX2dmuwOXMTQWtJ6HwhM+wdYyj5IIlujYARC+FYj3ldrYlCs/kPzfcDkJm1K9PXcKKTm5wV7v0hcTvmwe9ju5VSNWtLvXNsE8+u8hz9Wnnz4e0QQCvNQmUHJrNo=,iv:+JuEpyBRXZ4xb4KQ15p8OK7QPqB4iYtgSyPDxK9949w=,tag:9m27tAGWjxr87DzEzP5vmQ==,type:str] + pgp: [] + encrypted_suffix: secret + version: 3.7.1 diff --git a/docs/learn/tests/doc.bats b/docs/learn/tests/doc.bats index 71e8ed67..8c3d9384 100644 --- a/docs/learn/tests/doc.bats +++ b/docs/learn/tests/doc.bats @@ -90,7 +90,22 @@ setup() { dagger -w "$DAGGER_SANDBOX" -e kube-kind-basic up # Check deployment - kubectl get deployment + kubectl describe deployment todoapp | grep 'True' + + # Clean + kubectl delete deployments --all + + #################### DEPLOYMENT #################### + copy_to_sandbox kube-kind-deployment kube-kind + + # Add kubeconfig + dagger -w "$DAGGER_SANDBOX" -e kube-kind-deployment input text kubeconfig -f "$HOME"/.kube/config + + # Up deployment + dagger -w "$DAGGER_SANDBOX" -e kube-kind-deployment up + + # Check deployment + kubectl describe deployment todoapp | grep 'True' # Clean kubectl delete deployments --all diff --git a/docs/learn/tests/kube-kind/deployment/manifest.cue b/docs/learn/tests/kube-kind/deployment/manifest.cue new file mode 100644 index 00000000..75733e04 --- /dev/null +++ b/docs/learn/tests/kube-kind/deployment/manifest.cue @@ -0,0 +1,17 @@ +package main + +import ( + "alpha.dagger.io/git" +) + +manifest: git.#Repository & { + remote: "https://github.com/dagger/examples.git" + ref: "main" + subdir: "todoapp/k8s" +} + +repository: git.#Repository & { + remote: "https://github.com/dagger/examples.git" + ref: "main" + subdir: "todoapp" +} diff --git a/docs/learn/tests/kube-kind/deployment/todoapp.cue b/docs/learn/tests/kube-kind/deployment/todoapp.cue new file mode 100644 index 00000000..17c05df1 --- /dev/null +++ b/docs/learn/tests/kube-kind/deployment/todoapp.cue @@ -0,0 +1,57 @@ +package main + +import ( + "encoding/yaml" + + "alpha.dagger.io/dagger" + "alpha.dagger.io/docker" + "alpha.dagger.io/kubernetes" + "alpha.dagger.io/kubernetes/kustomize" +) + +// input: source code repository, must contain a Dockerfile +// set with `dagger input dir repository . -e kube` +repository: dagger.#Artifact & dagger.#Input + +// Registry to push images to +registry: string & dagger.#Input +tag: "test-kind" + +// input: kubernetes objects directory to deploy to +// set with `dagger input dir manifest ./k8s -e kube` +manifest: dagger.#Artifact & dagger.#Input + +// Todoapp deployment pipeline +todoApp: { + // Build the image from repositoru artifact + image: docker.#Build & { + source: repository + } + + // Push image to registry + remoteImage: docker.#Push & { + target: "\(registry):\(tag)" + source: image + } + + // Update the image from manifest to use the deployed one + kustomization: kustomize.#Kustomize & { + source: manifest + + // Convert CUE to YAML. + kustomization: yaml.Marshal({ + resources: ["deployment.yaml", "service.yaml"] + + images: [{ + name: "public.ecr.aws/j7f8d3t2/todoapp" + newName: remoteImage.ref + }] + }) + } + + // Deploy the customized manifest to a kubernetes cluster + kubeSrc: kubernetes.#Resources & { + "kubeconfig": kubeconfig + source: kustomization + } +} From a91181bb5ffb3c037a5b9bbc8cbe649f1c47a6cd Mon Sep 17 00:00:00 2001 From: Tom Chauveau Date: Fri, 13 Aug 2021 19:11:50 +0200 Subject: [PATCH 13/24] Add kubernetes test for kind cue-manifest Signed-off-by: Tom Chauveau --- docs/learn/1007-kubernetes.md | 164 +----------------- .../env/kube-kind-cue-manifest/.gitignore | 2 + .../env/kube-kind-cue-manifest/values.yaml | 26 +++ docs/learn/tests/doc.bats | 19 +- .../basic/{manifest.cue => input.cue} | 0 .../kube-kind/cue-manifest/deployment.cue | 43 +++++ .../tests/kube-kind/cue-manifest/input.cue | 11 ++ .../tests/kube-kind/cue-manifest/manifest.cue | 29 ++++ .../tests/kube-kind/cue-manifest/service.cue | 36 ++++ .../tests/kube-kind/cue-manifest/todoapp.cue | 41 +++++ .../deployment/{manifest.cue => input.cue} | 0 11 files changed, 213 insertions(+), 158 deletions(-) create mode 100644 docs/learn/tests/.dagger/env/kube-kind-cue-manifest/.gitignore create mode 100644 docs/learn/tests/.dagger/env/kube-kind-cue-manifest/values.yaml rename docs/learn/tests/kube-kind/basic/{manifest.cue => input.cue} (100%) create mode 100644 docs/learn/tests/kube-kind/cue-manifest/deployment.cue create mode 100644 docs/learn/tests/kube-kind/cue-manifest/input.cue create mode 100644 docs/learn/tests/kube-kind/cue-manifest/manifest.cue create mode 100644 docs/learn/tests/kube-kind/cue-manifest/service.cue create mode 100644 docs/learn/tests/kube-kind/cue-manifest/todoapp.cue rename docs/learn/tests/kube-kind/deployment/{manifest.cue => input.cue} (100%) diff --git a/docs/learn/1007-kubernetes.md b/docs/learn/1007-kubernetes.md index 3e101250..46edd96c 100644 --- a/docs/learn/1007-kubernetes.md +++ b/docs/learn/1007-kubernetes.md @@ -752,96 +752,17 @@ of the language features. ### Convert Kubernetes objects to CUE -First, let's create re-usable definitions for the `deployment` and the `service` to remove a lot of boilerplate -and repetition. +First, let's create re-usable definitions for the `deployment` and the `service` to remove a lot of boilerplate and +repetition. Let's define a re-usable `#Deployment` definition in `kube/deployment.cue`. -```cue title="todoapp/kube/deployment.cue" -package main - -// Deployment template containing all the common boilerplate shared by -// deployments of this application. -#Deployment: { - // Name of the deployment. This will be used to label resources automatically - // and generate selectors. - name: string - - // Container image. - image: string - - // 80 is the default port. - port: *80 | int - - // 1 is the default, but we allow any number. - replicas: *1 | int - - // Deployment manifest. Uses the name, image, port and replicas above to - // generate the resource manifest. - manifest: { - apiVersion: "apps/v1" - kind: "Deployment" - metadata: { - "name": name - labels: app: name - } - spec: { - "replicas": replicas - selector: matchLabels: app: name - template: { - metadata: labels: app: name - spec: containers: [{ - "name": name - "image": image - ports: [{ - containerPort: port - }] - }] - } - } - } -} +```cue file=tests/kube-kind/cue-manifest/deployment.cue title="todoapp/kube/deployment.cue" ``` Indeed, let's also define a re-usable `#Service` definition in `kube/service.cue`. -```cue title="todoapp/kube/service.cue" -package main - -// Service template containing all the common boilerplate shared by -// services of this application. -#Service: { - // Name of the service. This will be used to label resources automatically - // and generate selector. - name: string - - // NodePort is the default service type. - type: *"NodePort" | "LoadBalancer" | "ClusterIP" | "ExternalName" - - // Ports where the service should listen - ports: [string]: number - - // Service manifest. Uses the name, type and ports above to - // generate the resource manifest. - manifest: { - apiVersion: "v1" - kind: "Service" - metadata: { - "name": "\(name)-service" - labels: app: name - } - spec: { - "type": type - "ports": [ - for k, v in ports { - "name": k - port: v - }, - ] - selector: app: name - } - } -} +```cue file=tests/kube-kind/cue-manifest/service.cue title="todoapp/kube/service.cue" ``` ### Generate Kubernetes manifest @@ -851,36 +772,7 @@ without having boilerplate nor repetition. Create a new definition named `#AppManifest` that will generate the YAML in `kube/manifest.cue`. -```cue title="todoapp/kube/manifest.cue" -package main - -import ( - "encoding/yaml" -) - -// Define and generate kubernetes deployment to deploy to kubernetes cluster -#AppManifest: { - // Name of the application - name: string - - // Image to deploy to - image: string - - // Define a kubernetes deployment object - deployment: #Deployment & { - "name": name - "image": image - } - - // Define a kubernetes service object - service: #Service & { - "name": name - ports: "http": deployment.port - } - - // Merge definitions and convert them back from CUE to YAML - manifest: yaml.MarshalStream([deployment.manifest, service.manifest]) -} +```cue file=tests/kube-kind/cue-manifest/manifest.cue title="todoapp/kube/manifest.cue" ``` ### Update manifest @@ -892,7 +784,8 @@ You can now remove the `manifest` input in `kube/todoapp.cue` and instead use th - removal of unused imported `encoding/yaml` and `kustomize` packages. - removal of `manifest` input that is doesn't need anymore. - removal of `kustomization` to replace it with `#AppManifest` definition. -- Update `kubeSrc` to use `manifest` field instead of `source` because we don't send Kubernetes manifest of `dagger.#Artifact` type anymore. +- Update `kubeSrc` to use `manifest` field instead of `source` because we don't send Kubernetes manifest + of `dagger.#Artifact` type anymore. -```cue title="todoapp/kube/todoapp.cue" -package main - -import ( - "alpha.dagger.io/dagger" - "alpha.dagger.io/docker" - "alpha.dagger.io/kubernetes" -) - -// input: source code repository, must contain a Dockerfile -// set with `dagger input dir repository . -e kube` -repository: dagger.#Artifact & dagger.#Input - -// Registry to push images to -registry: string & dagger.#Input -tag: "test-kind" - -// Todoapp deployment pipeline -todoApp: { - // Build the image from repositoru artifact - image: docker.#Build & { - source: repository - } - - // Push image to registry - remoteImage: docker.#Push & { - target: "\(registry):\(tag)" - source: image - } - - // Generate deployment manifest - deployment: #AppManifest & { - name: "todoapp" - image: remoteImage.ref - } - - // Deploy the customized manifest to a kubernetes cluster - kubeSrc: kubernetes.#Resources & { - "kubeconfig": kubeconfig - manifest: deployment.manifest - } -} +```cue file=tests/kube-kind/cue-manifest/todoapp.cue title="todoapp/kube/todoapp.cue" ``` diff --git a/docs/learn/tests/.dagger/env/kube-kind-cue-manifest/.gitignore b/docs/learn/tests/.dagger/env/kube-kind-cue-manifest/.gitignore new file mode 100644 index 00000000..01ec19b0 --- /dev/null +++ b/docs/learn/tests/.dagger/env/kube-kind-cue-manifest/.gitignore @@ -0,0 +1,2 @@ +# dagger state +state/** diff --git a/docs/learn/tests/.dagger/env/kube-kind-cue-manifest/values.yaml b/docs/learn/tests/.dagger/env/kube-kind-cue-manifest/values.yaml new file mode 100644 index 00000000..db84bd57 --- /dev/null +++ b/docs/learn/tests/.dagger/env/kube-kind-cue-manifest/values.yaml @@ -0,0 +1,26 @@ +plan: + package: ./kube-kind/cue-manifest +name: kube-kind-cue-manifest +inputs: + registry: + text: localhost:5000/kind +sops: + kms: [] + gcp_kms: [] + azure_kv: [] + hc_vault: [] + age: + - recipient: age1gxwmtwahzwdmrskhf90ppwlnze30lgpm056kuesrxzeuyclrwvpsupwtpk + enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSA0cks5RUFvcGZseFZUYkVT + azFieWVQZEhORFFFLysvVkJJMUZlZ3FxVFZVClRZSHNiMC91RGtWUjVDOEJlTisz + WjdmVW5Rc0wrbjYyZlNkMVE2Wkg5SzAKLS0tIFFmZFdSUFViR2tYTG9UMHYwNzNL + WkdkcFZvM2NtRUhtVzhxUWRZT1FCUEUKzUdfMTXsr2sdrG5B9qvdGrSMuvvJG2qB + eZWf3QbQBIk9OWcU14E1j+xUrR+tME7ABA2UD3/VpLxSEUI2Cp2VpA== + -----END AGE ENCRYPTED FILE----- + lastmodified: "2021-08-13T17:07:17Z" + mac: ENC[AES256_GCM,data:E00oUv3prQDGBxTysz71/lu0Y0uYPI7L6gRSz3uMmXsl2y/HPxt7F29vOuxj8BwkBiwFzq7aV3ql7S+EKLAFgCiN81PCAE51ObBceoZmAJNyTCRUzG+o8fIjCsIGfdMSOpoCvVIwQuB0YytICN0+zA/75JNzGvPAgStB7ZI9TPM=,iv:vN944S2hd1Is3UByevNXNB1oUmvMvx0f4LgxkId6vjI=,tag:aYbNEuz1Xs3Lpfjhb91BBA==,type:str] + pgp: [] + encrypted_suffix: secret + version: 3.7.1 diff --git a/docs/learn/tests/doc.bats b/docs/learn/tests/doc.bats index 8c3d9384..fbebeb08 100644 --- a/docs/learn/tests/doc.bats +++ b/docs/learn/tests/doc.bats @@ -95,8 +95,8 @@ setup() { # Clean kubectl delete deployments --all - #################### DEPLOYMENT #################### - copy_to_sandbox kube-kind-deployment kube-kind + #################### DEPLOYMENT #################### + copy_to_sandbox kube-kind-deployment kube-kind # Add kubeconfig dagger -w "$DAGGER_SANDBOX" -e kube-kind-deployment input text kubeconfig -f "$HOME"/.kube/config @@ -109,6 +109,21 @@ setup() { # Clean kubectl delete deployments --all + + #################### CUE MANIFEST #################### + copy_to_sandbox kube-kind-cue-manifest kube-kind + + # Add kubeconfig + dagger -w "$DAGGER_SANDBOX" -e kube-kind-cue-manifest input text kubeconfig -f "$HOME"/.kube/config + + # Up deployment + dagger -w "$DAGGER_SANDBOX" -e kube-kind-cue-manifest up + + # Check deployment + kubectl describe deployment todoapp | grep 'True' + + # Clean + kubectl delete deployments --all } @test "doc-1008-aws-cloudformation" { diff --git a/docs/learn/tests/kube-kind/basic/manifest.cue b/docs/learn/tests/kube-kind/basic/input.cue similarity index 100% rename from docs/learn/tests/kube-kind/basic/manifest.cue rename to docs/learn/tests/kube-kind/basic/input.cue diff --git a/docs/learn/tests/kube-kind/cue-manifest/deployment.cue b/docs/learn/tests/kube-kind/cue-manifest/deployment.cue new file mode 100644 index 00000000..88d7b800 --- /dev/null +++ b/docs/learn/tests/kube-kind/cue-manifest/deployment.cue @@ -0,0 +1,43 @@ +package main + +// Deployment template containing all the common boilerplate shared by +// deployments of this application. +#Deployment: { + // Name of the deployment. This will be used to label resources automatically + // and generate selectors. + name: string + + // Container image. + image: string + + // 80 is the default port. + port: *80 | int + + // 1 is the default, but we allow any number. + replicas: *1 | int + + // Deployment manifest. Uses the name, image, port and replicas above to + // generate the resource manifest. + manifest: { + apiVersion: "apps/v1" + kind: "Deployment" + metadata: { + "name": name + labels: app: name + } + spec: { + "replicas": replicas + selector: matchLabels: app: name + template: { + metadata: labels: app: name + spec: containers: [{ + "name": name + "image": image + ports: [{ + containerPort: port + }] + }] + } + } + } +} diff --git a/docs/learn/tests/kube-kind/cue-manifest/input.cue b/docs/learn/tests/kube-kind/cue-manifest/input.cue new file mode 100644 index 00000000..c7249135 --- /dev/null +++ b/docs/learn/tests/kube-kind/cue-manifest/input.cue @@ -0,0 +1,11 @@ +package main + +import ( + "alpha.dagger.io/git" +) + +repository: git.#Repository & { + remote: "https://github.com/dagger/examples.git" + ref: "main" + subdir: "todoapp" +} diff --git a/docs/learn/tests/kube-kind/cue-manifest/manifest.cue b/docs/learn/tests/kube-kind/cue-manifest/manifest.cue new file mode 100644 index 00000000..df4ff0d9 --- /dev/null +++ b/docs/learn/tests/kube-kind/cue-manifest/manifest.cue @@ -0,0 +1,29 @@ +package main + +import ( + "encoding/yaml" +) + +// Define and generate kubernetes deployment to deploy to kubernetes cluster +#AppManifest: { + // Name of the application + name: string + + // Image to deploy to + image: string + + // Define a kubernetes deployment object + deployment: #Deployment & { + "name": name + "image": image + } + + // Define a kubernetes service object + service: #Service & { + "name": name + ports: http: deployment.port + } + + // Merge definitions and convert them back from CUE to YAML + manifest: yaml.MarshalStream([deployment.manifest, service.manifest]) +} diff --git a/docs/learn/tests/kube-kind/cue-manifest/service.cue b/docs/learn/tests/kube-kind/cue-manifest/service.cue new file mode 100644 index 00000000..8c5dc957 --- /dev/null +++ b/docs/learn/tests/kube-kind/cue-manifest/service.cue @@ -0,0 +1,36 @@ +package main + +// Service template containing all the common boilerplate shared by +// services of this application. +#Service: { + // Name of the service. This will be used to label resources automatically + // and generate selector. + name: string + + // NodePort is the default service type. + type: *"NodePort" | "LoadBalancer" | "ClusterIP" | "ExternalName" + + // Ports where the service should listen + ports: [string]: number + + // Service manifest. Uses the name, type and ports above to + // generate the resource manifest. + manifest: { + apiVersion: "v1" + kind: "Service" + metadata: { + "name": "\(name)-service" + labels: app: name + } + spec: { + "type": type + "ports": [ + for k, v in ports { + name: k + port: v + }, + ] + selector: app: name + } + } +} diff --git a/docs/learn/tests/kube-kind/cue-manifest/todoapp.cue b/docs/learn/tests/kube-kind/cue-manifest/todoapp.cue new file mode 100644 index 00000000..9ffdbe33 --- /dev/null +++ b/docs/learn/tests/kube-kind/cue-manifest/todoapp.cue @@ -0,0 +1,41 @@ +package main + +import ( + "alpha.dagger.io/dagger" + "alpha.dagger.io/docker" + "alpha.dagger.io/kubernetes" +) + +// input: source code repository, must contain a Dockerfile +// set with `dagger input dir repository . -e kube` +repository: dagger.#Artifact & dagger.#Input + +// Registry to push images to +registry: string & dagger.#Input +tag: "test-kind" + +// Todoapp deployment pipeline +todoApp: { + // Build the image from repositoru artifact + image: docker.#Build & { + source: repository + } + + // Push image to registry + remoteImage: docker.#Push & { + target: "\(registry):\(tag)" + source: image + } + + // Generate deployment manifest + deployment: #AppManifest & { + name: "todoapp" + image: remoteImage.ref + } + + // Deploy the customized manifest to a kubernetes cluster + kubeSrc: kubernetes.#Resources & { + "kubeconfig": kubeconfig + manifest: deployment.manifest + } +} diff --git a/docs/learn/tests/kube-kind/deployment/manifest.cue b/docs/learn/tests/kube-kind/deployment/input.cue similarity index 100% rename from docs/learn/tests/kube-kind/deployment/manifest.cue rename to docs/learn/tests/kube-kind/deployment/input.cue From 5fcaaa6cfe4b3eaee6479643baee6b2eeab43a8e Mon Sep 17 00:00:00 2001 From: Tom Chauveau Date: Mon, 16 Aug 2021 16:34:07 +0200 Subject: [PATCH 14/24] Add test for kube-aws basic & deployment Signed-off-by: Tom Chauveau --- docs/learn/1007-kubernetes.md | 111 +----------------- .../.dagger/env/kube-aws-basic/.gitignore | 2 + .../.dagger/env/kube-aws-basic/values.yaml | 32 +++++ .../env/kube-aws-deployment/.gitignore | 2 + .../env/kube-aws-deployment/values.yaml | 32 +++++ docs/learn/tests/doc.bats | 24 +++- docs/learn/tests/kube-aws/basic/config.cue | 18 +++ docs/learn/tests/kube-aws/basic/input.cue | 11 ++ docs/learn/tests/kube-aws/basic/test/test.cue | 66 +++++++++++ docs/learn/tests/kube-aws/basic/todoapp.cue | 16 +++ .../tests/kube-aws/deployment/config.cue | 25 ++++ .../learn/tests/kube-aws/deployment/input.cue | 19 +++ .../tests/kube-aws/deployment/test/test.cue | 66 +++++++++++ .../tests/kube-aws/deployment/todoapp.cue | 60 ++++++++++ 14 files changed, 376 insertions(+), 108 deletions(-) create mode 100644 docs/learn/tests/.dagger/env/kube-aws-basic/.gitignore create mode 100644 docs/learn/tests/.dagger/env/kube-aws-basic/values.yaml create mode 100644 docs/learn/tests/.dagger/env/kube-aws-deployment/.gitignore create mode 100644 docs/learn/tests/.dagger/env/kube-aws-deployment/values.yaml create mode 100644 docs/learn/tests/kube-aws/basic/config.cue create mode 100644 docs/learn/tests/kube-aws/basic/input.cue create mode 100644 docs/learn/tests/kube-aws/basic/test/test.cue create mode 100644 docs/learn/tests/kube-aws/basic/todoapp.cue create mode 100644 docs/learn/tests/kube-aws/deployment/config.cue create mode 100644 docs/learn/tests/kube-aws/deployment/input.cue create mode 100644 docs/learn/tests/kube-aws/deployment/test/test.cue create mode 100644 docs/learn/tests/kube-aws/deployment/todoapp.cue diff --git a/docs/learn/1007-kubernetes.md b/docs/learn/1007-kubernetes.md index 46edd96c..9343c123 100644 --- a/docs/learn/1007-kubernetes.md +++ b/docs/learn/1007-kubernetes.md @@ -223,25 +223,7 @@ The below `config.cue` defines: - `eksConfig`, transform a `awsConfig` to a readable format for `kubernetes.#Resources.kubeconfig` using `alpha.dagger.io/aws/eks` -```cue title="todoapp/kube/config.cue" -package main - -import ( - "alpha.dagger.io/aws" - "alpha.dagger.io/aws/eks" -) - -// Value created for generic reference of `kubeconfig` in `todoapp.cue` -kubeconfig: eksConfig.kubeconfig - -// awsConfig for Amazon connection -awsConfig: aws.#Config - -// eksConfig used for deployment -eksConfig: eks.#KubeConfig & { - // config field references `gkeConfig` value to set in once - config: awsConfig -} +```cue file=tests/kube-aws/basic/config.cue title="todoapp/kube/config.cue" ``` @@ -448,7 +430,7 @@ The two files have to be edited to do so. `kube/config.cue` configuration has following change: -- definition of a new `ecrCreds` value that contains ecr credentials for remote image push to GCR +- definition of a new `gcrCreds` value that contains ecr credentials for remote image push to GCR ```cue title="todoapp/kube/config.cue" package main @@ -562,32 +544,7 @@ The two files have to be edited to do so. - definition of a new `ecrCreds` value that contains ecr credentials for remote image push to ECR -```cue title="todoapp/kube/config.cue" -package main - -import ( - "alpha.dagger.io/aws" - "alpha.dagger.io/aws/eks" - "alpha.dagger.io/aws/ecr" -) - -// Value created for generic reference of `kubeconfig` in `todoapp.cue` -kubeconfig: eksConfig.kubeconfig - -// awsConfig for Amazon connection -awsConfig: aws.#Config - -// eksConfig used for deployment -eksConfig: eks.#KubeConfig & { - // config field references `awsConfig` value to set in once - config: awsConfig -} - -// ecrCreds used for remote image push -ecrCreds: ecr.#Credentials & { - // config field references `awsConfig` value to set in once - config: awsConfig -} +```cue file=tests/kube-aws/deployment/config.cue title="todoapp/kube/config.cue" ``` `kube/todoapp.cue`, on the other hand, faces these changes: @@ -598,67 +555,7 @@ ecrCreds: ecr.#Credentials & { - `remoteImage`, push an image to the registry - `kustomization`, apply kustomization to image -```cue title="todoapp/kube/todoapp.cue" -package main - -import ( - "encoding/yaml" - - "alpha.dagger.io/dagger" - "alpha.dagger.io/docker" - "alpha.dagger.io/kubernetes" - "alpha.dagger.io/kubernetes/kustomize" -) - -// input: source code repository, must contain a Dockerfile -// set with `dagger input dir repository . -e kube` -repository: dagger.#Artifact & dagger.#Input - -// ECR registry to push images to -registry: string & dagger.#Input -tag: "test-ecr" - -// source of Kube config file. -// set with `dagger input dir manifest ./k8s -e kube` -manifest: dagger.#Artifact & dagger.#Input - -todoApp: { - // Build an image from the project repository - image: docker.#Build & { - source: repository - } - - // Push the image to a remote registry - remoteImage: docker.#Push & { - target: "\(registry):\(tag)" - source: image - auth: { - username: ecrCreds.username - secret: ecrCreds.secret - } - } - - // Update the image of the deployment to the deployed image - kustomization: kustomize.#Kustomize & { - source: manifest - - // Convert CUE to YAML. - kustomization: yaml.Marshal({ - resources: ["deployment.yaml", "service.yaml"] - - images: [{ - name: "public.ecr.aws/j7f8d3t2/todoapp" - newName: remoteImage.ref - }] - }) - } - - // Value created for generic reference of `kubeconfig` in `todoapp.cue` - kubeSrc: kubernetes.#Resources & { - "kubeconfig": kubeconfig - source: kustomization - } -} +```cue file=tests/kube-aws/deployment/todoapp.cue title="todoapp/kube/todoapp.cue" ``` diff --git a/docs/learn/tests/.dagger/env/kube-aws-basic/.gitignore b/docs/learn/tests/.dagger/env/kube-aws-basic/.gitignore new file mode 100644 index 00000000..01ec19b0 --- /dev/null +++ b/docs/learn/tests/.dagger/env/kube-aws-basic/.gitignore @@ -0,0 +1,2 @@ +# dagger state +state/** diff --git a/docs/learn/tests/.dagger/env/kube-aws-basic/values.yaml b/docs/learn/tests/.dagger/env/kube-aws-basic/values.yaml new file mode 100644 index 00000000..ba31f0f1 --- /dev/null +++ b/docs/learn/tests/.dagger/env/kube-aws-basic/values.yaml @@ -0,0 +1,32 @@ +plan: + package: ./kube-aws/basic/test +name: kube-aws-basic +inputs: + awsConfig.accessKey: + secret: ENC[AES256_GCM,data:aUxhaAdN44fGz2kKHIl3mdx1vIk=,iv:jgTqZiAwxAtzSjD+IOgjm2rxz43dqtRTcIEuKL3jUDo=,tag:SNU6auwJ/WcXsCc/mrc8sg==,type:str] + awsConfig.region: + text: us-east-2 + awsConfig.secretKey: + secret: ENC[AES256_GCM,data:MAZ/xqZc6kuFO/7EA+degCQ7W7VaJXqseq1+etNSvVNVa+oiPNSnaw==,iv:yGyCKY8S6rwk2EQ7ba3BqirnNyfCtKX+z8EBfLx0WLY=,tag:pOqco/DzRa+lY4LNYmuwYw==,type:str] + eksConfig.clusterName: + text: dagger-example-eks-cluster +sops: + kms: [] + gcp_kms: [] + azure_kv: [] + hc_vault: [] + age: + - recipient: age1gxwmtwahzwdmrskhf90ppwlnze30lgpm056kuesrxzeuyclrwvpsupwtpk + enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBJZmFKRXhBZmQveFcvcEVH + UmhRS2g0WEdFNFFkZXlLaTZiUHlXSy9IcXdrCmNsTG1pTFVrSDh2NmlpeU1Xa0ZL + aWFMdU1HNytDWUlMK05RMlpIdmtOTDAKLS0tIGpYbUZ6UnBGYzR2SmlOZnE0cWtF + M2loUUEvOGJaRmltTTFmdWduaFMvTkUKtBy9ogOnVqqnoV8A4EBU6j2XPljp9jEz + 25UHK3ecw2SZvKG1u0UcVL0E2KAwUTPzoPJrzRaRKXkSPI8ZXn+OGg== + -----END AGE ENCRYPTED FILE----- + lastmodified: "2021-08-16T13:31:31Z" + mac: ENC[AES256_GCM,data:9G4o5dpnI0FVvNPz4MbyeNMmop3Umuf5xDrm/JDqfvaFRS2DNVABkczu53y7oPcnlwVWzxdF0Jrul7AizWNCKmw8/NAsPaK9w/6Rff8HnZ2NjoM9rAux8pB5n1GLBjXCMsKcmh1LVmUjzh6WvQSBiCSzzKusdy1UxziP8/ntQJA=,iv:auWG3QOv/ZHMhqAcrdSlZCPmxB7CgrY5IGZFIATDje8=,tag:AL2nHsEVZO/5gO7oKPHpRg==,type:str] + pgp: [] + encrypted_suffix: secret + version: 3.7.1 diff --git a/docs/learn/tests/.dagger/env/kube-aws-deployment/.gitignore b/docs/learn/tests/.dagger/env/kube-aws-deployment/.gitignore new file mode 100644 index 00000000..01ec19b0 --- /dev/null +++ b/docs/learn/tests/.dagger/env/kube-aws-deployment/.gitignore @@ -0,0 +1,2 @@ +# dagger state +state/** diff --git a/docs/learn/tests/.dagger/env/kube-aws-deployment/values.yaml b/docs/learn/tests/.dagger/env/kube-aws-deployment/values.yaml new file mode 100644 index 00000000..d0770d33 --- /dev/null +++ b/docs/learn/tests/.dagger/env/kube-aws-deployment/values.yaml @@ -0,0 +1,32 @@ +plan: + package: ./kube-aws/deployment/test +name: kube-aws-deployment +inputs: + awsConfig.accessKey: + secret: ENC[AES256_GCM,data:I+FBavqrb2l1jNTLQ9P8x/UnYds=,iv:P5YfvxSbJ1wjPHqZDKOwf2R6AWw1E08C8jLPgjyxvR4=,tag:E6zC01+AkJS+AC1GFTdJGg==,type:str] + awsConfig.region: + text: us-east-2 + awsConfig.secretKey: + secret: ENC[AES256_GCM,data:O8g4xk+xum+gw0mN7H0PYCpmX7FmdgslB8dVY4RWRvUGtHAp5AT/Jw==,iv:LmdJhlL6t7nihr7xDRRPLkd+nWMT9DbNs9pFF1+KazM=,tag:SWlmHyg4/Czn9ygUjv01yg==,type:str] + eksConfig.clusterName: + text: dagger-example-eks-cluster +sops: + kms: [] + gcp_kms: [] + azure_kv: [] + hc_vault: [] + age: + - recipient: age1gxwmtwahzwdmrskhf90ppwlnze30lgpm056kuesrxzeuyclrwvpsupwtpk + enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBsU0N2bmpTZjh4TjBwRDNP + OG5oM29zZmlhdkV0cWhhbVJZaEdod2hPZTJBCnhoYW9wTnI5ajZSaVcxdVNPSGNT + Q2VvWXZKU0xoZmk4QXJVL011K2t0dU0KLS0tIDVSV001dnhEYkZPSXl5ZFFCb3dC + a2VtRXR0NVZaTWRQSUVWTFdEWUdtazgKhbfhOHL1tdpMiUNgZYUuXo2A8ly54WuE + FJAIoRTFV6Ls5rlW2oI9Ocw+8MdUr/Lbzqtm9ihPEXveOHYE/oZUDA== + -----END AGE ENCRYPTED FILE----- + lastmodified: "2021-08-16T13:55:15Z" + mac: ENC[AES256_GCM,data:Jlpb72VuYUKvFuCKJRjuNMVxVNCA81EosFpJhheluYcbrO022MMq3rbGdaMRim96N8i0Ux1gMVM/bHumRvJ963DF0i2PGurfaV0QnJiEnu9hBYmNmeL0MV3Qx+ds0+RuoM6gyMgLU4rU/hUZBfVIJqdsvZ5KAUkyQnzgyeQ9ZII=,iv:Jq/ksjU0RKeZnoJruaBkQCR+L1JDRuCTCxf8sNAKVnQ=,tag:RxSXxeCOMIYjdiQXVgaG0g==,type:str] + pgp: [] + encrypted_suffix: secret + version: 3.7.1 diff --git a/docs/learn/tests/doc.bats b/docs/learn/tests/doc.bats index fbebeb08..6ec13d77 100644 --- a/docs/learn/tests/doc.bats +++ b/docs/learn/tests/doc.bats @@ -80,7 +80,7 @@ setup() { skip_unless_local_kube #################### BASIC #################### - # Copy deployment to sendbox + # Copy deployment to sandbox copy_to_sandbox kube-kind-basic kube-kind # Add kubeconfig @@ -94,8 +94,10 @@ setup() { # Clean kubectl delete deployments --all + kubectl delete services --all #################### DEPLOYMENT #################### + # Copy deployment to sandbox copy_to_sandbox kube-kind-deployment kube-kind # Add kubeconfig @@ -109,8 +111,10 @@ setup() { # Clean kubectl delete deployments --all + kubectl delete services --all #################### CUE MANIFEST #################### + # Copy deployment to sandbox copy_to_sandbox kube-kind-cue-manifest kube-kind # Add kubeconfig @@ -124,6 +128,24 @@ setup() { # Clean kubectl delete deployments --all + kubectl delete services --all +} + +@test "doc-1007-kube-aws" { + #################### BASIC #################### + # Copy deployment to sandbox + copy_to_sandbox kube-aws-basic kube-aws + + # Up deployment + dagger -w "$DAGGER_SANDBOX" -e kube-aws-basic up + + #################### DEPLOYMENT #################### + # Copy deployment to sandbox + copy_to_sandbox kube-aws-deployment kube-aws + + # Up deployment + dagger -w "$DAGGER_SANDBOX" -e kube-aws-deployment up + #################### CUE MANIFEST #################### } @test "doc-1008-aws-cloudformation" { diff --git a/docs/learn/tests/kube-aws/basic/config.cue b/docs/learn/tests/kube-aws/basic/config.cue new file mode 100644 index 00000000..e927e6fe --- /dev/null +++ b/docs/learn/tests/kube-aws/basic/config.cue @@ -0,0 +1,18 @@ +package main + +import ( + "alpha.dagger.io/aws" + "alpha.dagger.io/aws/eks" +) + +// Value created for generic reference of `kubeconfig` in `todoapp.cue` +kubeconfig: eksConfig.kubeconfig + +// awsConfig for Amazon connection +awsConfig: aws.#Config + +// eksConfig used for deployment +eksConfig: eks.#KubeConfig & { + // config field references `gkeConfig` value to set in once + config: awsConfig +} diff --git a/docs/learn/tests/kube-aws/basic/input.cue b/docs/learn/tests/kube-aws/basic/input.cue new file mode 100644 index 00000000..95c4430a --- /dev/null +++ b/docs/learn/tests/kube-aws/basic/input.cue @@ -0,0 +1,11 @@ +package main + +import ( + "alpha.dagger.io/git" +) + +manifest: git.#Repository & { + remote: "https://github.com/dagger/examples.git" + ref: "main" + subdir: "todoapp/k8s" +} diff --git a/docs/learn/tests/kube-aws/basic/test/test.cue b/docs/learn/tests/kube-aws/basic/test/test.cue new file mode 100644 index 00000000..7e5fcecb --- /dev/null +++ b/docs/learn/tests/kube-aws/basic/test/test.cue @@ -0,0 +1,66 @@ +package main + +import ( + "alpha.dagger.io/dagger/op" + "alpha.dagger.io/kubernetes" +) + +TestEks: { + #_GetDeployment: """ + kubectl describe deployment todoapp | grep 'True' + """ + + #_DeleteDeployment: """ + kubectl delete deployment todoapp + kubectl delete service todoapp-service + """ + + #up: [ + op.#Load & { + from: kubernetes.#Kubectl + }, + + op.#WriteFile & { + dest: "/kubeconfig" + content: todoApp.kubeconfig + }, + + op.#WriteFile & { + dest: "/getPods.sh" + content: #_GetDeployment + }, + + op.#WriteFile & { + dest: "/deletePods.sh" + content: #_DeleteDeployment + }, + + // Get pods + op.#Exec & { + always: true + args: [ + "/bin/bash", + "--noprofile", + "--norc", + "-eo", + "pipefail", + "/getPods.sh", + ] + env: KUBECONFIG: "/kubeconfig" + }, + + // Delete pods + op.#Exec & { + always: true + args: [ + "/bin/bash", + "--noprofile", + "--norc", + "-eo", + "pipefail", + "/deletePods.sh", + ] + env: KUBECONFIG: "/kubeconfig" + }, + ] +} diff --git a/docs/learn/tests/kube-aws/basic/todoapp.cue b/docs/learn/tests/kube-aws/basic/todoapp.cue new file mode 100644 index 00000000..878f3f85 --- /dev/null +++ b/docs/learn/tests/kube-aws/basic/todoapp.cue @@ -0,0 +1,16 @@ +package main + +import ( + "alpha.dagger.io/dagger" + "alpha.dagger.io/kubernetes" +) + +// input: kubernetes objects directory to deploy to +// set with `dagger input dir manifest ./k8s -e kube` +manifest: dagger.#Artifact & dagger.#Input + +// Deploy the manifest to a kubernetes cluster +todoApp: kubernetes.#Resources & { + "kubeconfig": kubeconfig + source: manifest +} diff --git a/docs/learn/tests/kube-aws/deployment/config.cue b/docs/learn/tests/kube-aws/deployment/config.cue new file mode 100644 index 00000000..568ad9eb --- /dev/null +++ b/docs/learn/tests/kube-aws/deployment/config.cue @@ -0,0 +1,25 @@ +package main + +import ( + "alpha.dagger.io/aws" + "alpha.dagger.io/aws/eks" + "alpha.dagger.io/aws/ecr" +) + +// Value created for generic reference of `kubeconfig` in `todoapp.cue` +kubeconfig: eksConfig.kubeconfig + +// awsConfig for Amazon connection +awsConfig: aws.#Config + +// eksConfig used for deployment +eksConfig: eks.#KubeConfig & { + // config field references `awsConfig` value to set in once + config: awsConfig +} + +// ecrCreds used for remote image push +ecrCreds: ecr.#Credentials & { + // config field references `awsConfig` value to set in once + config: awsConfig +} diff --git a/docs/learn/tests/kube-aws/deployment/input.cue b/docs/learn/tests/kube-aws/deployment/input.cue new file mode 100644 index 00000000..2fb57750 --- /dev/null +++ b/docs/learn/tests/kube-aws/deployment/input.cue @@ -0,0 +1,19 @@ +package main + +import ( + "alpha.dagger.io/git" +) + +manifest: git.#Repository & { + remote: "https://github.com/dagger/examples.git" + ref: "main" + subdir: "todoapp/k8s" +} + +repository: git.#Repository & { + remote: "https://github.com/dagger/examples.git" + ref: "main" + subdir: "todoapp" +} + +registry: "125635003186.dkr.ecr.\(awsConfig.region).amazonaws.com/dagger-ci" diff --git a/docs/learn/tests/kube-aws/deployment/test/test.cue b/docs/learn/tests/kube-aws/deployment/test/test.cue new file mode 100644 index 00000000..7e5fcecb --- /dev/null +++ b/docs/learn/tests/kube-aws/deployment/test/test.cue @@ -0,0 +1,66 @@ +package main + +import ( + "alpha.dagger.io/dagger/op" + "alpha.dagger.io/kubernetes" +) + +TestEks: { + #_GetDeployment: """ + kubectl describe deployment todoapp | grep 'True' + """ + + #_DeleteDeployment: """ + kubectl delete deployment todoapp + kubectl delete service todoapp-service + """ + + #up: [ + op.#Load & { + from: kubernetes.#Kubectl + }, + + op.#WriteFile & { + dest: "/kubeconfig" + content: todoApp.kubeconfig + }, + + op.#WriteFile & { + dest: "/getPods.sh" + content: #_GetDeployment + }, + + op.#WriteFile & { + dest: "/deletePods.sh" + content: #_DeleteDeployment + }, + + // Get pods + op.#Exec & { + always: true + args: [ + "/bin/bash", + "--noprofile", + "--norc", + "-eo", + "pipefail", + "/getPods.sh", + ] + env: KUBECONFIG: "/kubeconfig" + }, + + // Delete pods + op.#Exec & { + always: true + args: [ + "/bin/bash", + "--noprofile", + "--norc", + "-eo", + "pipefail", + "/deletePods.sh", + ] + env: KUBECONFIG: "/kubeconfig" + }, + ] +} diff --git a/docs/learn/tests/kube-aws/deployment/todoapp.cue b/docs/learn/tests/kube-aws/deployment/todoapp.cue new file mode 100644 index 00000000..52e4770c --- /dev/null +++ b/docs/learn/tests/kube-aws/deployment/todoapp.cue @@ -0,0 +1,60 @@ +package main + +import ( + "encoding/yaml" + + "alpha.dagger.io/dagger" + "alpha.dagger.io/docker" + "alpha.dagger.io/kubernetes" + "alpha.dagger.io/kubernetes/kustomize" +) + +// input: source code repository, must contain a Dockerfile +// set with `dagger input dir repository . -e kube` +repository: dagger.#Artifact & dagger.#Input + +// ECR registry to push images to +registry: string & dagger.#Input +tag: "test-ecr" + +// source of Kube config file. +// set with `dagger input dir manifest ./k8s -e kube` +manifest: dagger.#Artifact & dagger.#Input + +todoApp: { + // Build an image from the project repository + image: docker.#Build & { + source: repository + } + + // Push the image to a remote registry + remoteImage: docker.#Push & { + target: "\(registry):\(tag)" + source: image + auth: { + username: ecrCreds.username + secret: ecrCreds.secret + } + } + + // Update the image of the deployment to the deployed image + kustomization: kustomize.#Kustomize & { + source: manifest + + // Convert CUE to YAML. + kustomization: yaml.Marshal({ + resources: ["deployment.yaml", "service.yaml"] + + images: [{ + name: "public.ecr.aws/j7f8d3t2/todoapp" + newName: remoteImage.ref + }] + }) + } + + // Value created for generic reference of `kubeconfig` in `todoapp.cue` + kubeSrc: kubernetes.#Resources & { + "kubeconfig": kubeconfig + source: kustomization + } +} From f24af776dbe2e69a3134d4463524994319f91b9f Mon Sep 17 00:00:00 2001 From: Tom Chauveau Date: Mon, 16 Aug 2021 23:38:47 +0200 Subject: [PATCH 15/24] Add test for kube-aws cue-manifest part Signed-off-by: Tom Chauveau --- docs/learn/1007-kubernetes.md | 47 +------------ .../env/kube-aws-cue-manifest/.gitignore | 2 + .../env/kube-aws-cue-manifest/values.yaml | 32 +++++++++ docs/learn/tests/doc.bats | 5 ++ .../tests/kube-aws/cue-manifest/config.cue | 25 +++++++ .../kube-aws/cue-manifest/deployment.cue | 43 ++++++++++++ .../tests/kube-aws/cue-manifest/input.cue | 13 ++++ .../tests/kube-aws/cue-manifest/manifest.cue | 29 ++++++++ .../tests/kube-aws/cue-manifest/service.cue | 36 ++++++++++ .../tests/kube-aws/cue-manifest/test/test.cue | 66 +++++++++++++++++++ .../tests/kube-aws/cue-manifest/todoapp.cue | 45 +++++++++++++ .../tests/kube-aws/deployment/test/test.cue | 2 +- 12 files changed, 298 insertions(+), 47 deletions(-) create mode 100644 docs/learn/tests/.dagger/env/kube-aws-cue-manifest/.gitignore create mode 100644 docs/learn/tests/.dagger/env/kube-aws-cue-manifest/values.yaml create mode 100644 docs/learn/tests/kube-aws/cue-manifest/config.cue create mode 100644 docs/learn/tests/kube-aws/cue-manifest/deployment.cue create mode 100644 docs/learn/tests/kube-aws/cue-manifest/input.cue create mode 100644 docs/learn/tests/kube-aws/cue-manifest/manifest.cue create mode 100644 docs/learn/tests/kube-aws/cue-manifest/service.cue create mode 100644 docs/learn/tests/kube-aws/cue-manifest/test/test.cue create mode 100644 docs/learn/tests/kube-aws/cue-manifest/todoapp.cue diff --git a/docs/learn/1007-kubernetes.md b/docs/learn/1007-kubernetes.md index 9343c123..ae30ac8e 100644 --- a/docs/learn/1007-kubernetes.md +++ b/docs/learn/1007-kubernetes.md @@ -749,52 +749,7 @@ todoApp: { -```cue title="todoapp/kube/todoapp.cue" -package main - -import ( - "alpha.dagger.io/dagger" - "alpha.dagger.io/docker" - "alpha.dagger.io/kubernetes" -) - -// input: source code repository, must contain a Dockerfile -// set with `dagger input dir repository . -e kube` -repository: dagger.#Artifact & dagger.#Input - -// ECR registry to push images to -registry: string & dagger.#Input -tag: "test-ecr" - -// Todoapp deployment pipeline -todoApp: { - // Build the image from repositoru artifact - image: docker.#Build & { - source: repository - } - - // Push image to registry - remoteImage: docker.#Push & { - target: "\(registry):\(tag)" - source: image - auth: { - username: ecrCreds.username - secret: ecrCreds.secret - } - } - - // Generate deployment manifest - deployment: #AppManifest & { - name: "todoapp" - image: remoteImage.ref - } - - // Deploy the customized manifest to a kubernetes cluster - kubeSrc: kubernetes.#Resources & { - "kubeconfig": kubeconfig - manifest: deployment.manifest - } -} +```cue file=tests/kube-aws/cue-manifest/todoapp.cue title="todoapp/kube/todoapp.cue" ``` diff --git a/docs/learn/tests/.dagger/env/kube-aws-cue-manifest/.gitignore b/docs/learn/tests/.dagger/env/kube-aws-cue-manifest/.gitignore new file mode 100644 index 00000000..01ec19b0 --- /dev/null +++ b/docs/learn/tests/.dagger/env/kube-aws-cue-manifest/.gitignore @@ -0,0 +1,2 @@ +# dagger state +state/** diff --git a/docs/learn/tests/.dagger/env/kube-aws-cue-manifest/values.yaml b/docs/learn/tests/.dagger/env/kube-aws-cue-manifest/values.yaml new file mode 100644 index 00000000..0c73e6d2 --- /dev/null +++ b/docs/learn/tests/.dagger/env/kube-aws-cue-manifest/values.yaml @@ -0,0 +1,32 @@ +plan: + package: ./kube-aws/cue-manifest/test +name: kube-aws-cue-manifest +inputs: + awsConfig.accessKey: + secret: ENC[AES256_GCM,data:8R6jJAqkACa/ydy52etCUA+7cWg=,iv:74nd15ckbDG3dTWL8fCMU0FGrCuBqjgIbYWq+h/UBKQ=,tag:zwZruKi+4zI2tS2F2wJ8NQ==,type:str] + awsConfig.region: + text: us-east-2 + awsConfig.secretKey: + secret: ENC[AES256_GCM,data:8FNwXL/yDFfPR9YUqKanI6CpDMl0/Ww8Pmgy4ol1n4KDpBRJAsOrZA==,iv:Y6ak40j4yXnpa8BY3BfALmlcD16DrkjcAr2hiM7cots=,tag:69qocIvAajjdQUpl1M1jXw==,type:str] + eksConfig.clusterName: + text: dagger-example-eks-cluster +sops: + kms: [] + gcp_kms: [] + azure_kv: [] + hc_vault: [] + age: + - recipient: age1gxwmtwahzwdmrskhf90ppwlnze30lgpm056kuesrxzeuyclrwvpsupwtpk + enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBKTXl1TDJ3cituU3NicnFR + Tm0wTjducEdPL0FyWHBqcmEwV01aUmNsc0RBCjlNNGIxOTZBaElMRFZ1bjh4dWc1 + REJqcy9UMkVBVnFDOHZPYkt3S1NYSU0KLS0tIGFwZVlLMGNINmZzdURDbnY1RStI + S25tM1I0ZWp1MndzNFNhcHRiQUdpME0K91dMEF9zxHjAtMEryPKiM+hMJ5OiKGPK + aWSQVu06LLBFW5txr+U55WlCGPL484xjw1/Axd3ADq0I9AjnuB3aAQ== + -----END AGE ENCRYPTED FILE----- + lastmodified: "2021-08-16T21:24:58Z" + mac: ENC[AES256_GCM,data:rVdRHU252Dsp4YTofv3v3L5k/W0d09LEENHCEFrjSnTOuibIBWi/7nVADlBBx8PEfhofHTHIEtnIg6dtVaOlIBAd9Co/wljoaU5mVGNdWuQOpN7ttGlG9BHXDR96+Gvp0hT0lY9hK3LKPBcxzzXizFGiaPGqkaPfj8Sxg42eqMA=,iv:76wENP19U76rW24A0QNLue2cZnWosMieveUqHyLFSpo=,tag:pAvNkVcFYIed3Q/ldMcYyg==,type:str] + pgp: [] + encrypted_suffix: secret + version: 3.7.1 diff --git a/docs/learn/tests/doc.bats b/docs/learn/tests/doc.bats index 6ec13d77..4078eb99 100644 --- a/docs/learn/tests/doc.bats +++ b/docs/learn/tests/doc.bats @@ -146,6 +146,11 @@ setup() { # Up deployment dagger -w "$DAGGER_SANDBOX" -e kube-aws-deployment up #################### CUE MANIFEST #################### + # Copy deployment to sandbox + copy_to_sandbox kube-aws-cue-manifest kube-aws + + # Up deployment + dagger -w "$DAGGER_SANDBOX" -e kube-aws-cue-manifest up } @test "doc-1008-aws-cloudformation" { diff --git a/docs/learn/tests/kube-aws/cue-manifest/config.cue b/docs/learn/tests/kube-aws/cue-manifest/config.cue new file mode 100644 index 00000000..568ad9eb --- /dev/null +++ b/docs/learn/tests/kube-aws/cue-manifest/config.cue @@ -0,0 +1,25 @@ +package main + +import ( + "alpha.dagger.io/aws" + "alpha.dagger.io/aws/eks" + "alpha.dagger.io/aws/ecr" +) + +// Value created for generic reference of `kubeconfig` in `todoapp.cue` +kubeconfig: eksConfig.kubeconfig + +// awsConfig for Amazon connection +awsConfig: aws.#Config + +// eksConfig used for deployment +eksConfig: eks.#KubeConfig & { + // config field references `awsConfig` value to set in once + config: awsConfig +} + +// ecrCreds used for remote image push +ecrCreds: ecr.#Credentials & { + // config field references `awsConfig` value to set in once + config: awsConfig +} diff --git a/docs/learn/tests/kube-aws/cue-manifest/deployment.cue b/docs/learn/tests/kube-aws/cue-manifest/deployment.cue new file mode 100644 index 00000000..88d7b800 --- /dev/null +++ b/docs/learn/tests/kube-aws/cue-manifest/deployment.cue @@ -0,0 +1,43 @@ +package main + +// Deployment template containing all the common boilerplate shared by +// deployments of this application. +#Deployment: { + // Name of the deployment. This will be used to label resources automatically + // and generate selectors. + name: string + + // Container image. + image: string + + // 80 is the default port. + port: *80 | int + + // 1 is the default, but we allow any number. + replicas: *1 | int + + // Deployment manifest. Uses the name, image, port and replicas above to + // generate the resource manifest. + manifest: { + apiVersion: "apps/v1" + kind: "Deployment" + metadata: { + "name": name + labels: app: name + } + spec: { + "replicas": replicas + selector: matchLabels: app: name + template: { + metadata: labels: app: name + spec: containers: [{ + "name": name + "image": image + ports: [{ + containerPort: port + }] + }] + } + } + } +} diff --git a/docs/learn/tests/kube-aws/cue-manifest/input.cue b/docs/learn/tests/kube-aws/cue-manifest/input.cue new file mode 100644 index 00000000..1e21ec3d --- /dev/null +++ b/docs/learn/tests/kube-aws/cue-manifest/input.cue @@ -0,0 +1,13 @@ +package main + +import ( + "alpha.dagger.io/git" +) + +repository: git.#Repository & { + remote: "https://github.com/dagger/examples.git" + ref: "main" + subdir: "todoapp" +} + +registry: "125635003186.dkr.ecr.\(awsConfig.region).amazonaws.com/dagger-ci" diff --git a/docs/learn/tests/kube-aws/cue-manifest/manifest.cue b/docs/learn/tests/kube-aws/cue-manifest/manifest.cue new file mode 100644 index 00000000..df4ff0d9 --- /dev/null +++ b/docs/learn/tests/kube-aws/cue-manifest/manifest.cue @@ -0,0 +1,29 @@ +package main + +import ( + "encoding/yaml" +) + +// Define and generate kubernetes deployment to deploy to kubernetes cluster +#AppManifest: { + // Name of the application + name: string + + // Image to deploy to + image: string + + // Define a kubernetes deployment object + deployment: #Deployment & { + "name": name + "image": image + } + + // Define a kubernetes service object + service: #Service & { + "name": name + ports: http: deployment.port + } + + // Merge definitions and convert them back from CUE to YAML + manifest: yaml.MarshalStream([deployment.manifest, service.manifest]) +} diff --git a/docs/learn/tests/kube-aws/cue-manifest/service.cue b/docs/learn/tests/kube-aws/cue-manifest/service.cue new file mode 100644 index 00000000..8c5dc957 --- /dev/null +++ b/docs/learn/tests/kube-aws/cue-manifest/service.cue @@ -0,0 +1,36 @@ +package main + +// Service template containing all the common boilerplate shared by +// services of this application. +#Service: { + // Name of the service. This will be used to label resources automatically + // and generate selector. + name: string + + // NodePort is the default service type. + type: *"NodePort" | "LoadBalancer" | "ClusterIP" | "ExternalName" + + // Ports where the service should listen + ports: [string]: number + + // Service manifest. Uses the name, type and ports above to + // generate the resource manifest. + manifest: { + apiVersion: "v1" + kind: "Service" + metadata: { + "name": "\(name)-service" + labels: app: name + } + spec: { + "type": type + "ports": [ + for k, v in ports { + name: k + port: v + }, + ] + selector: app: name + } + } +} diff --git a/docs/learn/tests/kube-aws/cue-manifest/test/test.cue b/docs/learn/tests/kube-aws/cue-manifest/test/test.cue new file mode 100644 index 00000000..82f2fb40 --- /dev/null +++ b/docs/learn/tests/kube-aws/cue-manifest/test/test.cue @@ -0,0 +1,66 @@ +package main + +import ( + "alpha.dagger.io/dagger/op" + "alpha.dagger.io/kubernetes" +) + +TestEks: { + #_GetDeployment: """ + kubectl describe deployment todoapp | grep 'True' + """ + + #_DeleteDeployment: """ + kubectl delete deployment todoapp + kubectl delete service todoapp-service + """ + + #up: [ + op.#Load & { + from: kubernetes.#Kubectl + }, + + op.#WriteFile & { + dest: "/kubeconfig" + content: todoApp.kubeSrc.kubeconfig + }, + + op.#WriteFile & { + dest: "/getPods.sh" + content: #_GetDeployment + }, + + op.#WriteFile & { + dest: "/deletePods.sh" + content: #_DeleteDeployment + }, + + // Get pods + op.#Exec & { + always: true + args: [ + "/bin/bash", + "--noprofile", + "--norc", + "-eo", + "pipefail", + "/getPods.sh", + ] + env: KUBECONFIG: "/kubeconfig" + }, + + // Delete pods + op.#Exec & { + always: true + args: [ + "/bin/bash", + "--noprofile", + "--norc", + "-eo", + "pipefail", + "/deletePods.sh", + ] + env: KUBECONFIG: "/kubeconfig" + }, + ] +} diff --git a/docs/learn/tests/kube-aws/cue-manifest/todoapp.cue b/docs/learn/tests/kube-aws/cue-manifest/todoapp.cue new file mode 100644 index 00000000..acd1b847 --- /dev/null +++ b/docs/learn/tests/kube-aws/cue-manifest/todoapp.cue @@ -0,0 +1,45 @@ +package main + +import ( + "alpha.dagger.io/dagger" + "alpha.dagger.io/docker" + "alpha.dagger.io/kubernetes" +) + +// input: source code repository, must contain a Dockerfile +// set with `dagger input dir repository . -e kube` +repository: dagger.#Artifact & dagger.#Input + +// ECR registry to push images to +registry: string & dagger.#Input +tag: "test-ecr" + +// Todoapp deployment pipeline +todoApp: { + // Build the image from repositoru artifact + image: docker.#Build & { + source: repository + } + + // Push image to registry + remoteImage: docker.#Push & { + target: "\(registry):\(tag)" + source: image + auth: { + username: ecrCreds.username + secret: ecrCreds.secret + } + } + + // Generate deployment manifest + deployment: #AppManifest & { + name: "todoapp" + image: remoteImage.ref + } + + // Deploy the customized manifest to a kubernetes cluster + kubeSrc: kubernetes.#Resources & { + "kubeconfig": kubeconfig + manifest: deployment.manifest + } +} diff --git a/docs/learn/tests/kube-aws/deployment/test/test.cue b/docs/learn/tests/kube-aws/deployment/test/test.cue index 7e5fcecb..82f2fb40 100644 --- a/docs/learn/tests/kube-aws/deployment/test/test.cue +++ b/docs/learn/tests/kube-aws/deployment/test/test.cue @@ -22,7 +22,7 @@ TestEks: { op.#WriteFile & { dest: "/kubeconfig" - content: todoApp.kubeconfig + content: todoApp.kubeSrc.kubeconfig }, op.#WriteFile & { From 2a15682386a280bb4ec8a62f7932d3e3bed40ca1 Mon Sep 17 00:00:00 2001 From: Tom Chauveau Date: Mon, 16 Aug 2021 23:53:35 +0200 Subject: [PATCH 16/24] Add test for kube-gcp basic step Signed-off-by: Tom Chauveau --- docs/learn/1007-kubernetes.md | 20 +----- .../.dagger/env/kube-gcp-basic/.gitignore | 2 + .../.dagger/env/kube-gcp-basic/values.yaml | 32 +++++++++ docs/learn/tests/doc.bats | 9 +++ docs/learn/tests/kube-gcp/basic/config.cue | 18 +++++ docs/learn/tests/kube-gcp/basic/input.cue | 11 ++++ docs/learn/tests/kube-gcp/basic/test/test.cue | 66 +++++++++++++++++++ docs/learn/tests/kube-gcp/basic/todoapp.cue | 16 +++++ 8 files changed, 155 insertions(+), 19 deletions(-) create mode 100644 docs/learn/tests/.dagger/env/kube-gcp-basic/.gitignore create mode 100644 docs/learn/tests/.dagger/env/kube-gcp-basic/values.yaml create mode 100644 docs/learn/tests/kube-gcp/basic/config.cue create mode 100644 docs/learn/tests/kube-gcp/basic/input.cue create mode 100644 docs/learn/tests/kube-gcp/basic/test/test.cue create mode 100644 docs/learn/tests/kube-gcp/basic/todoapp.cue diff --git a/docs/learn/1007-kubernetes.md b/docs/learn/1007-kubernetes.md index ae30ac8e..23295059 100644 --- a/docs/learn/1007-kubernetes.md +++ b/docs/learn/1007-kubernetes.md @@ -191,25 +191,7 @@ The below `config.cue` defines: - `gkeConfig`: transform a `gcpConfig` to a readable format for `kubernetes.#Resources.kubeconfig` using `alpha.dagger.io/gcp/gke` -```cue title="todoapp/kube/config.cue" -package main - -import ( - "alpha.dagger.io/gcp" - "alpha.dagger.io/gcp/gke" -) - -// Value created for generic reference of `kubeconfig` in `todoapp.cue` -kubeconfig: gkeConfig.kubeconfig - -// gcpConfig used for Google connection -gcpConfig: gcp.#Config - -// gkeConfig used for deployment -gkeConfig: gke.#KubeConfig & { - // config field references `gkeConfig` value to set in once - config: gcpConfig -} +```cue file=tests/kube-gcp/basic/config.cue title="todoapp/kube/config.cue" ``` diff --git a/docs/learn/tests/.dagger/env/kube-gcp-basic/.gitignore b/docs/learn/tests/.dagger/env/kube-gcp-basic/.gitignore new file mode 100644 index 00000000..01ec19b0 --- /dev/null +++ b/docs/learn/tests/.dagger/env/kube-gcp-basic/.gitignore @@ -0,0 +1,2 @@ +# dagger state +state/** diff --git a/docs/learn/tests/.dagger/env/kube-gcp-basic/values.yaml b/docs/learn/tests/.dagger/env/kube-gcp-basic/values.yaml new file mode 100644 index 00000000..8ba6f9c3 --- /dev/null +++ b/docs/learn/tests/.dagger/env/kube-gcp-basic/values.yaml @@ -0,0 +1,32 @@ +plan: + package: ./kube-gcp/basic/test +name: kube-gcp-basic +inputs: + gcpConfig.project: + text: dagger-ci + gcpConfig.region: + text: us-west2-a + gcpConfig.serviceKey: + secret: ENC[AES256_GCM,data:kwplJvCrAGhmGckG0ZBVXb+C2T9LFN+Nxd7EbFJIEOUtkslxTC5CungmJBSM57lQ7ATQZOzSwxt3tHffqinCPMoOsZEfqeOptp3K9bgBuOm5VW89U/dpIES3CEueGOZemlgj30QrDBcOwdRGFU5BySs4KLNK5jT+CTgY5T26jbX3amPTQvxye/YLKXND8PrdFCzAuMRygR4E5vqsE2Xs6efwyivT6GAulA6Ny6BfhZQlPplOsPP5f53B8yLU8CfuE6TLhafyY+jyatL3a8qGrRPuv6WGbQO0flP4KtYvnzbY09by4ysK7+9Ndy2jF+6J4MggHK/reYcCM2Pq70b03Z9RaludBeclpROBqv9qv7I+mO8CH9YBwFSdpB2p+Li5FpOzbBM/RFJG6H9KmkB0XWOu3jDIbbHQ35jk5O9hjFIf5Tq+MGDUlOOe5KB8dJtjHd93uvWA9/6T0WyWklOTLXVbNX/DnUVVDofZeG5vTIvKZ4faPE3/1QWqJmNn2V3cm5gES7NDUQHn3fFFSyaHMjFsI3PJhpIyzXkHf8Fzqw0P1dRNPIfxMESFT9yRqhGKuL95GgIwa8VzmcvSyFjKNoUpEwMt2sPV2YNVIAx2qiI8sshAa/oN9+vFgBFarEOX/CPSDliz9gMWq3fSz9g3cSO9tuMH+Uz6bJ0hxqrLtOs9kt5Z8Tpg3A0gQ5eln0lncKtd0h5K/OgE96vq7yOLUHUVDlwyvwXbhJO2yjtqi32LuwrktesEZSJLGgk3q6qQvzvWFePI4HLTLpa/6srwYKEWW1F2ovX1yFHv3GeVqmZDJmHFe3Wl+pfXdp1JE2geUxUCxV7TMSvsiByXKhGXMpADr5yVO8VTjCIaiZHH70hF9bfWh9f8gOYNVpyt93z2q8CJ57xt+339I/2twGfukGZjQM8suGmzIzIfilDsL2fxpepjNI75j+eFzR10CEUfzir5If7lbNHUHl9sU+sKYZE1PAv3M7CRtFfawYwWXjWZgTHzMYlh/kjp6SKo8YV6mHZ0HeRj5NCug1mRoLhc14VMu8DSu3A5mKztPaD/3+a2pNeWq5KKqUn/r2KQQxiyagYmr9Iuh0PmAXEU9LKx+DjGR9SxfmAAcL4kBqhTeOsAmWgUvLKQ8tzLMMho7MfMd7s24W4lf2KleO5xyHWNA3EFp2fTpfJ/Euez8ZA7Cw0HNvnUvq91hCX+1Tyy5/TFEokc7E/m6prhRUvfGfKWSyjAzU8057rj0AZXUQ2JSYIXaHfMVXBfwjcTA0XJcS6Q0zrx8lQunZwccRHfHoioJKGzSkK2+kO7CP79KA4/n7q6mj6jpeSfIjU1azs6XIPlxdgHa+cRgVkNqy4tmVDyFk/dfsIjj7T9CxjLkOURtq1+XJ7ZM2/li50nJUHkhPJ1BzO2OUzLjdaWelQ9SBsvbsCAuSnJNufk5pspsaU+QYoT94Lcdg3Ft2aEJwL2/V4LKca4N1y+jqXEnt41XWie9/R6GSvQx7LJUqw5WsDLvIvtN5WxbYry31yuJSueHQsKS6XWsXXri10MY2pF/O4zAUB18W0GllsJTkyWow3k87MnaLZte7Avpmb9ALHKaWRy+sITObzPoBCW5N4TPkPkqR/zDJFPyrbJLs6atlicG5JkA6E86Nuw2eviOpm4zje2vnnbbKpAQflx98IZmbWRBEPL9noyg8mMbSStPpqM+hg5k2ZqTzLQQxOrflt9VAuGYFtUxjPwSGqAcVoJgEMGCCF6w38B8FF8BgSGxiv9v5RzdAUDGWl/0lOlbIyqYz2WHy30J39JRWBXJEI6mk13/bg2gr7rPwW0LtnGO7yQILN+MSlb+7cnfV3SYGuHgmFPOPeZXQKe3R1jKsWlMcD6xRTBfQ+QSqE00AMKSiqENM3bTNnHRRIzryPMqMG4zWR+coITacCH24hKdbbHgzoqfsZhGiYEaD3Bd3G93e9zImT6EDzAhf4PRisdIM9Y9R+eo+f88AEmW4bUGaYeriqz9ebGL37kIVy6zaFXGZUUO0wYL00azfRaTbowuFALvobKlxB1AnnzGl5t7aEFMBP2yyqHmkobWHMQ36qJ0phEie8G5Bx9zemShBa3v4DfFIAba2HC0sa5i2cI9HNbH7tQETQ+Dsx2xpDwTbtO0lHvfGoAwNiFOhUojMR5s51I36Kzk8Dre7tQOhs0AN2MuH72eDP4x8rwNa7l95X6/wdIc7/QpGm8y+4UqATbaZma8zHv/uzI81Usl+hqhhWwrQ0F4pt3A0F1cVvMG6+/SuNNGvo2PHlFhweyL4cFFPqpURjWK9YKCBcVkILlRZe7c6VGxUT+4ZaZ9Bjda6MX6KqDIinJwrunFdLPYPwrwu5D7QKwHWgAfFt0HyHpDmzsnNP4PcBZAx+ao61NhStx6dwFE5+B9pBYs3dWRR02R7heelXIwPTYmxBAmsHJ0FzPaisXVWc1EzmZMahk75OPoz4AN97FkhTQQll7f0gadU7pbZ/2bSCHxQYmuM9P9f7IQgsW0/UQidN0506b4RbN2bYmpF1wzzStAC2HpQuDVQMkqql82AT3OfkSXashrQUOw1ZAw7L8YdWSNjuIFiq3obMEf6579sajkP0cbl6EW0PkSrJCViXYZDdzohdXy6x/lfolaOjw6qjM76iIdnV40nz/tbBIG/fE83sMbbzbZcI6MhKxcctHXMYFn2NlNkBVZx8Q892SoHg9a+KERML/QVwABae7iGarV29dyoBv+F4mNStbE/hTDzyZw4sCoGMitimgZxxPgOkJZE8jX8i1rVEiuVj12ZdfX70Q3aH4REcsnEZU0v72RoazG2iihn0enig8OfNKNPIU4XszvYgVLj/P5Tgk+heTkyERdIfJZ4ghj7IR/KDQQRRHcXyxAIfAmqrqG5f3bQwfw9W0IhXknnP4Efx2wOO5R9VCLoXVjligmf9NMFLcMJMBEJ3fzmt0tQOS2z3B8vxHWT23gvnbb6eA1Tx5G129/0lNQ7pMEB1Uhfqt530lMpcOGZLd/s8A93EQoY3sJOM7dsvrhuNaZhJn5k2wKtp3LaIuJGc4gQBA5yclSUC9oizbiwQQzvi6iWxyLUR1ZIRh,iv:xPtOE22z61A6E3bIleBM3HJARFzTzz629K3mLiLkuuo=,tag:x+hbPzn8aowSL4o3WpHDLw==,type:str] + gkeConfig.clusterName: + text: test-cluster +sops: + kms: [] + gcp_kms: [] + azure_kv: [] + hc_vault: [] + age: + - recipient: age1gxwmtwahzwdmrskhf90ppwlnze30lgpm056kuesrxzeuyclrwvpsupwtpk + enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBlbzlrT3FBd0dmNjJROHE4 + cGFtdzdmWm00Z2d3N3RpOXp3dloyU014M1FFCml6dU1BclFxU2ZhSmdUZ0lBNEUx + TlA2UjR3dmpxZXAySTNDdmozVldxSXMKLS0tIGZNclEvQlhuL0VuL0x0SEZqMDZR + cTFrdThhbHUxSG53c0hwT2VvRE1qL1UKD4aR1Cb9+wQthHtPpj/aFh+tLsW1xWNH + ijbpYjLg6PpFwJmuuWrDylP6Mfv9Zyg35utzR5ECE0W1M9oLU3aLjg== + -----END AGE ENCRYPTED FILE----- + lastmodified: "2021-08-16T21:50:36Z" + mac: ENC[AES256_GCM,data:k0tYmkhSiMYKg9NZSTHoDx0bOtwAa4FS3vpg6/5O2oQ35xs//iCEIgvPrwdO0E+dwT8t4dyorC6WEBxNuhrs0HdIEPF6i5qqLgPOXQmZYuss8ueroEggEFbtakyLuZ8bNFLF5ym2Sr0pBJiWfJkexMS/d96m1ouV2c8Wq2sNkig=,iv:SCUwU5rR4/C5oZJg/rkkyx+2/tmWbjDZ/SsbalPxjbU=,tag:nXNnByQBXhPZXlqpfjjzFQ==,type:str] + pgp: [] + encrypted_suffix: secret + version: 3.7.1 diff --git a/docs/learn/tests/doc.bats b/docs/learn/tests/doc.bats index 4078eb99..c933872c 100644 --- a/docs/learn/tests/doc.bats +++ b/docs/learn/tests/doc.bats @@ -153,6 +153,15 @@ setup() { dagger -w "$DAGGER_SANDBOX" -e kube-aws-cue-manifest up } +@test "doc-1007-kube-gcp" { + #################### BASIC #################### + # Copy deployment to sandbox + copy_to_sandbox kube-gcp-basic kube-gcp + + # Up deployment + dagger -w "$DAGGER_SANDBOX" -e kube-gcp-basic up +} + @test "doc-1008-aws-cloudformation" { setup_example_sandbox "doc" diff --git a/docs/learn/tests/kube-gcp/basic/config.cue b/docs/learn/tests/kube-gcp/basic/config.cue new file mode 100644 index 00000000..5ed60309 --- /dev/null +++ b/docs/learn/tests/kube-gcp/basic/config.cue @@ -0,0 +1,18 @@ +package main + +import ( + "alpha.dagger.io/gcp" + "alpha.dagger.io/gcp/gke" +) + +// Value created for generic reference of `kubeconfig` in `todoapp.cue` +kubeconfig: gkeConfig.kubeconfig + +// gcpConfig used for Google connection +gcpConfig: gcp.#Config + +// gkeConfig used for deployment +gkeConfig: gke.#KubeConfig & { + // config field references `gkeConfig` value to set in once + config: gcpConfig +} diff --git a/docs/learn/tests/kube-gcp/basic/input.cue b/docs/learn/tests/kube-gcp/basic/input.cue new file mode 100644 index 00000000..95c4430a --- /dev/null +++ b/docs/learn/tests/kube-gcp/basic/input.cue @@ -0,0 +1,11 @@ +package main + +import ( + "alpha.dagger.io/git" +) + +manifest: git.#Repository & { + remote: "https://github.com/dagger/examples.git" + ref: "main" + subdir: "todoapp/k8s" +} diff --git a/docs/learn/tests/kube-gcp/basic/test/test.cue b/docs/learn/tests/kube-gcp/basic/test/test.cue new file mode 100644 index 00000000..7e5fcecb --- /dev/null +++ b/docs/learn/tests/kube-gcp/basic/test/test.cue @@ -0,0 +1,66 @@ +package main + +import ( + "alpha.dagger.io/dagger/op" + "alpha.dagger.io/kubernetes" +) + +TestEks: { + #_GetDeployment: """ + kubectl describe deployment todoapp | grep 'True' + """ + + #_DeleteDeployment: """ + kubectl delete deployment todoapp + kubectl delete service todoapp-service + """ + + #up: [ + op.#Load & { + from: kubernetes.#Kubectl + }, + + op.#WriteFile & { + dest: "/kubeconfig" + content: todoApp.kubeconfig + }, + + op.#WriteFile & { + dest: "/getPods.sh" + content: #_GetDeployment + }, + + op.#WriteFile & { + dest: "/deletePods.sh" + content: #_DeleteDeployment + }, + + // Get pods + op.#Exec & { + always: true + args: [ + "/bin/bash", + "--noprofile", + "--norc", + "-eo", + "pipefail", + "/getPods.sh", + ] + env: KUBECONFIG: "/kubeconfig" + }, + + // Delete pods + op.#Exec & { + always: true + args: [ + "/bin/bash", + "--noprofile", + "--norc", + "-eo", + "pipefail", + "/deletePods.sh", + ] + env: KUBECONFIG: "/kubeconfig" + }, + ] +} diff --git a/docs/learn/tests/kube-gcp/basic/todoapp.cue b/docs/learn/tests/kube-gcp/basic/todoapp.cue new file mode 100644 index 00000000..878f3f85 --- /dev/null +++ b/docs/learn/tests/kube-gcp/basic/todoapp.cue @@ -0,0 +1,16 @@ +package main + +import ( + "alpha.dagger.io/dagger" + "alpha.dagger.io/kubernetes" +) + +// input: kubernetes objects directory to deploy to +// set with `dagger input dir manifest ./k8s -e kube` +manifest: dagger.#Artifact & dagger.#Input + +// Deploy the manifest to a kubernetes cluster +todoApp: kubernetes.#Resources & { + "kubeconfig": kubeconfig + source: manifest +} From 1830b34e13aa18b83704496d159e55fdd4787638 Mon Sep 17 00:00:00 2001 From: Tom Chauveau Date: Tue, 17 Aug 2021 00:04:54 +0200 Subject: [PATCH 17/24] Add test for kube-gcp deployment step Signed-off-by: Tom Chauveau --- docs/learn/1007-kubernetes.md | 90 +------------------ .../env/kube-gcp-deployment/.gitignore | 2 + .../env/kube-gcp-deployment/values.yaml | 32 +++++++ .../tests/kube-gcp/deployment/config.cue | 25 ++++++ .../learn/tests/kube-gcp/deployment/input.cue | 19 ++++ .../tests/kube-gcp/deployment/test/test.cue | 66 ++++++++++++++ .../tests/kube-gcp/deployment/todoapp.cue | 61 +++++++++++++ 7 files changed, 207 insertions(+), 88 deletions(-) create mode 100644 docs/learn/tests/.dagger/env/kube-gcp-deployment/.gitignore create mode 100644 docs/learn/tests/.dagger/env/kube-gcp-deployment/values.yaml create mode 100644 docs/learn/tests/kube-gcp/deployment/config.cue create mode 100644 docs/learn/tests/kube-gcp/deployment/input.cue create mode 100644 docs/learn/tests/kube-gcp/deployment/test/test.cue create mode 100644 docs/learn/tests/kube-gcp/deployment/todoapp.cue diff --git a/docs/learn/1007-kubernetes.md b/docs/learn/1007-kubernetes.md index 23295059..341b02c0 100644 --- a/docs/learn/1007-kubernetes.md +++ b/docs/learn/1007-kubernetes.md @@ -414,32 +414,7 @@ The two files have to be edited to do so. - definition of a new `gcrCreds` value that contains ecr credentials for remote image push to GCR -```cue title="todoapp/kube/config.cue" -package main - -import ( - "alpha.dagger.io/gcp" - "alpha.dagger.io/gcp/gcr" - "alpha.dagger.io/gcp/gke" -) - -// Value created for generic reference of `kubeconfig` in `todoapp.cue` -kubeconfig: gkeConfig.kubeconfig - -// gcpConfig used for Google connection -gcpConfig: gcp.#Config - -// gkeConfig used for deployment -gkeConfig: gke.#KubeConfig & { - // config field references `gkeConfig` value to set in once - config: gcpConfig -} - -// gcrCreds used for remote image push -gcrCreds: gcr.#Credentials & { - // config field references `gcpConfig` value to set in once - config: gcpConfig -} +```cue file=tests/kube-gcp/deployment/config.cue title="todoapp/kube/config.cue" ``` `kube/todoapp.cue`, on the other hand, faces these changes: @@ -450,68 +425,7 @@ gcrCreds: gcr.#Credentials & { - `remoteImage`, push an image to the registry - `kustomization`, apply kustomization to image -```cue title="todoapp/kube/todoapp.cue" -package main - -import ( - "encoding/yaml" - - "alpha.dagger.io/dagger" - "alpha.dagger.io/docker" - "alpha.dagger.io/kubernetes" - "alpha.dagger.io/kubernetes/kustomize" -) - -// input: source code repository, must contain a Dockerfile -// set with `dagger input dir repository . -e kube` -repository: dagger.#Artifact & dagger.#Input - -// GCR registry to push images to -registry: string & dagger.#Input -tag: "test-gcr" - -// source of Kube config file. -// set with `dagger input dir manifest ./k8s -e kube` -manifest: dagger.#Artifact & dagger.#Input - -// Declarative name -todoApp: { - // Build an image from the project repository - image: docker.#Build & { - source: repository - } - - // Push the image to a remote registry - remoteImage: docker.#Push & { - target: "\(registry):\(tag)" - source: image - auth: { - username: gcrCreds.username - secret: gcrCreds.secret - } - } - - // Update the image of the deployment to the deployed image - kustomization: kustomize.#Kustomize & { - source: manifest - - // Convert CUE to YAML. - kustomization: yaml.Marshal({ - resources: ["deployment.yaml", "service.yaml"] - - images: [{ - name: "public.ecr.aws/j7f8d3t2/todoapp" - newName: remoteImage.ref - }] - }) - } - - // Value created for generic reference of `kubeconfig` in `todoapp.cue` - kubeSrc: kubernetes.#Resources & { - "kubeconfig": kubeconfig - source: kustomization - } -} +```cue file=tests/kube-gcp/deployment/todoapp.cue title="todoapp/kube/todoapp.cue" ``` diff --git a/docs/learn/tests/.dagger/env/kube-gcp-deployment/.gitignore b/docs/learn/tests/.dagger/env/kube-gcp-deployment/.gitignore new file mode 100644 index 00000000..01ec19b0 --- /dev/null +++ b/docs/learn/tests/.dagger/env/kube-gcp-deployment/.gitignore @@ -0,0 +1,2 @@ +# dagger state +state/** diff --git a/docs/learn/tests/.dagger/env/kube-gcp-deployment/values.yaml b/docs/learn/tests/.dagger/env/kube-gcp-deployment/values.yaml new file mode 100644 index 00000000..0c28e5c3 --- /dev/null +++ b/docs/learn/tests/.dagger/env/kube-gcp-deployment/values.yaml @@ -0,0 +1,32 @@ +plan: + package: ./kube-gcp/deployment/test +name: kube-gcp-deployment +inputs: + gcpConfig.project: + text: dagger-ci + gcpConfig.region: + text: us-west2-a + gcpConfig.serviceKey: + secret: ENC[AES256_GCM,data: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,iv:btPOf+agGb0iUOXUHZVzbFGNMmzWd1Bk0PvM0EjBjXg=,tag:FYKEK3FyM46olIBW8wl9YA==,type:str] + gkeConfig.clusterName: + text: test-cluster +sops: + kms: [] + gcp_kms: [] + azure_kv: [] + hc_vault: [] + age: + - recipient: age1gxwmtwahzwdmrskhf90ppwlnze30lgpm056kuesrxzeuyclrwvpsupwtpk + enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB6d2M5VGZ1Tjhhai90OVBE + K3B1b2ZETldIbjhnbXl2Q1FSU2ROYVUzY1FvCnVyYmtOOGZ0T3ZmTmJRcXZxYjho + SzZGWUlMdXZVVXg1STZJeStudjRQazAKLS0tIFdPeDc0SUU4bk5XdVJXcGRCb2c1 + Ni8vY1dCV3UzVkcxWE1CdTVsclVnTVUK1fH9kbr2H75zTCjvTTYr8jN8bF0YrQ9f + ZiSDkc+kgj/WrwFyXX6nbF3eU5wM0EYsD2dVqrrSWKUKz4egrRpS6Q== + -----END AGE ENCRYPTED FILE----- + lastmodified: "2021-08-16T22:01:37Z" + mac: ENC[AES256_GCM,data:Izl+ILzP05dVZ5LcW1NcYyxl/jY+MWurMc277GSy/lrpBlKNJe5pSP0u1b0Ib1g4SX2p/gkXMtUp2gTCM/f6rgpN9prPLJMr/MREj/VVwPuDiLZzr5aPNYHJ19lDMkO5QvFXM6KDVixEs1HUHm/wSSIfO8h/Gk32S6Hp4mjq5+o=,iv:n6p4dXIE4GJ82ty0/XH11H+i44FA/DE1zRsw/fmUJFk=,tag:KWdZNRDh5kutW9tGoc5sJg==,type:str] + pgp: [] + encrypted_suffix: secret + version: 3.7.1 diff --git a/docs/learn/tests/kube-gcp/deployment/config.cue b/docs/learn/tests/kube-gcp/deployment/config.cue new file mode 100644 index 00000000..844b77f3 --- /dev/null +++ b/docs/learn/tests/kube-gcp/deployment/config.cue @@ -0,0 +1,25 @@ +package main + +import ( + "alpha.dagger.io/gcp" + "alpha.dagger.io/gcp/gcr" + "alpha.dagger.io/gcp/gke" +) + +// Value created for generic reference of `kubeconfig` in `todoapp.cue` +kubeconfig: gkeConfig.kubeconfig + +// gcpConfig used for Google connection +gcpConfig: gcp.#Config + +// gkeConfig used for deployment +gkeConfig: gke.#KubeConfig & { + // config field references `gkeConfig` value to set in once + config: gcpConfig +} + +// gcrCreds used for remote image push +gcrCreds: gcr.#Credentials & { + // config field references `gcpConfig` value to set in once + config: gcpConfig +} diff --git a/docs/learn/tests/kube-gcp/deployment/input.cue b/docs/learn/tests/kube-gcp/deployment/input.cue new file mode 100644 index 00000000..fa993210 --- /dev/null +++ b/docs/learn/tests/kube-gcp/deployment/input.cue @@ -0,0 +1,19 @@ +package main + +import ( + "alpha.dagger.io/git" +) + +manifest: git.#Repository & { + remote: "https://github.com/dagger/examples.git" + ref: "main" + subdir: "todoapp/k8s" +} + +repository: git.#Repository & { + remote: "https://github.com/dagger/examples.git" + ref: "main" + subdir: "todoapp" +} + +registry: "gcr.io/dagger-ci/test" diff --git a/docs/learn/tests/kube-gcp/deployment/test/test.cue b/docs/learn/tests/kube-gcp/deployment/test/test.cue new file mode 100644 index 00000000..82f2fb40 --- /dev/null +++ b/docs/learn/tests/kube-gcp/deployment/test/test.cue @@ -0,0 +1,66 @@ +package main + +import ( + "alpha.dagger.io/dagger/op" + "alpha.dagger.io/kubernetes" +) + +TestEks: { + #_GetDeployment: """ + kubectl describe deployment todoapp | grep 'True' + """ + + #_DeleteDeployment: """ + kubectl delete deployment todoapp + kubectl delete service todoapp-service + """ + + #up: [ + op.#Load & { + from: kubernetes.#Kubectl + }, + + op.#WriteFile & { + dest: "/kubeconfig" + content: todoApp.kubeSrc.kubeconfig + }, + + op.#WriteFile & { + dest: "/getPods.sh" + content: #_GetDeployment + }, + + op.#WriteFile & { + dest: "/deletePods.sh" + content: #_DeleteDeployment + }, + + // Get pods + op.#Exec & { + always: true + args: [ + "/bin/bash", + "--noprofile", + "--norc", + "-eo", + "pipefail", + "/getPods.sh", + ] + env: KUBECONFIG: "/kubeconfig" + }, + + // Delete pods + op.#Exec & { + always: true + args: [ + "/bin/bash", + "--noprofile", + "--norc", + "-eo", + "pipefail", + "/deletePods.sh", + ] + env: KUBECONFIG: "/kubeconfig" + }, + ] +} diff --git a/docs/learn/tests/kube-gcp/deployment/todoapp.cue b/docs/learn/tests/kube-gcp/deployment/todoapp.cue new file mode 100644 index 00000000..795cd91e --- /dev/null +++ b/docs/learn/tests/kube-gcp/deployment/todoapp.cue @@ -0,0 +1,61 @@ +package main + +import ( + "encoding/yaml" + + "alpha.dagger.io/dagger" + "alpha.dagger.io/docker" + "alpha.dagger.io/kubernetes" + "alpha.dagger.io/kubernetes/kustomize" +) + +// input: source code repository, must contain a Dockerfile +// set with `dagger input dir repository . -e kube` +repository: dagger.#Artifact & dagger.#Input + +// GCR registry to push images to +registry: string & dagger.#Input +tag: "test-gcr" + +// source of Kube config file. +// set with `dagger input dir manifest ./k8s -e kube` +manifest: dagger.#Artifact & dagger.#Input + +// Declarative name +todoApp: { + // Build an image from the project repository + image: docker.#Build & { + source: repository + } + + // Push the image to a remote registry + remoteImage: docker.#Push & { + target: "\(registry):\(tag)" + source: image + auth: { + username: gcrCreds.username + secret: gcrCreds.secret + } + } + + // Update the image of the deployment to the deployed image + kustomization: kustomize.#Kustomize & { + source: manifest + + // Convert CUE to YAML. + kustomization: yaml.Marshal({ + resources: ["deployment.yaml", "service.yaml"] + + images: [{ + name: "public.ecr.aws/j7f8d3t2/todoapp" + newName: remoteImage.ref + }] + }) + } + + // Value created for generic reference of `kubeconfig` in `todoapp.cue` + kubeSrc: kubernetes.#Resources & { + "kubeconfig": kubeconfig + source: kustomization + } +} From 4d036389110ce284561243e0ff758117f38b3359 Mon Sep 17 00:00:00 2001 From: Tom Chauveau Date: Tue, 17 Aug 2021 00:14:41 +0200 Subject: [PATCH 18/24] Add test for kube-gcp cue-manifest step Signed-off-by: Tom Chauveau --- docs/learn/1007-kubernetes.md | 47 +------------ .../env/kube-gcp-cue-manifest/.gitignore | 2 + .../env/kube-gcp-cue-manifest/values.yaml | 32 +++++++++ .../tests/kube-gcp/cue-manifest/config.cue | 25 +++++++ .../kube-gcp/cue-manifest/deployment.cue | 43 ++++++++++++ .../tests/kube-gcp/cue-manifest/input.cue | 19 ++++++ .../tests/kube-gcp/cue-manifest/manifest.cue | 29 ++++++++ .../tests/kube-gcp/cue-manifest/service.cue | 36 ++++++++++ .../tests/kube-gcp/cue-manifest/test/test.cue | 66 +++++++++++++++++++ .../tests/kube-gcp/cue-manifest/todoapp.cue | 45 +++++++++++++ 10 files changed, 298 insertions(+), 46 deletions(-) create mode 100644 docs/learn/tests/.dagger/env/kube-gcp-cue-manifest/.gitignore create mode 100644 docs/learn/tests/.dagger/env/kube-gcp-cue-manifest/values.yaml create mode 100644 docs/learn/tests/kube-gcp/cue-manifest/config.cue create mode 100644 docs/learn/tests/kube-gcp/cue-manifest/deployment.cue create mode 100644 docs/learn/tests/kube-gcp/cue-manifest/input.cue create mode 100644 docs/learn/tests/kube-gcp/cue-manifest/manifest.cue create mode 100644 docs/learn/tests/kube-gcp/cue-manifest/service.cue create mode 100644 docs/learn/tests/kube-gcp/cue-manifest/test/test.cue create mode 100644 docs/learn/tests/kube-gcp/cue-manifest/todoapp.cue diff --git a/docs/learn/1007-kubernetes.md b/docs/learn/1007-kubernetes.md index 341b02c0..77460b9c 100644 --- a/docs/learn/1007-kubernetes.md +++ b/docs/learn/1007-kubernetes.md @@ -594,52 +594,7 @@ values={[ -```cue title="todoapp/kube/todoapp.cue" -package main - -import ( - "alpha.dagger.io/dagger" - "alpha.dagger.io/docker" - "alpha.dagger.io/kubernetes" -) - -// input: source code repository, must contain a Dockerfile -// set with `dagger input dir repository . -e kube` -repository: dagger.#Artifact & dagger.#Input - -// GCR registry to push images to -registry: string & dagger.#Input -tag: "test-gcr" - -// Todoapp deployment pipeline -todoApp: { - // Build the image from repositoru artifact - image: docker.#Build & { - source: repository - } - - // Push image to registry - remoteImage: docker.#Push & { - target: "\(registry):\(tag)" - source: image - auth: { - username: gcrCreds.username - secret: gcrCreds.secret - } - } - - // Generate deployment manifest - deployment: #AppManifest & { - name: "todoapp" - image: remoteImage.ref - } - - // Deploy the customized manifest to a kubernetes cluster - kubeSrc: kubernetes.#Resources & { - "kubeconfig": kubeconfig - manifest: deployment.manifest - } -} +```cue file=tests/kube-gcp/cue-manifest/todoapp.cue title="todoapp/kube/todoapp.cue" ``` diff --git a/docs/learn/tests/.dagger/env/kube-gcp-cue-manifest/.gitignore b/docs/learn/tests/.dagger/env/kube-gcp-cue-manifest/.gitignore new file mode 100644 index 00000000..01ec19b0 --- /dev/null +++ b/docs/learn/tests/.dagger/env/kube-gcp-cue-manifest/.gitignore @@ -0,0 +1,2 @@ +# dagger state +state/** diff --git a/docs/learn/tests/.dagger/env/kube-gcp-cue-manifest/values.yaml b/docs/learn/tests/.dagger/env/kube-gcp-cue-manifest/values.yaml new file mode 100644 index 00000000..de7748c9 --- /dev/null +++ b/docs/learn/tests/.dagger/env/kube-gcp-cue-manifest/values.yaml @@ -0,0 +1,32 @@ +plan: + package: ./kube-gcp/cue-manifest/test +name: kube-gcp-cue-manifest +inputs: + gcpConfig.project: + text: dagger-ci + gcpConfig.region: + text: us-west2-a + gcpConfig.serviceKey: + secret: ENC[AES256_GCM,data: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,iv:uGLdGFprxBx2JX4GXdJlwiikOxarEX3zzJnuiF3jtV8=,tag:aZIAWTfjgDBCAKDDGXVHZw==,type:str] + gkeConfig.clusterName: + text: test-cluster +sops: + kms: [] + gcp_kms: [] + azure_kv: [] + hc_vault: [] + age: + - recipient: age1gxwmtwahzwdmrskhf90ppwlnze30lgpm056kuesrxzeuyclrwvpsupwtpk + enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSA2TWhqdVQ4Si9CQU5mRmQy + SEpCM0l6UGsydkM1SlFIREZmSTh5YmtuT1cwClN5eUJlNGkyS29jYmlEMWhYTDZK + NzdLeitIL0Erdm1IVHAxSitQWWRDOG8KLS0tIGNFa1JEclJNWEQ2SHVlbW5lY3kw + enc0b29RU2xKMWFoWFVqcnJ4S3NOKzQK6coqwcUNfO/D3OFcEnVHqjZTUFv9zJPr + OT4sQCfYA4tJWL6Xm8aDiWKr91GqURo4aTpZnwzlWIrIrTTs25IQig== + -----END AGE ENCRYPTED FILE----- + lastmodified: "2021-08-16T22:09:04Z" + mac: ENC[AES256_GCM,data:kXzvMaEEy9vJneQU9FlRGBzwP73aJhhyIu/axCu36ee84pYuHYEXkJB6Irh/1kYyDDwj+m3k3ySszlkQfa5+Lhy7U+sKb7KFJKmy2rYJekBIjTnYyPNeM1M0mG52pKwbUTElZ9Wo3z4vDkSrjfYxsgYM2cSvEKgoiC4M5VhzXjM=,iv:WNar5O7/+Vwh0+S8tcTKNbloUUpB+79QJEyrVJVeGsc=,tag:iAwTMUidHmTv+TNJxt0BBg==,type:str] + pgp: [] + encrypted_suffix: secret + version: 3.7.1 diff --git a/docs/learn/tests/kube-gcp/cue-manifest/config.cue b/docs/learn/tests/kube-gcp/cue-manifest/config.cue new file mode 100644 index 00000000..844b77f3 --- /dev/null +++ b/docs/learn/tests/kube-gcp/cue-manifest/config.cue @@ -0,0 +1,25 @@ +package main + +import ( + "alpha.dagger.io/gcp" + "alpha.dagger.io/gcp/gcr" + "alpha.dagger.io/gcp/gke" +) + +// Value created for generic reference of `kubeconfig` in `todoapp.cue` +kubeconfig: gkeConfig.kubeconfig + +// gcpConfig used for Google connection +gcpConfig: gcp.#Config + +// gkeConfig used for deployment +gkeConfig: gke.#KubeConfig & { + // config field references `gkeConfig` value to set in once + config: gcpConfig +} + +// gcrCreds used for remote image push +gcrCreds: gcr.#Credentials & { + // config field references `gcpConfig` value to set in once + config: gcpConfig +} diff --git a/docs/learn/tests/kube-gcp/cue-manifest/deployment.cue b/docs/learn/tests/kube-gcp/cue-manifest/deployment.cue new file mode 100644 index 00000000..88d7b800 --- /dev/null +++ b/docs/learn/tests/kube-gcp/cue-manifest/deployment.cue @@ -0,0 +1,43 @@ +package main + +// Deployment template containing all the common boilerplate shared by +// deployments of this application. +#Deployment: { + // Name of the deployment. This will be used to label resources automatically + // and generate selectors. + name: string + + // Container image. + image: string + + // 80 is the default port. + port: *80 | int + + // 1 is the default, but we allow any number. + replicas: *1 | int + + // Deployment manifest. Uses the name, image, port and replicas above to + // generate the resource manifest. + manifest: { + apiVersion: "apps/v1" + kind: "Deployment" + metadata: { + "name": name + labels: app: name + } + spec: { + "replicas": replicas + selector: matchLabels: app: name + template: { + metadata: labels: app: name + spec: containers: [{ + "name": name + "image": image + ports: [{ + containerPort: port + }] + }] + } + } + } +} diff --git a/docs/learn/tests/kube-gcp/cue-manifest/input.cue b/docs/learn/tests/kube-gcp/cue-manifest/input.cue new file mode 100644 index 00000000..fa993210 --- /dev/null +++ b/docs/learn/tests/kube-gcp/cue-manifest/input.cue @@ -0,0 +1,19 @@ +package main + +import ( + "alpha.dagger.io/git" +) + +manifest: git.#Repository & { + remote: "https://github.com/dagger/examples.git" + ref: "main" + subdir: "todoapp/k8s" +} + +repository: git.#Repository & { + remote: "https://github.com/dagger/examples.git" + ref: "main" + subdir: "todoapp" +} + +registry: "gcr.io/dagger-ci/test" diff --git a/docs/learn/tests/kube-gcp/cue-manifest/manifest.cue b/docs/learn/tests/kube-gcp/cue-manifest/manifest.cue new file mode 100644 index 00000000..df4ff0d9 --- /dev/null +++ b/docs/learn/tests/kube-gcp/cue-manifest/manifest.cue @@ -0,0 +1,29 @@ +package main + +import ( + "encoding/yaml" +) + +// Define and generate kubernetes deployment to deploy to kubernetes cluster +#AppManifest: { + // Name of the application + name: string + + // Image to deploy to + image: string + + // Define a kubernetes deployment object + deployment: #Deployment & { + "name": name + "image": image + } + + // Define a kubernetes service object + service: #Service & { + "name": name + ports: http: deployment.port + } + + // Merge definitions and convert them back from CUE to YAML + manifest: yaml.MarshalStream([deployment.manifest, service.manifest]) +} diff --git a/docs/learn/tests/kube-gcp/cue-manifest/service.cue b/docs/learn/tests/kube-gcp/cue-manifest/service.cue new file mode 100644 index 00000000..8c5dc957 --- /dev/null +++ b/docs/learn/tests/kube-gcp/cue-manifest/service.cue @@ -0,0 +1,36 @@ +package main + +// Service template containing all the common boilerplate shared by +// services of this application. +#Service: { + // Name of the service. This will be used to label resources automatically + // and generate selector. + name: string + + // NodePort is the default service type. + type: *"NodePort" | "LoadBalancer" | "ClusterIP" | "ExternalName" + + // Ports where the service should listen + ports: [string]: number + + // Service manifest. Uses the name, type and ports above to + // generate the resource manifest. + manifest: { + apiVersion: "v1" + kind: "Service" + metadata: { + "name": "\(name)-service" + labels: app: name + } + spec: { + "type": type + "ports": [ + for k, v in ports { + name: k + port: v + }, + ] + selector: app: name + } + } +} diff --git a/docs/learn/tests/kube-gcp/cue-manifest/test/test.cue b/docs/learn/tests/kube-gcp/cue-manifest/test/test.cue new file mode 100644 index 00000000..82f2fb40 --- /dev/null +++ b/docs/learn/tests/kube-gcp/cue-manifest/test/test.cue @@ -0,0 +1,66 @@ +package main + +import ( + "alpha.dagger.io/dagger/op" + "alpha.dagger.io/kubernetes" +) + +TestEks: { + #_GetDeployment: """ + kubectl describe deployment todoapp | grep 'True' + """ + + #_DeleteDeployment: """ + kubectl delete deployment todoapp + kubectl delete service todoapp-service + """ + + #up: [ + op.#Load & { + from: kubernetes.#Kubectl + }, + + op.#WriteFile & { + dest: "/kubeconfig" + content: todoApp.kubeSrc.kubeconfig + }, + + op.#WriteFile & { + dest: "/getPods.sh" + content: #_GetDeployment + }, + + op.#WriteFile & { + dest: "/deletePods.sh" + content: #_DeleteDeployment + }, + + // Get pods + op.#Exec & { + always: true + args: [ + "/bin/bash", + "--noprofile", + "--norc", + "-eo", + "pipefail", + "/getPods.sh", + ] + env: KUBECONFIG: "/kubeconfig" + }, + + // Delete pods + op.#Exec & { + always: true + args: [ + "/bin/bash", + "--noprofile", + "--norc", + "-eo", + "pipefail", + "/deletePods.sh", + ] + env: KUBECONFIG: "/kubeconfig" + }, + ] +} diff --git a/docs/learn/tests/kube-gcp/cue-manifest/todoapp.cue b/docs/learn/tests/kube-gcp/cue-manifest/todoapp.cue new file mode 100644 index 00000000..42135f3f --- /dev/null +++ b/docs/learn/tests/kube-gcp/cue-manifest/todoapp.cue @@ -0,0 +1,45 @@ +package main + +import ( + "alpha.dagger.io/dagger" + "alpha.dagger.io/docker" + "alpha.dagger.io/kubernetes" +) + +// input: source code repository, must contain a Dockerfile +// set with `dagger input dir repository . -e kube` +repository: dagger.#Artifact & dagger.#Input + +// GCR registry to push images to +registry: string & dagger.#Input +tag: "test-gcr" + +// Todoapp deployment pipeline +todoApp: { + // Build the image from repositoru artifact + image: docker.#Build & { + source: repository + } + + // Push image to registry + remoteImage: docker.#Push & { + target: "\(registry):\(tag)" + source: image + auth: { + username: gcrCreds.username + secret: gcrCreds.secret + } + } + + // Generate deployment manifest + deployment: #AppManifest & { + name: "todoapp" + image: remoteImage.ref + } + + // Deploy the customized manifest to a kubernetes cluster + kubeSrc: kubernetes.#Resources & { + "kubeconfig": kubeconfig + manifest: deployment.manifest + } +} From 6ef0cfe3211ee8f48c3687494b70b6d4e25daeba Mon Sep 17 00:00:00 2001 From: Guillaume de Rouville Date: Fri, 20 Aug 2021 16:09:35 +0200 Subject: [PATCH 19/24] 1008: Implement on LocalStack Signed-off-by: Guillaume de Rouville --- .github/workflows/ci.yml | 16 ++++++++++++++++ .../tests/.dagger/env/cloudformation/values.yaml | 10 ++++++---- docs/learn/tests/doc.bats | 3 ++- docs/learn/tests/helpers.bash | 11 +++++++++++ 4 files changed, 35 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fedc5589..84b6677b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -189,6 +189,22 @@ jobs: name: Documentation runs-on: ubuntu-latest timeout-minutes: 30 + services: + localstack: + image: localstack/localstack:0.12.16 + env: + SERVICES: s3, cloudformation + LOCALSTACK_API_KEY: ${{ secrets.LOCALSTACK_API_KEY }} + ports: + - 4566:4566 + - 4571:4571 + options: >- + --health-cmd "curl -f http://localhost:4566/health" + --health-start-period 5s + --health-timeout 5s + --health-interval 5s + --health-retries 10 + steps: - name: Check out uses: actions/checkout@v2 diff --git a/docs/learn/tests/.dagger/env/cloudformation/values.yaml b/docs/learn/tests/.dagger/env/cloudformation/values.yaml index 985f9aa9..bd284af1 100644 --- a/docs/learn/tests/.dagger/env/cloudformation/values.yaml +++ b/docs/learn/tests/.dagger/env/cloudformation/values.yaml @@ -3,11 +3,13 @@ plan: name: cloudformation inputs: awsConfig.accessKey: - secret: ENC[AES256_GCM,data:MJSSjaXpMawrpM5trPQzZR2Cg/M=,iv:D8Ff3Uy8hpzFPKg+okFkVM5DRam9Dyk31GjIizklvP0=,tag:J/7/+xjHdy94mYTQmB0sUw==,type:str] + secret: ENC[AES256_GCM,data:HaGzSQ==,iv:FzsuSq7ZKttWs0WDC0q+vT/hxUx+WcQ4iy7vnV+Q8Dg=,tag:Oy9Xxq+4LMVkXkF/3ZjjsA==,type:str] + awsConfig.localMode: + text: "true" awsConfig.region: text: us-east-2 awsConfig.secretKey: - secret: ENC[AES256_GCM,data:BnBc29SIbLj3DDWwpem7mcLQSPoP6a/opqIYxLZyQPdSJojL/Jy9jA==,iv:nK3mj7jOgJdAwcO2i5OYj1FxHsYnoodyXMih9eqLnOQ=,tag:1zaXCkwL8d8ilyxCGzPN6Q==,type:str] + secret: ENC[AES256_GCM,data:aHDXVQ==,iv:ZEA4JLLedUvITocXE5G4Ar6pDNilyvgdvEYsMy/LVIk=,tag:BALivFcV0xBQD//qvo0aUw==,type:str] cfnStack.onFailure: text: DELETE sops: @@ -25,8 +27,8 @@ sops: Lzd0bU1qMXF0dzIzTG05cmlzZURxUncKp2wNXD/HKXgGv16pM/yvaYfWL5lsQyWo CDsT4rHHMZ21XtS9W+7oL9IqMMmDUQf6RZgDgoqLVmTjdBeA8yB2yg== -----END AGE ENCRYPTED FILE----- - lastmodified: "2021-08-13T02:12:09Z" - mac: ENC[AES256_GCM,data:tZ35vWWlepyQOuKtzO1pau51YQZZ+Lg2LKK9PlSJvJZYzp+QaUVMCsoTAkZXgMH12C9ced6Jo1pfV9kQjxG1/g+5JmjgClFCWCMTIRa8Z9iI3hGu35SjxG4KVRlmeZsjstEW+78JBOekBUWYzkX0vAlKq44qLLug3FDc+sxFetQ=,iv:yB85C7b5X4y/koB3zN3ktUoYrYdB7N07FvJigwjxao0=,tag:3PSTd39bLyPRa4uZzHycjg==,type:str] + lastmodified: "2021-08-20T13:10:08Z" + mac: ENC[AES256_GCM,data:UIhYTG5ofk04dPLOaYiryOt/JC+8/ousZlGpotAAenHOYVo0FChYKywofquOVlpqdC0a/wT6eEz59ofpxDuzV/8/Qh/5MumHqfJUYtQezQYVhreLpWdLsHTn99Ndqjzhj+on9ODumqsAOM+PgVEKRTxSHtTOZB8i4gfO77hg5nk=,iv:E11iRe9z+PxHCy9qtnEYVv+uXVxn1CfAqIgGspd5ObM=,tag:PzORtWy+xVwXof5nbHrDDw==,type:str] pgp: [] encrypted_suffix: secret version: 3.7.1 diff --git a/docs/learn/tests/doc.bats b/docs/learn/tests/doc.bats index c933872c..fdab968e 100644 --- a/docs/learn/tests/doc.bats +++ b/docs/learn/tests/doc.bats @@ -163,6 +163,7 @@ setup() { } @test "doc-1008-aws-cloudformation" { + skip_unless_local_localstack setup_example_sandbox "doc" ### Create a basic plan @@ -236,7 +237,7 @@ setup() { mkdir workspace cd workspace - # Writing the package + # Writing package dagger init mkdir -p cue.mod/pkg/github.com/tjovicic/gcpcloudrun cp $CODEBLOC_SRC/dev-cue-package/source.cue cue.mod/pkg/github.com/tjovicic/gcpcloudrun/source.cue diff --git a/docs/learn/tests/helpers.bash b/docs/learn/tests/helpers.bash index 6c5b30d8..b471179f 100644 --- a/docs/learn/tests/helpers.bash +++ b/docs/learn/tests/helpers.bash @@ -77,6 +77,17 @@ copy_to_sandbox() { fi } +# Check if there is a localstack instance. +# +# This is needed to do docs test in the CI. +skip_unless_local_localstack() { + if [ "$(curl -s http://localhost:4566)" = '{"status": "running"}' ]; then + echo "Localstack available" + else + skip "Localstack not available" + fi +} + # Check if there is a local kubernetes cluster. # # This is need to do kubernetes test in the CI. From cf7e222a0446c1c4451a96efbe3e8274042949d8 Mon Sep 17 00:00:00 2001 From: Guillaume de Rouville Date: Fri, 20 Aug 2021 18:00:10 +0200 Subject: [PATCH 20/24] Fix bats dagger to bats dagger() expansion not working inside shellscript Signed-off-by: Guillaume de Rouville --- docs/learn/tests/doc.bats | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/learn/tests/doc.bats b/docs/learn/tests/doc.bats index fdab968e..a2c1d891 100644 --- a/docs/learn/tests/doc.bats +++ b/docs/learn/tests/doc.bats @@ -243,8 +243,14 @@ setup() { cp $CODEBLOC_SRC/dev-cue-package/source.cue cue.mod/pkg/github.com/tjovicic/gcpcloudrun/source.cue cp $CODEBLOC_SRC/dev-cue-package/script.sh . + # We remove the last line of the script, as bats cannot expand dagger + # to dagger() bats helper func inside bash files + sed '$d' < script.sh > tmpFile ; mv tmpFile script.sh + chmod +x script.sh ./script.sh + # Command removed from script.sh above + dagger new staging -p ./test run dagger up -e staging - assert_output --partial "environment=staging input=run.gcpConfig.serviceKey" + assert_output --partial "input=run.gcpConfig.serviceKey" } From 02e7cd3f59a0029656e0750b91c5fec4d804af76 Mon Sep 17 00:00:00 2001 From: Tom Chauveau Date: Fri, 27 Aug 2021 16:51:48 +0200 Subject: [PATCH 21/24] Add missing tests to 1007-gcp test Signed-off-by: Tom Chauveau --- docs/learn/tests/doc.bats | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/docs/learn/tests/doc.bats b/docs/learn/tests/doc.bats index a2c1d891..99a4a148 100644 --- a/docs/learn/tests/doc.bats +++ b/docs/learn/tests/doc.bats @@ -160,6 +160,19 @@ setup() { # Up deployment dagger -w "$DAGGER_SANDBOX" -e kube-gcp-basic up + + #################### DEPLOYMENT #################### + # Copy deployment to sandbox + copy_to_sandbox kube-gcp-deployment kube-gcp + + # Up deployment + dagger -w "$DAGGER_SANDBOX" -e kube-gcp-deployment up + #################### CUE MANIFEST #################### + # Copy deployment to sandbox + copy_to_sandbox kube-gcp-cue-manifest kube-gcp + + # Up deployment + dagger -w "$DAGGER_SANDBOX" -e kube-gcp-cue-manifest up } @test "doc-1008-aws-cloudformation" { From e7a738211f8eb658d549c4b29f81658ba4b4c0a7 Mon Sep 17 00:00:00 2001 From: Tom Chauveau Date: Mon, 30 Aug 2021 16:06:39 +0200 Subject: [PATCH 22/24] Improve test policy for examples Signed-off-by: Tom Chauveau --- docs/learn/tests/dev-cue-package/script.sh | 2 +- docs/learn/tests/doc.bats | 167 +++++++++++---------- docs/learn/tests/helpers.bash | 16 +- 3 files changed, 96 insertions(+), 89 deletions(-) diff --git a/docs/learn/tests/dev-cue-package/script.sh b/docs/learn/tests/dev-cue-package/script.sh index 3862188c..03aae599 100644 --- a/docs/learn/tests/dev-cue-package/script.sh +++ b/docs/learn/tests/dev-cue-package/script.sh @@ -1,6 +1,6 @@ #!/bin/bash -mkdir test +mkdir -p test cat > test/source.cue << EOF package test diff --git a/docs/learn/tests/doc.bats b/docs/learn/tests/doc.bats index 99a4a148..519e6a81 100644 --- a/docs/learn/tests/doc.bats +++ b/docs/learn/tests/doc.bats @@ -9,70 +9,73 @@ setup() { # Test 1003-get-started @test "doc-1003-get-started" { - setup_example_sandbox "doc" + setup_example_sandbox # Set examples private key - ./import-tutorial-key.sh + "$DAGGER_SANDBOX"/import-tutorial-key.sh # Collect url - dagger up - url=$(dagger query -f text url) + dagger -w "$DAGGER_SANDBOX" up + url=$(dagger -w "$DAGGER_SANDBOX" query -f text url) # More commands - dagger list - ls -l ./s3 - dagger input list + dagger -w "$DAGGER_SANDBOX" list + ls -l "$DAGGER_SANDBOX"/s3 + dagger -w "$DAGGER_SANDBOX" input list # Check output - run curl $url + run curl "$url" assert_output --partial "My Todo app" } @test "doc-1004-first-env" { - setup_example_sandbox "doc" + setup_example_sandbox # Follow tutorial - mkdir multibucket - cp $CODEBLOC_SRC/multibucket/source.cue multibucket - cp $CODEBLOC_SRC/multibucket/yarn.cue multibucket - cp $CODEBLOC_SRC/multibucket/netlify.cue multibucket + mkdir -p "$DAGGER_SANDBOX"/multibucket + cp "$DAGGER_WORKSPACE"/multibucket/source.cue "$DAGGER_SANDBOX"/multibucket + cp "$DAGGER_WORKSPACE"/multibucket/yarn.cue "$DAGGER_SANDBOX"/multibucket + cp "$DAGGER_WORKSPACE"/multibucket/netlify.cue "$DAGGER_SANDBOX"/multibucket - dagger doc alpha.dagger.io/netlify - dagger doc alpha.dagger.io/js/yarn + dagger -w "$DAGGER_SANDBOX" doc alpha.dagger.io/netlify + dagger -w "$DAGGER_SANDBOX" doc alpha.dagger.io/js/yarn # Initialize new env - dagger new 'multibucket' -p ./multibucket + dagger -w "$DAGGER_SANDBOX" new 'multibucket' -p "$DAGGER_SANDBOX"/multibucket # Copy corresponding env - cp -r $CODEBLOC_SRC/.dagger/env/multibucket .dagger/env/ + cp -r "$DAGGER_WORKSPACE"/.dagger/env/multibucket "$DAGGER_SANDBOX"/.dagger/env/ + # Add missing src input - dagger -e multibucket input dir src . + dagger -w "$DAGGER_SANDBOX" -e multibucket input dir src "$DAGGER_SANDBOX" # Run test - dagger -e multibucket up - url=$(dagger -e multibucket query -f text site.netlify.deployUrl) + dagger -w "$DAGGER_SANDBOX" -e multibucket up + url=$(dagger -w "$DAGGER_SANDBOX" -e multibucket query -f text site.netlify.deployUrl) - # Check output : - run curl $url + # Check output + run curl "$url" assert_output --partial "./static/css/main.9149988f.chunk.css" } @test "doc-1006-google-cloud-run" { - setup_example_sandbox "doc" + setup_example_sandbox - mkdir gcpcloudrun - cp $CODEBLOC_SRC/gcpcloudrun/source.cue gcpcloudrun + # Follow tutorial + mkdir -p "$DAGGER_SANDBOX"/gcpcloudrun + cp "$DAGGER_WORKSPACE"/gcpcloudrun/source.cue "$DAGGER_SANDBOX"/gcpcloudrun # Initialize new env - dagger new 'gcpcloudrun' -p gcpcloudrun + dagger -w "$DAGGER_SANDBOX" new 'gcpcloudrun' -p "$DAGGER_SANDBOX"/gcpcloudrun # Copy corresponding env - cp -r $CODEBLOC_SRC/.dagger/env/gcpcloudrun .dagger/env/ + cp -r "$DAGGER_WORKSPACE"/.dagger/env/gcpcloudrun "$DAGGER_SANDBOX"/.dagger/env/ + # Add missing src input - dagger -e gcpcloudrun input dir src . + dagger -w "$DAGGER_SANDBOX" -e gcpcloudrun input dir src "$DAGGER_SANDBOX" # Run test - run dagger -e gcpcloudrun up + run dagger -w "$DAGGER_SANDBOX" -e gcpcloudrun up assert_success } @@ -140,7 +143,7 @@ setup() { dagger -w "$DAGGER_SANDBOX" -e kube-aws-basic up #################### DEPLOYMENT #################### - # Copy deployment to sandbox + # Copy deployment to sandbox copy_to_sandbox kube-aws-deployment kube-aws # Up deployment @@ -177,93 +180,103 @@ setup() { @test "doc-1008-aws-cloudformation" { skip_unless_local_localstack - setup_example_sandbox "doc" + setup_example_sandbox ### Create a basic plan ## Construct - mkdir cloudformation - cp $CODEBLOC_SRC/cloudformation/template.cue cloudformation + mkdir -p "$DAGGER_SANDBOX"/cloudformation + cp "$DAGGER_WORKSPACE"/cloudformation/template.cue "$DAGGER_SANDBOX"/cloudformation # Cloudformation relay - dagger doc alpha.dagger.io/aws/cloudformation - cp $CODEBLOC_SRC/cloudformation/source-begin.cue cloudformation/source.cue + dagger -w "$DAGGER_SANDBOX" doc alpha.dagger.io/aws/cloudformation + cp "$DAGGER_WORKSPACE"/cloudformation/source-begin.cue "$DAGGER_SANDBOX"/cloudformation/source.cue # Initialize new env - dagger new 'cloudformation' -p cloudformation + dagger -w "$DAGGER_SANDBOX" new 'cloudformation' -p "$DAGGER_SANDBOX"/cloudformation # Finish template setup - cp $CODEBLOC_SRC/cloudformation/source-end.cue cloudformation/source.cue + cp "$DAGGER_WORKSPACE"/cloudformation/source-end.cue "$DAGGER_SANDBOX"/cloudformation/source.cue + # Copy corresponding env - cp -r $CODEBLOC_SRC/.dagger/env/cloudformation .dagger/env/ + cp -r "$DAGGER_WORKSPACE"/.dagger/env/cloudformation "$DAGGER_SANDBOX"/.dagger/env/ # Run test - dagger -e cloudformation up - stackName=$(dagger -e cloudformation query cfnStackName -f text) + dagger -w "$DAGGER_SANDBOX" -e cloudformation up + stackName=$(dagger -w "$DAGGER_SANDBOX" -e cloudformation query cfnStackName -f text) ## Cleanup # Place back empty source - cp $CODEBLOC_SRC/cloudformation/source-begin.cue cloudformation/source.cue - cp $CODEBLOC_SRC/cloudformation/deletion.cue cloudformation/deletion.cue + cp "$DAGGER_WORKSPACE"/cloudformation/source-begin.cue "$DAGGER_SANDBOX"/cloudformation/source.cue + cp "$DAGGER_WORKSPACE"/cloudformation/deletion.cue "$DAGGER_SANDBOX"/cloudformation/deletion.cue # Prepare and run cloudformation cleanup - dagger -e cloudformation input text stackRemoval.stackName $stackName - dagger -e cloudformation up + dagger -w "$DAGGER_SANDBOX" -e cloudformation input text stackRemoval.stackName "$stackName" + dagger -w "$DAGGER_SANDBOX" -e cloudformation up ### Template part ## Create convert.cue - cp $CODEBLOC_SRC/cloudformation/template/convert.cue cloudformation/convert.cue - rm cloudformation/source.cue cloudformation/deletion.cue + cp "$DAGGER_WORKSPACE"/cloudformation/template/convert.cue "$DAGGER_SANDBOX"/cloudformation/convert.cue + rm "$DAGGER_SANDBOX"/cloudformation/source.cue "$DAGGER_SANDBOX"/cloudformation/deletion.cue ## Retrieve Unmarshalled JSON - dagger query -e cloudformation s3Template + dagger -w "$DAGGER_SANDBOX" query -e cloudformation s3Template ## Remove convert.cue - rm cloudformation/convert.cue - ## Store the output - cp $CODEBLOC_SRC/cloudformation/template/template-begin.cue cloudformation/template.cue - # Inspect conf - dagger query -e cloudformation template -f text + rm "$DAGGER_SANDBOX"/cloudformation/convert.cue - cp $CODEBLOC_SRC/cloudformation/template/deployment.cue cloudformation/deployment.cue - cp $CODEBLOC_SRC/cloudformation/template/template-end.cue cloudformation/template.cue - cp $CODEBLOC_SRC/cloudformation/source-end.cue cloudformation/source.cue + ## Store the output + cp "$DAGGER_WORKSPACE"/cloudformation/template/template-begin.cue "$DAGGER_SANDBOX"/cloudformation/template.cue + + # Inspect conf + dagger -w "$DAGGER_SANDBOX" query -e cloudformation template -f text + + cp "$DAGGER_WORKSPACE"/cloudformation/template/deployment.cue "$DAGGER_SANDBOX"/cloudformation/deployment.cue + cp "$DAGGER_WORKSPACE"/cloudformation/template/template-end.cue "$DAGGER_SANDBOX"/cloudformation/template.cue + cp "$DAGGER_WORKSPACE"/cloudformation/source-end.cue "$DAGGER_SANDBOX"/cloudformation/source.cue # Deploy again - dagger -e cloudformation query template -f text - dagger -e cloudformation up - dagger -e cloudformation output list + dagger -w "$DAGGER_SANDBOX" -e cloudformation query template -f text + dagger -w "$DAGGER_SANDBOX" -e cloudformation up + dagger -w "$DAGGER_SANDBOX" -e cloudformation output list ## Cleanup again - stackName=$(dagger -e cloudformation query cfnStackName -f text) - rm -rf cloudformation/* + stackName=$(dagger -w "$DAGGER_SANDBOX" -e cloudformation query cfnStackName -f text) + rm -rf "$DAGGER_SANDBOX"/cloudformation/* + # Place back empty source - cp $CODEBLOC_SRC/cloudformation/source-begin.cue cloudformation/source.cue - cp $CODEBLOC_SRC/cloudformation/deletion.cue cloudformation/deletion.cue + cp "$DAGGER_WORKSPACE"/cloudformation/source-begin.cue "$DAGGER_SANDBOX"/cloudformation/source.cue + cp "$DAGGER_WORKSPACE"/cloudformation/deletion.cue "$DAGGER_SANDBOX"/cloudformation/deletion.cue + # Prepare and run cloudformation cleanup - dagger -e cloudformation input text stackRemoval.stackName $stackName - dagger -e cloudformation up + dagger -w "$DAGGER_SANDBOX" -e cloudformation input text stackRemoval.stackName "$stackName" + dagger -w "$DAGGER_SANDBOX" -e cloudformation up } @test "doc-1010-dev-cue-package" { - setup_example_sandbox "" - # Initializing workspace - mkdir workspace - cd workspace + mkdir -p "$DAGGER_SANDBOX"/workspace # Writing package - dagger init - mkdir -p cue.mod/pkg/github.com/tjovicic/gcpcloudrun - cp $CODEBLOC_SRC/dev-cue-package/source.cue cue.mod/pkg/github.com/tjovicic/gcpcloudrun/source.cue - cp $CODEBLOC_SRC/dev-cue-package/script.sh . + # dagger init # The sandbox is already init + mkdir -p "$DAGGER_SANDBOX"/cue.mod/pkg/github.com/tjovicic/gcpcloudrun + cp "$DAGGER_WORKSPACE"/dev-cue-package/source.cue "$DAGGER_SANDBOX"/cue.mod/pkg/github.com/tjovicic/gcpcloudrun/source.cue + cp "$DAGGER_WORKSPACE"/dev-cue-package/script.sh "$DAGGER_SANDBOX"/workspace/script.sh # We remove the last line of the script, as bats cannot expand dagger # to dagger() bats helper func inside bash files - sed '$d' < script.sh > tmpFile ; mv tmpFile script.sh + sed '$d' <"$DAGGER_SANDBOX"/workspace/script.sh >"$DAGGER_SANDBOX"/tmpFile + mv "$DAGGER_SANDBOX"/tmpFile "$DAGGER_SANDBOX"/workspace/script.sh + + chmod +x "$DAGGER_SANDBOX"/workspace/script.sh + "$DAGGER_SANDBOX"/workspace/script.sh + + # Sync file from documentation + rsync -a test "$DAGGER_SANDBOX" - chmod +x script.sh - ./script.sh # Command removed from script.sh above - dagger new staging -p ./test - run dagger up -e staging + dagger -w "$DAGGER_SANDBOX" new staging -p "$DAGGER_SANDBOX"/test + run dagger up -w "$DAGGER_SANDBOX" -e staging assert_output --partial "input=run.gcpConfig.serviceKey" + + # Clean script.sh output + rm -rf ./test } diff --git a/docs/learn/tests/helpers.bash b/docs/learn/tests/helpers.bash index b471179f..a59efdc7 100644 --- a/docs/learn/tests/helpers.bash +++ b/docs/learn/tests/helpers.bash @@ -34,21 +34,15 @@ dagger() { "${DAGGER}" "$@" } -# dagger helper to run doc examples in clean environment +# Setup sandbox for dagger example +# It clones the example repository and update Sandbox to setup_example_sandbox() { - # Tell Dagger not to use DAGGER WORKSPACE env var - unset DAGGER_WORKSPACE + git -C "$DAGGER_SANDBOX" clone https://github.com/dagger/examples - export CODEBLOC_SRC="$(pwd)" - local tmpdir=$(mktemp -d) - cd $tmpdir - if [ "$1" = "doc" ]; then - git clone https://github.com/dagger/examples - cd examples/todoapp - cue mod init - fi + export DAGGER_SANDBOX="$DAGGER_SANDBOX"/examples/todoapp } + # copy an environment from the current workspace to the sandbox. # # this is needed if the test requires altering inputs without dirtying the From 99d249403395653d03fa0cb3267d678ae3cf1bd1 Mon Sep 17 00:00:00 2001 From: Guillaume de Rouville Date: Mon, 30 Aug 2021 18:19:00 +0200 Subject: [PATCH 23/24] Fix localstack setup issue on local run Signed-off-by: Guillaume de Rouville --- stdlib/helpers.bash | 1 + stdlib/universe.bats | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/stdlib/helpers.bash b/stdlib/helpers.bash index 252fc5c3..e61da042 100644 --- a/stdlib/helpers.bash +++ b/stdlib/helpers.bash @@ -58,6 +58,7 @@ copy_to_sandbox() { cp -a "$source_package" "$target_package" fi } + # Check if there is a localstack instance. # # This is needed to do docs test in the CI. diff --git a/stdlib/universe.bats b/stdlib/universe.bats index add1cc19..4eb14b2d 100644 --- a/stdlib/universe.bats +++ b/stdlib/universe.bats @@ -11,6 +11,13 @@ setup() { common_setup } +# Instead of setup, this just runs once +setup_file() { + load 'helpers' + + cleanup_localstack +} + @test "cue-sanity-check" { dagger -e sanity-check up } From 3453675a3f04ab83d50f0fd3c418c8ce57fdc841 Mon Sep 17 00:00:00 2001 From: Guillaume de Rouville Date: Wed, 1 Sep 2021 12:14:57 +0200 Subject: [PATCH 24/24] rebase merge conflicts fix Signed-off-by: Guillaume de Rouville --- docs/learn/tests/.dagger/env/cloudformation/values.yaml | 6 +++--- stdlib/universe.bats | 7 ------- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/docs/learn/tests/.dagger/env/cloudformation/values.yaml b/docs/learn/tests/.dagger/env/cloudformation/values.yaml index bd284af1..964732d0 100644 --- a/docs/learn/tests/.dagger/env/cloudformation/values.yaml +++ b/docs/learn/tests/.dagger/env/cloudformation/values.yaml @@ -5,7 +5,7 @@ inputs: awsConfig.accessKey: secret: ENC[AES256_GCM,data:HaGzSQ==,iv:FzsuSq7ZKttWs0WDC0q+vT/hxUx+WcQ4iy7vnV+Q8Dg=,tag:Oy9Xxq+4LMVkXkF/3ZjjsA==,type:str] awsConfig.localMode: - text: "true" + bool: "true" awsConfig.region: text: us-east-2 awsConfig.secretKey: @@ -27,8 +27,8 @@ sops: Lzd0bU1qMXF0dzIzTG05cmlzZURxUncKp2wNXD/HKXgGv16pM/yvaYfWL5lsQyWo CDsT4rHHMZ21XtS9W+7oL9IqMMmDUQf6RZgDgoqLVmTjdBeA8yB2yg== -----END AGE ENCRYPTED FILE----- - lastmodified: "2021-08-20T13:10:08Z" - mac: ENC[AES256_GCM,data:UIhYTG5ofk04dPLOaYiryOt/JC+8/ousZlGpotAAenHOYVo0FChYKywofquOVlpqdC0a/wT6eEz59ofpxDuzV/8/Qh/5MumHqfJUYtQezQYVhreLpWdLsHTn99Ndqjzhj+on9ODumqsAOM+PgVEKRTxSHtTOZB8i4gfO77hg5nk=,iv:E11iRe9z+PxHCy9qtnEYVv+uXVxn1CfAqIgGspd5ObM=,tag:PzORtWy+xVwXof5nbHrDDw==,type:str] + lastmodified: "2021-09-01T09:50:18Z" + mac: ENC[AES256_GCM,data:UsQxbxNq5wTpXIcw2V/LAQxiavwVcJxACSOGO/AWWrpamemOFqrjwHXQ0CfXGTEq16Vw/YnE3W+ivfxhlPQunkzUsxpvAsKexmx1/uDf04cmGQQFHownV8VO/YmKFmo5UKa6V2cEhDXT040iJncRwp8rrJ2nbRBDKd36RBWtIO0=,iv:QEF3brbSZsDAPyTfPRhyv440EtVKlDq1m0bFCBU0Aj8=,tag:RRCQciN3ho7ChAQ5HhTgIA==,type:str] pgp: [] encrypted_suffix: secret version: 3.7.1 diff --git a/stdlib/universe.bats b/stdlib/universe.bats index 4eb14b2d..add1cc19 100644 --- a/stdlib/universe.bats +++ b/stdlib/universe.bats @@ -11,13 +11,6 @@ setup() { common_setup } -# Instead of setup, this just runs once -setup_file() { - load 'helpers' - - cleanup_localstack -} - @test "cue-sanity-check" { dagger -e sanity-check up }