From ea21733da5e4916c6c740e89755708bce6443562 Mon Sep 17 00:00:00 2001 From: peterdeme Date: Tue, 5 Sep 2023 13:34:21 +0200 Subject: [PATCH] Add Stack Dependecies V2 docs Signed-off-by: peterdeme --- CONTRIBUTING.md | 2 + .../Screenshot_Stack_Dependencies_add_ref.png | Bin 0 -> 25124 bytes ...eenshot_Stack_Dependencies_added_input.png | Bin 0 -> 28841 bytes docs/concepts/stack/stack-dependencies.md | 98 +++++++++++++++++- docs/concepts/worker-pools.md | 1 + 5 files changed, 97 insertions(+), 4 deletions(-) create mode 100644 docs/assets/screenshots/Screenshot_Stack_Dependencies_add_ref.png create mode 100644 docs/assets/screenshots/Screenshot_Stack_Dependencies_added_input.png diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 690385723..930bd39e4 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -60,6 +60,8 @@ You can also manually trigger the tests at any time by running: pre-commit ``` +> Tip: one of our precommit checks is `oxipng` which optimizes PNG images. If you don't want to use `pre-commit` locally, you can optimize your PNG images with `docker run --rm -it -v $(PWD):/workdir -w /workdir videah/oxipng docs/assets/screenshots/filename.png --opt=4 --preserve --strip=safe`. + ## Self-Hosted Our self-hosted docs are built using a tool called [Mike](https://github.com/jimporter/mike). Mike allows us to snapshot multiple versions of the documentation in a separate Git branch. In our case this branch is called `self-hosted-releases`. diff --git a/docs/assets/screenshots/Screenshot_Stack_Dependencies_add_ref.png b/docs/assets/screenshots/Screenshot_Stack_Dependencies_add_ref.png new file mode 100644 index 0000000000000000000000000000000000000000..b10a7f76fbc47064384cbd1727d2c27838dff73a GIT binary patch literal 25124 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 MOhKwl;+_Bh0VbxWkN^Mx literal 0 HcmV?d00001 diff --git a/docs/assets/screenshots/Screenshot_Stack_Dependencies_added_input.png b/docs/assets/screenshots/Screenshot_Stack_Dependencies_added_input.png new file mode 100644 index 0000000000000000000000000000000000000000..420ca845aee80ef98012d7989fecfe4da1d3eac9 GIT binary patch literal 28841 zcmce+bx>Si@Gm&HyAvQV=-?XMZEzSQxVyU(+$Fd>L(l{b5L|;xaDoMQcL^-{{`PHc zZPoty-c-$;JKcTyobLO%efxBEw5qZ!1}Z5k006*{14}^w061a*0M-;4_Kh<7>x%Mi zKye1^xB&o!wEw;^auAwx003RoMp9B$PEwLm)z!(;#@+$|07s{NMAB9tCd}7^P&EQz zArej@U<^vyFhVikW}IX|Q9m&0pCh~ISDsu}kQVeRi4`XK&v7BzXq#9PohuZksoAs`N~((`5$*mT z#z_1p03MreaD7xC!uYgP-;oq;&v1qHkVS2vikG3H@m*jaiMNX-zQ-?XTw=(=ueuKZ zU=ChnrVUJIN_t9rXk{ChGX~ulS)uUB2Pl4JU=l$wW$Y&m@9hUi%~5)eO-7@A{2j+S zVk(RI8w{2U+cf z%(_S$9F@jiPCcZOK%9$agiQ?16uecWl#fzB^v5QG?`QnEso~<-I8DKew;eI$%@t*E zg|?MycF_;pLP_xG9nnH5V2DF+m^zLTtJNRMhJX`<0Sf~MHc>)K5&MAcdHvzGS5R7o z{SPe45IpRkLUTk}nqfbwb5f+3?gDHSv6rb9fKLqoU*hEmyQ)PX2;Il2$X^Q68`gya z8R^HlA>(^m(#v#Y3Q3uJtTTOWANDnUZHvFJ`R~oUxR{5e7)TBZWg{L7X*r^Z!RWMz zcn&UbD@1ocssGHq*Rslu_QRamY7^c-DM~p{bdH~rZsAeWW_|#Ta1^2)A~Croy_m5& zGnF4iApH?hC1>1fZGmy_HYj>ec#0(4CZ7H^PA{F{r^@fZoE|I{NgG+0;=)uD{J@y; zN$R=d*_8+l^B*r9qA}Vtk(c8XhYw4lPm#x0ChuMvXqy1bpYwW@jrVH%w5g4a2W#o7 z$pwLZl2u1_{vH^=ruf1tgQ9U2az|fbPA;?(XiQGyO#lz^!lhLf3~=VDsPBo z8)iDRT}GscxH87JM5dfT0N0|JnVT$LcCaLC-@Fl-MVzRl>KCay{qLZBF}A{mDb{O* z-=AR=5oQJyIgsL_>*^So2}ZkV7MZKjtNLwgeX9{f_L#JZ=3@i;qxs0K{$M&IL~f$+ zVHLzp_7ZK_U7UEstwk91y#Et$&kGxG46dd3#^DPym!LC2ElO3DTa@Pm^C7I4I`#?z zlgbqu>3qArIKnfPa+UR^^kr9+gp`kIM1Z#`V48qr;o(Sp>CI$Ra4D1rng=z5jzS%$ zk?K*G!j2U&>B^F&w@qDXeUKg)9ylLB4_wlrrg9g>Qfl|9HmS6!EUAPe((=4JT$(Ai zN;gG6)f+0@Dyk}OX4PlgW_cMI87&#}895jw()byxG;hmuHGK*%)if36l+(TnC~H=> zYJ21yy3FZSI$3jP6O0$6%QF?Se3_e8o<5xsDgQM`Hpge{|9#0;(-y-vW6rQreU@cT z=MZl;c9v=GuF6Q`Y_8B++oqPMg|vaYk~^En(fZnMnn%_~#%9-sb$X@9NBJs?P;OM7 z2^?FaS^Qn+2s%$KAj4bMa3J(3^ho#!@@@X0wyc{|lK0i%TZclMWSfet!k{L-npLH8 z+5}D>tAXNzd`3x5RhyJo!KufpN?%+=T?9%53z?Sa@n!9uZ{N-H4ZN>~Z`;kcgMewP zeWZiEeYP2=*)FS~cZ($b#EKl+PR=8RUM;uIXB+Js7JYXZT@F#Cze#?QD)X+`FFGzd zncL%=(tOZ0bDu6>&|X+v=Ues;zfjwvz-x`JiJmeKALdBeLnlX!O&Zl6w>G=ZBF&D- zmRI7<^3447q2Yr9JJW|{2hYh|+X?PTb|aHD+chf_Q;wge5z=`B4hk`}Gn}KYX*(pN zcUtpWa#~kkNx$an9O<}K$5tOzpZ%V)f3~Mvo?X=cPWzkF!OebQ$*^AXWaYU2xbm3w zcggMPt;CbZZ5}l;wUBI-%xqlCM&V(%D}#HvoA;mcBjOG1S9sjxTUEE{N<biBgcLRua}>OpzsIb1fx9{?Ayz?q_LF`2?>kmHP}^^P{_dRo$=mAa zds?zS`W5m^Pe$~T<7(s4{_^0`;{MBn;$(@o$=y@f@CXT2dJ z9|9N_6S3XOugdARj@@cxwx)4inv|qDN+uC72*QIU3g2lA{IY|JTeBB0ikcG zS^tKMEq{Osg$Y;R?_SNmt=@$Q(YV^!M5)F&@xico9g$r}s0Eavo�Nr8r%7HMS`s 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 D>FUP) literal 0 HcmV?d00001 diff --git a/docs/concepts/stack/stack-dependencies.md b/docs/concepts/stack/stack-dependencies.md index a1237df08..59ed78521 100644 --- a/docs/concepts/stack/stack-dependencies.md +++ b/docs/concepts/stack/stack-dependencies.md @@ -22,6 +22,90 @@ Stack dependencies can be defined in the `Dependencies` tab of the stack. !!! info In order to create a dependency between two stacks you need to have at least **reader** permission to one stack (dependency) and **admin** permission to the other (dependee). See [Spaces Access Control](../spaces/access-control.md#roles) for more information. +### Defining references between stacks + +You have the option to refer to outputs of other stacks: your stack will be only triggered if the referenced output has been created or changed. + +![](../../assets/screenshots/Screenshot_Stack_Dependencies_add_ref.png) + +You can either choose an existing output value or add one that doesn't exist yet but will be created by the stack. On the receiving end, you need to choose an environment variable (`Input name`) to store the output value in. + +![](../../assets/screenshots/Screenshot_Stack_Dependencies_added_input.png) + +!!! tip + If you use Terraform, make sure to use [`TF_VAR_`](https://developer.hashicorp.com/terraform/language/values/variables#environment-variables){: rel="nofollow"} prefix for environment variable names. + +#### Enabling sensitive outputs for references + +A stack output can be sensitive or non-sensitive. For example, in Terraform [you can mark an output](https://developer.hashicorp.com/terraform/language/values/outputs#sensitive-suppressing-values-in-cli-output){: rel="nofollow"} `sensitive = true`. Sensitive outputs are being masked in the Spacelift UI and in the logs. + +Spacelift will upload sensitive outputs to the server - this is enabled by default on our public worker pool. + +On [private worker pools](../../concepts/worker-pools.md) however, it needs to be enabled **explicitly** by adding `SPACELIFT_SENSITIVE_OUTPUT_UPLOAD_ENABLED=true` [environment variable](../../concepts/worker-pools.md#configuration-options) to the worker. This is a requirement if you wish to utilize sensitive outputs for stack dependencies. + +#### Stack dependency reference limitations + +When a stack has an upstream dependency with a reference, it relies on the existence of the outputs. + +```mermaid +graph TD; + Storage --> |TF_VAR_AWS_S3_BUCKET_ARN|storageColor(StorageService); + + style storageColor fill:#51cbad +``` + +If you trigger `StorageService` in the above scenario, you need to make sure `Storage` has produced `TF_VAR_AWS_S3_BUCKET_ARN` already. Otherwise you'll get the following error: + +```plain +job assignment failed: the following inputs are missing: Storage.TF_VAR_AWS_S3_BUCKET_ARN => TF_VAR_AWS_S3_BUCKET_ARN +``` + +!!! note + We have enabled the output uploading to our backend on 2023 August 21. This means that if you have a stack that produced an output before that date, you'll need to rerun it to make the output available for references. + +We upload outputs during the [Apply phase](../run/tracked.md#applying). If you stumble upon the error above, you'll need to make sure that the stack producing the output had a tracked run **with an Apply phase**. + +You can simply do it by adding a dummy output to the stack and removing it afterwards: + +```terraform +output "dummy" { + value = "dummy" +} +``` + +#### Vendor limitations + +[Ansible](../../vendors/ansible/) and [Kubernetes](../../vendors/kubernetes/) does not have the concept of outputs, so you cannot reference the outputs of them. They _can_ be on the receiving end though: + +```mermaid +graph TD; + A[Terraform Stack] --> |VARIABLE_1|B[Kubernetes Stack]; + A --> |VARIABLE_2|C[Ansible Stack]; +``` + +#### Scenario 1 + +```mermaid +graph TD; + Infrastructure --> |TF_VAR_VPC_ID|Database; + Database --> |TF_VAR_CONNECTION_STRING|PaymentService; +``` + +In case your `Infrastructure` stack has a `VPC_ID`, you can set that as an input to your `Database` stack (e.g. `TF_VAR_VPC_ID`). When the `Infrastructure` stack finishes running, the `Database` stack will be triggered and the `TF_VAR_VPC_ID` environment variable will be set to the value of the `VPC_ID` output of the `Infrastructure` stack. + +If there is one or more references defined, the stack will only be triggered if the referenced output has been created or changed. If they remain the same, the downstream stack will be skipped. + +#### Scenario 2 + +```mermaid +graph TD; + Infrastructure --> |TF_VAR_VPC_ID|Database; + Database --> |TF_VAR_CONNECTION_STRING|PaymentService; + Database --> CartService; +``` + +You can also mix references and referenceless dependencies. In the above case, `CartService` will be triggered whenever `Database` finishes running, regardless of the `TF_VAR_CONNECTION_STRING` output. + ## Dependencies overview In the `Dependencies` tab of the stack, there is a button called `Dependencies graph` to view the full dependency graph of the stack. @@ -30,7 +114,7 @@ In the `Dependencies` tab of the stack, there is a button called `Dependencies g ## How it works -Stack dependencies are directed acyclic graphs ([DAGs](https://wikipedia.org/wiki/Directed_acyclic_graph)). This means that a stack +Stack dependencies are directed acyclic graphs ([DAGs](https://wikipedia.org/wiki/Directed_acyclic_graph){: rel="nofollow"}). This means that a stack can depend on multiple stacks, and a stack can be depended on by multiple stacks but there cannot be loops: you will receive an error if you try to add a stack to a dependency graph that will create a cycle. @@ -73,7 +157,7 @@ graph TD; baseInfraColor(BaseInfra)-->databaseColor(Database); baseInfraColor(BaseInfra)-->networkColor(Network); baseInfraColor(BaseInfra)-->storageColor(Storage); - databaseColor(Database)-->paymentSvcColor(PaymentService); + databaseColor(Database)-->|TF_VAR_CONNECTION_STRING|paymentSvcColor(PaymentService); networkColor(Network)-->paymentSvcColor(PaymentService); databaseColor(Database)-->cartSvcColor(CartService); networkColor(Network)-->cartSvcColor(CartService); @@ -90,9 +174,11 @@ If `BaseInfra` receives a push event, it will start running immediately and queu _all_ of the stacks below. The order of the runs: `BaseInfra`, then `Database` & `Network` & `Storage` in parallel, finally `PaymentService` & `CartService` in parallel. -Note: since `PaymentService` and `CartService` does not depend on `Storage`, they will not +Since `PaymentService` and `CartService` does not depend on `Storage`, they will not wait until it finishes running. +Note: `PaymentService` references `Database` with `TF_VAR_CONNECTION_STRING`. But since it also depends on `Network` with no references, it'll run regardless of the `TF_VAR_CONNECTION_STRING` output. If the `Database` stack does not have the corresponding output, the `TF_VAR_CONNECTION_STRING` environment variable will not be injected into the run. + ### Scenario 3 ```mermaid @@ -154,6 +240,7 @@ graph TD; networkColor(Network)-->paymentSvcColor(PaymentService); databaseColor(Database)-->cartSvcColor(CartService); networkColor(Network)-->cartSvcColor(CartService); + storageColor(Storage)-->|TF_VAR_AWS_S3_BUCKET_ARN|storageSvcColor(StorageService); style baseInfraColor fill:#51cbad style networkColor fill:#51abcb @@ -161,15 +248,18 @@ graph TD; style cartSvcColor fill:#51abcb style storageColor fill:#51abcb style databaseColor fill:#51cbad + style storageSvcColor fill:#ecd309 ``` If `BaseInfra` and `Database` are a monorepo and a push event affects both of them, this scenario isn't any different than [Scenario 2](#scenario-2) and [Scenario 4](#scenario-4). The order from top to bottom is still the same: `BaseInfra` first, then `Database` & `Network` & `Storage` in parallel, finally `PaymentService` & `CartService` in parallel. +`Storage` and `StorageService`: let's say that the S3 bucket resource of `Storage` already exists. This means that the bucket ARN didn't change, so `StorageService` will be skipped. + ## Trigger policies Stack dependencies are a simpler alternative to [Trigger policies](../policy/trigger-policy.md) that cover most use cases. If your use case does not fit Stack dependencies, consider using a Trigger policy. -There is no connection between the two features, and **the two shouldn't be combined** to avoid confusion. +There is no connection between the two features, and **the two shouldn't be combined** to avoid confusion or even infinite loops in the dependency graph. ## Stack deletion diff --git a/docs/concepts/worker-pools.md b/docs/concepts/worker-pools.md index dc5350a16..2601dc2ee 100644 --- a/docs/concepts/worker-pools.md +++ b/docs/concepts/worker-pools.md @@ -369,6 +369,7 @@ A number of configuration variables is available to customize how your launcher - `SPACELIFT_DOCKER_CONFIG_DIR` - if set, the value of this variable will point to the directory containing Docker configuration, which includes credentials for private Docker registries. Private workers can populate this directory for example by executing `docker login` before the launcher process is started; - `SPACELIFT_MASK_ENVS`- comma-delimited list of whitelisted environment variables that are passed to the workers but should never appear in the logs; +- `SPACELIFT_SENSITIVE_OUTPUT_UPLOAD_ENABLED` - If set to `true`, the launcher will upload sensitive run outputs to the Spacelift backend. This is a requirement if want to use sensitive outputs for [stack dependencies](./stack/stack-dependencies.md); - `SPACELIFT_WORKER_NETWORK` - network ID/name to connect the launched worker containers, defaults to `bridge`; - `SPACELIFT_WORKER_EXTRA_MOUNTS` - additional files or directories to be mounted to the launched worker docker containers during **either read or write runs**, as a comma-separated list of mounts in the form of `/host/path:/container/path`; - `SPACELIFT_WORKER_WO_EXTRA_MOUNTS` - Additional directories to be mounted to the worker docker container during **write only runs**, as a comma separated list of mounts in the form of `/host/path:/container/path`;