From 70cff9ff4a90b33ebfa2eb84ccccf473b290562d Mon Sep 17 00:00:00 2001 From: Giovanni Liva Date: Thu, 2 Nov 2023 15:56:01 +0100 Subject: [PATCH] docs: unify styling of implementing folder (#2398) --- .../contribute/software/dev-environ/_index.md | 2 +- .../components/metrics-operator.md | 2 +- .../docs/architecture/components/scheduler.md | 4 +-- .../en/docs/architecture/keptn-apps.md | 6 ++-- .../getting-started/lifecycle-management.md | 4 +-- .../en/docs/getting-started/observability.md | 4 +-- .../assets/app-updated-version.yaml | 0 .../assets/app-with-new-workload.yaml | 0 .../assets/deployment-initial.yaml | 0 .../deployment-new-image-and-version.yaml | 0 .../assets/deployment-new-image.yaml | 0 .../assets/new-deployment.yaml | 0 .../{integrate => }/assets/trace.png | Bin .../_index.md => day-2-operations.md} | 20 +++++------ .../implementing/{dora/_index.md => dora.md} | 4 +-- .../dora/assets/dynatrace_dora_dashboard.png | Bin 33750 -> 0 bytes .../en/docs/implementing/evaluatemetrics.md | 2 +- .../en/docs/implementing/evaluations.md | 2 +- .../{integrate/_index.md => integrate.md} | 34 +++++++++--------- docs/content/en/docs/implementing/otel.md | 4 +-- ...x.md => restart-application-deployment.md} | 4 +-- .../implementing/{slo/_index.md => slo.md} | 10 +++--- .../docs/implementing/tasks-non-k8s-apps.md | 4 +-- .../{tasks/_index.md => tasks.md} | 26 +++++++------- docs/content/en/docs/install/install.md | 4 +-- docs/content/en/docs/install/k8s.md | 2 +- docs/content/en/docs/intro/_index.md | 6 ++-- .../en/docs/intro/usecase-observability.md | 4 +-- .../en/docs/intro/usecase-orchestrate.md | 6 ++-- .../en/docs/migrate/metrics-observe.md | 4 +-- docs/content/en/docs/migrate/strategy.md | 6 ++-- docs/content/en/docs/yaml-crd-ref/analysis.md | 4 +-- .../docs/yaml-crd-ref/analysisdefinition.md | 4 +-- .../yaml-crd-ref/analysisvaluetemplate.md | 6 ++-- docs/content/en/docs/yaml-crd-ref/app.md | 14 ++++---- docs/content/en/docs/yaml-crd-ref/config.md | 2 +- docs/content/en/docs/yaml-crd-ref/task.md | 2 +- .../en/docs/yaml-crd-ref/taskdefinition.md | 14 ++++---- docs/layouts/shortcodes/docsembed.html | 6 ++++ 39 files changed, 111 insertions(+), 105 deletions(-) rename docs/content/en/docs/implementing/{day-2-operations => }/assets/app-updated-version.yaml (100%) rename docs/content/en/docs/implementing/{day-2-operations => }/assets/app-with-new-workload.yaml (100%) rename docs/content/en/docs/implementing/{day-2-operations => }/assets/deployment-initial.yaml (100%) rename docs/content/en/docs/implementing/{day-2-operations => }/assets/deployment-new-image-and-version.yaml (100%) rename docs/content/en/docs/implementing/{day-2-operations => }/assets/deployment-new-image.yaml (100%) rename docs/content/en/docs/implementing/{day-2-operations => }/assets/new-deployment.yaml (100%) rename docs/content/en/docs/implementing/{integrate => }/assets/trace.png (100%) rename docs/content/en/docs/implementing/{day-2-operations/_index.md => day-2-operations.md} (89%) rename docs/content/en/docs/implementing/{dora/_index.md => dora.md} (94%) delete mode 100644 docs/content/en/docs/implementing/dora/assets/dynatrace_dora_dashboard.png rename docs/content/en/docs/implementing/{integrate/_index.md => integrate.md} (92%) rename docs/content/en/docs/implementing/{restart-application-deployment/_index.md => restart-application-deployment.md} (98%) rename docs/content/en/docs/implementing/{slo/_index.md => slo.md} (94%) rename docs/content/en/docs/implementing/{tasks/_index.md => tasks.md} (92%) create mode 100644 docs/layouts/shortcodes/docsembed.html diff --git a/docs/content/en/contribute/software/dev-environ/_index.md b/docs/content/en/contribute/software/dev-environ/_index.md index 477351b70c..430d20ec17 100644 --- a/docs/content/en/contribute/software/dev-environ/_index.md +++ b/docs/content/en/contribute/software/dev-environ/_index.md @@ -57,7 +57,7 @@ you also see the `runtimes` directory. This defines the runners that you can use when defining tasks to be run either pre- or post-deployment. These are discussed in -[Runners and containers](../../../docs/implementing/tasks/#runners-and-containers). +[Runners and containers](../../../docs/implementing/tasks.md#runners-and-containers). ## Install software diff --git a/docs/content/en/docs/architecture/components/metrics-operator.md b/docs/content/en/docs/architecture/components/metrics-operator.md index c24e566f57..70be601a7c 100644 --- a/docs/content/en/docs/architecture/components/metrics-operator.md +++ b/docs/content/en/docs/architecture/components/metrics-operator.md @@ -27,7 +27,7 @@ so they are compatible with the Kubernetes (HPA), which enables the horizontal scaling of workloads based on metrics collected from multiple observability platforms. See -[Using the HorizontalPodAutoscaler](../../implementing/evaluatemetrics.md/#using-the-horizontalpodautoscaler) +[Using the HorizontalPodAutoscaler](../../implementing/evaluatemetrics.md#using-the-horizontalpodautoscaler) for instructions. The Metrics Operator consists of the following components: diff --git a/docs/content/en/docs/architecture/components/scheduler.md b/docs/content/en/docs/architecture/components/scheduler.md index 1599b2c4f8..929eb5d433 100644 --- a/docs/content/en/docs/architecture/components/scheduler.md +++ b/docs/content/en/docs/architecture/components/scheduler.md @@ -23,7 +23,7 @@ to gate Pods until the required deployment checks pass. When you apply a workload to a K8s cluster, the Mutating Webhook checks each Pod for annotations to see if it is annotated with -[Keptn specific annotations](../../implementing/integrate/_index.md#basic-annotations). +[Keptn specific annotations](../../implementing/integrate.md#basic-annotations). If the annotations are present, the Webhook adds a gate to the Pod called `keptn-prechecks-gate`. This spec tells the Kubernetes scheduling framework to wait for the Keptn checks before assigning the pod to a node. @@ -64,7 +64,7 @@ a [Permit plugin](https://kubernetes.io/docs/concepts/scheduling-eviction/schedu ### How does the Keptn Scheduler works Firstly the Mutating Webhook checks for annotations on Pods to see if it is annotated with -[Keptn specific annotations](../../implementing/integrate/#basic-annotations). +[Keptn specific annotations](../../implementing/integrate.md#basic-annotations). If the annotations are present, the Webhook assigns the **Keptn Scheduler** to the Pod. This ensures that the Keptn Scheduler only gets Pods that have been annotated for it. A Pod `test-pod` modified by the Mutating Webhook looks as follows: diff --git a/docs/content/en/docs/architecture/keptn-apps.md b/docs/content/en/docs/architecture/keptn-apps.md index 5aec265a2b..8a4ae11823 100644 --- a/docs/content/en/docs/architecture/keptn-apps.md +++ b/docs/content/en/docs/architecture/keptn-apps.md @@ -64,12 +64,12 @@ plus specific tasks and evaluations that you define for the `KeptnApp` resource itself: * The annotations described in - [Basic annotations](../implementing/integrate/#basic-annotations) + [Basic annotations](../implementing/integrate.md#basic-annotations) are used to automatically generate `KeptnApp` resources that contain the identifications required to run the Keptn observability features. * You must manually add the annotations described in - [Pre- and post-deployment checks](../implementing/integrate/#pre--and-post-deployment-checks) + [Pre- and post-deployment checks](../implementing/integrate.md#pre--and-post-deployment-checks) to the basic `KeptnApp` manifest to define the evaluations and tasks you want to run pre- and post-deployment. @@ -91,7 +91,7 @@ resource. ## How basic annotations are implemented -The [Basic annotations](../implementing/integrate/#basic-annotations) +The [Basic annotations](../implementing/integrate.md#basic-annotations) page gives instructions for applying the annotations or labels that identify the pods that Keptn should manage. diff --git a/docs/content/en/docs/getting-started/lifecycle-management.md b/docs/content/en/docs/getting-started/lifecycle-management.md index 111b748826..0a0175b553 100644 --- a/docs/content/en/docs/getting-started/lifecycle-management.md +++ b/docs/content/en/docs/getting-started/lifecycle-management.md @@ -23,7 +23,7 @@ When Keptn is successfully monitoring your deployments, it can also run arbitrar - post-deployment (after the post is scheduled) > Pre and post deployments can also run on a KeptnApp level. -> See [annotations to KeptnApp](../implementing/integrate/_index.md#annotations-to-keptnapp) +> See [annotations to KeptnApp](../implementing/integrate.md#annotations-to-keptnapp) ## Prerequisites: Deploy webhook sink @@ -219,7 +219,7 @@ Do this by using the `keptn.sh/pre-deployment-tasks` label. ## Further Information There is a lot more you can do with KeptnTasks. -See [pre and post deployment checks page](../implementing/integrate#pre--and-post-deployment-checks) to find out more. +See [pre and post deployment checks page](../implementing/integrate.md#pre--and-post-deployment-checks) to find out more. ## What's next? diff --git a/docs/content/en/docs/getting-started/observability.md b/docs/content/en/docs/getting-started/observability.md index 8b29c360fd..d11c78997f 100644 --- a/docs/content/en/docs/getting-started/observability.md +++ b/docs/content/en/docs/getting-started/observability.md @@ -525,7 +525,7 @@ spec: that failed to deploy, perhaps because a `preDeploymentEvaluation` or `preDeploymentTask` failed. See - [Restart an Application Deployment](../implementing/restart-application-deployment/) + [Restart an Application Deployment](../implementing/restart-application-deployment.md) for a longer discussion of this. - **workloads** - **name** - name of this Kubernetes @@ -595,4 +595,4 @@ See [KeptnApp Reference page](../yaml-crd-ref/app.md) for more information. Keptn can run pre and post deployment tasks and SLO evaluations automatically. -Continue the Keptn learning journey by [adding deployment tasks](../implementing/tasks). +Continue the Keptn learning journey by [adding deployment tasks](../implementing/tasks.md). diff --git a/docs/content/en/docs/implementing/day-2-operations/assets/app-updated-version.yaml b/docs/content/en/docs/implementing/assets/app-updated-version.yaml similarity index 100% rename from docs/content/en/docs/implementing/day-2-operations/assets/app-updated-version.yaml rename to docs/content/en/docs/implementing/assets/app-updated-version.yaml diff --git a/docs/content/en/docs/implementing/day-2-operations/assets/app-with-new-workload.yaml b/docs/content/en/docs/implementing/assets/app-with-new-workload.yaml similarity index 100% rename from docs/content/en/docs/implementing/day-2-operations/assets/app-with-new-workload.yaml rename to docs/content/en/docs/implementing/assets/app-with-new-workload.yaml diff --git a/docs/content/en/docs/implementing/day-2-operations/assets/deployment-initial.yaml b/docs/content/en/docs/implementing/assets/deployment-initial.yaml similarity index 100% rename from docs/content/en/docs/implementing/day-2-operations/assets/deployment-initial.yaml rename to docs/content/en/docs/implementing/assets/deployment-initial.yaml diff --git a/docs/content/en/docs/implementing/day-2-operations/assets/deployment-new-image-and-version.yaml b/docs/content/en/docs/implementing/assets/deployment-new-image-and-version.yaml similarity index 100% rename from docs/content/en/docs/implementing/day-2-operations/assets/deployment-new-image-and-version.yaml rename to docs/content/en/docs/implementing/assets/deployment-new-image-and-version.yaml diff --git a/docs/content/en/docs/implementing/day-2-operations/assets/deployment-new-image.yaml b/docs/content/en/docs/implementing/assets/deployment-new-image.yaml similarity index 100% rename from docs/content/en/docs/implementing/day-2-operations/assets/deployment-new-image.yaml rename to docs/content/en/docs/implementing/assets/deployment-new-image.yaml diff --git a/docs/content/en/docs/implementing/day-2-operations/assets/new-deployment.yaml b/docs/content/en/docs/implementing/assets/new-deployment.yaml similarity index 100% rename from docs/content/en/docs/implementing/day-2-operations/assets/new-deployment.yaml rename to docs/content/en/docs/implementing/assets/new-deployment.yaml diff --git a/docs/content/en/docs/implementing/integrate/assets/trace.png b/docs/content/en/docs/implementing/assets/trace.png similarity index 100% rename from docs/content/en/docs/implementing/integrate/assets/trace.png rename to docs/content/en/docs/implementing/assets/trace.png diff --git a/docs/content/en/docs/implementing/day-2-operations/_index.md b/docs/content/en/docs/implementing/day-2-operations.md similarity index 89% rename from docs/content/en/docs/implementing/day-2-operations/_index.md rename to docs/content/en/docs/implementing/day-2-operations.md index 3875366e4b..df92e2e4ec 100644 --- a/docs/content/en/docs/implementing/day-2-operations/_index.md +++ b/docs/content/en/docs/implementing/day-2-operations.md @@ -5,7 +5,7 @@ weight: 500 --- After you have successfully rolled out your application by following -the instructions in the [integration guide](../integrate), +the instructions in the [integration guide](./integrate.md), Keptn also assists you with day 2 operations for your application. Tasks that fall under this category include: @@ -13,11 +13,11 @@ Tasks that fall under this category include: * Updating the version of one or more [workloads](https://kubernetes.io/docs/concepts/workloads/) that are part of the same application * Adding a new [workload](https://kubernetes.io/docs/concepts/workloads/) to an existing application -* Monitoring the health of your application using `KeptnMetrics`, as described [here](../evaluatemetrics.md) +* Monitoring the health of your application using `KeptnMetrics`, as described [here](./evaluatemetrics.md) * Optimizing the resource usage of your applications by integrating `KeptnMetrics` into a [HorizontalPodAutoscaler (HPA)](https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/), -as described [here](../evaluatemetrics.md/#using-the-horizontalpodautoscaler) +as described [here](./evaluatemetrics.md/#using-the-horizontalpodautoscaler) ## Updating Workload Versions @@ -46,7 +46,7 @@ let's assume the following example, including a [workload](https://kubernetes.io/docs/concepts/workloads/) called `podtato-head-frontend` that includes a pre-task and a pre-evaluation. -{{< embed path="/docs/content/en/docs/implementing/day-2-operations/assets/deployment-initial.yaml" >}} +{{< docsembed path="content/en/docs/implementing/assets/deployment-initial.yaml" >}} Now, let's assume that the configuration of that [workload](https://kubernetes.io/docs/concepts/workloads/) needs to be changed. In this example we assume that the image of that [workload](https://kubernetes.io/docs/concepts/workloads/) @@ -59,7 +59,7 @@ of the result of any task or evaluation, e.g., when the previously used image ha and the image must be updated as quickly as possible. To do that, change `podtato-head-frontend` as follows: -{{< embed path="/docs/content/en/docs/implementing/day-2-operations/assets/deployment-new-image.yaml" >}} +{{< docsembed path="content/en/docs/implementing/assets/deployment-new-image.yaml" >}} * **Update the configuration *and* the version label:** Doing so causes the `KeptnWorkload` that is associated @@ -68,7 +68,7 @@ and therefore the pre-task `my-task` and pre-evaluation `my-evaluation` are executed before the updated pods are scheduled. In this case, the deployment should be changed as follows: -{{< embed path="/docs/content/en/docs/implementing/day-2-operations/assets/deployment-new-image-and-version.yaml" >}} +{{< docsembed path="content/en/docs/implementing/assets/deployment-new-image-and-version.yaml" >}} If you have defined the related `KeptnApp` resource yourself, this must also be updated to refer to the updated `KeptnWorkload`. @@ -77,14 +77,14 @@ this updated deployment is not able to progress otherwise. Therefore, make sure that the version of `podtato-head-frontend` is updated accordingly: -{{< embed path="/docs/content/en/docs/implementing/day-2-operations/assets/app-updated-version.yaml" >}} +{{< docsembed path="content/en/docs/implementing/assets/app-updated-version.yaml" >}} Updating the `KeptnApp` also causes all pre-/post-tasks/evaluations of the `KeptnApp` to be executed again. In this example, this means that the tasks `wait-for-prometheus`, and `post-deployment-loadtests` will run again. -If you are using the [automatic app discovery](../integrate#use-keptn-automatic-app-discovery), +If you are using the [automatic app discovery](./integrate.md#use-keptn-automatic-app-discovery), you do not need to update the `KeptnApp` resource. Keptn will take care of that for you. @@ -133,7 +133,7 @@ For example, to add the deployment `podtato-head-left-leg` to the `podtato-head` application, the configuration for that new deployment would look like this, with the required label being set: -{{< embed path="/docs/content/en/docs/implementing/day-2-operations/assets/new-deployment.yaml" >}} +{{< docsembed path="content/en/docs/implementing/assets/new-deployment.yaml" >}} The `KeptnApp`, if defined by the user, should contain the reference to the newly added [workload](https://kubernetes.io/docs/concepts/workloads/). @@ -142,7 +142,7 @@ progress if it is not part of a `KeptnApp`. For automatically discovered apps this is done automatically. -{{< embed path="/docs/content/en/docs/implementing/day-2-operations/assets/app-with-new-workload.yaml" >}} +{{< docsembed path="content/en/docs/implementing/assets/app-with-new-workload.yaml" >}} After applying the updated manifests, you can monitor the status of the application and related [workloads](https://kubernetes.io/docs/concepts/workloads/) using the following commands: diff --git a/docs/content/en/docs/implementing/dora/_index.md b/docs/content/en/docs/implementing/dora.md similarity index 94% rename from docs/content/en/docs/implementing/dora/_index.md rename to docs/content/en/docs/implementing/dora.md index 943686d61e..dcb9a218ff 100644 --- a/docs/content/en/docs/implementing/dora/_index.md +++ b/docs/content/en/docs/implementing/dora.md @@ -21,7 +21,7 @@ DORA metrics provide information such as: Keptn starts collecting these metrics as soon as you apply -[basic annotations](../integrate/#basic-annotations) +[basic annotations](./integrate.md#basic-annotations) to the [Workload](https://kubernetes.io/docs/concepts/workloads/) resources @@ -59,4 +59,4 @@ DORA metrics are also displayed on Grafana or whatever dashboard application you choose. For example: -![DORA metrics](assets/dynatrace_dora_dashboard.png) +![DORA metrics](../assets/dynatrace_dora_dashboard.png) diff --git a/docs/content/en/docs/implementing/dora/assets/dynatrace_dora_dashboard.png b/docs/content/en/docs/implementing/dora/assets/dynatrace_dora_dashboard.png deleted file mode 100644 index 3318a4303f42d17c927685682e83788c8ee15936..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33750 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

@Za7i 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 G^#1@$%K}UQ diff --git a/docs/content/en/docs/implementing/evaluatemetrics.md b/docs/content/en/docs/implementing/evaluatemetrics.md index 9d85997108..61c2430cf5 100644 --- a/docs/content/en/docs/implementing/evaluatemetrics.md +++ b/docs/content/en/docs/implementing/evaluatemetrics.md @@ -56,7 +56,7 @@ To configure a data provider into your Keptn cluster: 1. Create a secret if your data provider uses one. See - [Create secret text](../implementing/tasks/#create-secret-text). + [Create secret text](./tasks.md#create-secret-text). 1. Install and configure each instance of each data provider into your Keptn cluster, following the instructions provided by the data source provider. diff --git a/docs/content/en/docs/implementing/evaluations.md b/docs/content/en/docs/implementing/evaluations.md index 895a460f3e..4645f1fd21 100644 --- a/docs/content/en/docs/implementing/evaluations.md +++ b/docs/content/en/docs/implementing/evaluations.md @@ -44,7 +44,7 @@ you must: pre- and post-deployment evaluations for the `KeptnApp` itself. See -[Pre- and post-deployment checks](../implementing/integrate/#pre--and-post-deployment-checks) +[Pre- and post-deployment checks](./integrate.md#pre--and-post-deployment-checks) for details. Note the following: diff --git a/docs/content/en/docs/implementing/integrate/_index.md b/docs/content/en/docs/implementing/integrate.md similarity index 92% rename from docs/content/en/docs/implementing/integrate/_index.md rename to docs/content/en/docs/implementing/integrate.md index e4f449af05..2b76070db0 100644 --- a/docs/content/en/docs/implementing/integrate/_index.md +++ b/docs/content/en/docs/implementing/integrate.md @@ -20,9 +20,9 @@ to identify the workloads of interest. To integrate Keptn with your applications: * You must first -[install](../../install/install.md) +[install](../install/install.md) and -[enable](../../install/install.md//#enable-keptn-for-your-cluster) +[enable](../install/install.md//#enable-keptn-for-your-cluster) Keptn. * Annotate or label your workloads with either Keptn or Kubernetes keys. @@ -33,9 +33,9 @@ with either Keptn or Kubernetes keys. are required only for the Release lifecycle management feature. Keptn uses these annotations to the Kubernetes workloads to create the -[KeptnWorkload](../../crd-ref/lifecycle/v1alpha3/#keptnworkload) +[KeptnWorkload](../crd-ref/lifecycle/v1alpha3/#keptnworkload) and -[KeptnApp](../../yaml-crd-ref/app.md) +[KeptnApp](../yaml-crd-ref/app.md) resources that it uses to provide observability and release lifecycle management. @@ -62,9 +62,9 @@ resources in the namespaces where Keptn is enabled. If Keptn finds any of these resources and the resource has either the `keptn.sh` or the `kubernetes` annotations/labels, it creates appropriate -[KeptnWorkload](../../crd-ref/lifecycle/v1alpha3/#keptnworkload) +[KeptnWorkload](../crd-ref/lifecycle/v1alpha3/#keptnworkload) and -[KeptnApp](../../yaml-crd-ref/app.md) +[KeptnApp](../yaml-crd-ref/app.md) resources for the version it detects. The basic keptn.sh keys that can be used for annotations or labels are: @@ -89,7 +89,7 @@ These keys are defined as: * `keptn.sh/workload` or `app.kubernetes.io/name`: Determines the name of the generated - [KeptnWorkload](../../crd-ref/lifecycle/v1alpha3/#keptnworkload) + [KeptnWorkload](../crd-ref/lifecycle/v1alpha3/#keptnworkload) resource. * `keptn.sh/version` or `app.kubernetes.io/version`: Determines the version of the `KeptnWorkload` @@ -104,7 +104,7 @@ These keys are defined as: are consolidated into the same `KeptnApp` resource. Keptn automatically generates appropriate -[KeptnApp](../../yaml-crd-ref/app.md) +[KeptnApp](../yaml-crd-ref/app.md) resources that are used for observability, based on whether the `keptn.sh/app` or `app.kubernetes.io/part-of` annotation/label is populated: @@ -122,7 +122,7 @@ annotation/label is populated: but not the combined workloads that constitute your deployed application. See -[Keptn Applications and Keptn Workloads](../../architecture/keptn-apps.md) +[Keptn Applications and Keptn Workloads](../architecture/keptn-apps.md) for architectural information about how `KeptnApp` and `KeptnWorkloads` are implemented. @@ -173,19 +173,19 @@ that handles pre- and post-deployment evaluations and tasks, do the following: * Define the - [KeptnMetric](../../yaml-crd-ref/metric.md) + [KeptnMetric](../yaml-crd-ref/metric.md) and - [KeptnEvaluationDefinition](../../yaml-crd-ref/evaluationdefinition.md) + [KeptnEvaluationDefinition](../yaml-crd-ref/evaluationdefinition.md) resources for each evaluation you want. A `KeptnEvaluationDefinition` compares the value of a `KeptnMetric` to the threshold that is specified. * You will also need to define the necessary - [KeptnMetricsProvider](../../yaml-crd-ref/metricsprovider.md) + [KeptnMetricsProvider](../yaml-crd-ref/metricsprovider.md) and resource for each instance of each data source used for the `KeptnEvaluationDefinition` resources you define. * Define a - [KeptnTaskDefinition](../../yaml-crd-ref/taskdefinition.md) + [KeptnTaskDefinition](../yaml-crd-ref/taskdefinition.md) resource for each task you want to execute. `KeptnTaskDefinition` resources contain re-usable "functions" that can execute before and after the deployment. @@ -195,7 +195,7 @@ do the following: The deployment is kept in a pending state until the infrastructure is capable of accepting deployments again. See - [Working with Keptn tasks](../tasks) + [Working with Keptn tasks](./tasks.md) for more information. * Annotate your [Workloads](https://kubernetes.io/docs/concepts/workloads/) [Deployments](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/), @@ -205,7 +205,7 @@ do the following: to include each evaluation and task you want run for specific workloads. * Manually edit all - [KeptnApp](../../yaml-crd-ref/app.md) resources + [KeptnApp](../yaml-crd-ref/app.md) resources to specify evaluations and tasks to be run for the `KeptnApp` itself. ### Annotations to KeptnApp @@ -228,7 +228,7 @@ keptn.sh/post-deployment-tasks: <`TaskDefinition`-name> The value of these annotations corresponds to the name of Keptn [resources](https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/) called -[KeptnTaskDefinition](../../yaml-crd-ref/taskdefinition.md) +[KeptnTaskDefinition](../yaml-crd-ref/taskdefinition.md) resources These resources contain re-usable "functions" that can execute before and after the deployment. @@ -350,7 +350,7 @@ you get observability of your application's deployments by using the OpenTelemetry tracing features that are provided by Keptn: -![Application deployment trace](assets/trace.png) +![Application deployment trace](../assets/trace.png) ## Example of pre- and post-deployment actions diff --git a/docs/content/en/docs/implementing/otel.md b/docs/content/en/docs/implementing/otel.md index 6a3e07e0b5..4de827bd57 100644 --- a/docs/content/en/docs/implementing/otel.md +++ b/docs/content/en/docs/implementing/otel.md @@ -54,7 +54,7 @@ DORA metrics provide information such as: Keptn starts collecting these metrics as soon as you apply -[basic annotations](integrate/#basic-annotations) +[basic annotations](./integrate.md#basic-annotations) to the [workload](https://kubernetes.io/docs/concepts/workloads/). Metrics are collected only for the resources that are annotated. @@ -140,7 +140,7 @@ you must have the following on your cluster: To integrate OpenTelemetry into Keptn: - Apply - [basic annotations](../implementing/integrate/#basic-annotations) + [basic annotations](./integrate.md#basic-annotations) for your `Deployment` resource to integrate Keptn into your Kubernetes cluster. - To expose OpenTelemetry metrics, diff --git a/docs/content/en/docs/implementing/restart-application-deployment/_index.md b/docs/content/en/docs/implementing/restart-application-deployment.md similarity index 98% rename from docs/content/en/docs/implementing/restart-application-deployment/_index.md rename to docs/content/en/docs/implementing/restart-application-deployment.md index cd2f6a0c13..d5dea4e507 100644 --- a/docs/content/en/docs/implementing/restart-application-deployment/_index.md +++ b/docs/content/en/docs/implementing/restart-application-deployment.md @@ -6,11 +6,11 @@ weight: 100 hidechildren: false # this flag hides all sub-pages in the sidebar-multicard.html --- -A [KeptnApp](../../yaml-crd-ref/app.md) can fail +A [KeptnApp](../yaml-crd-ref/app.md) can fail because of an unsuccessful pre-deployment evaluation or pre-deployment task. For example, this happens if the target value of a -[KeptnEvaluationDefinition](../../yaml-crd-ref/evaluationdefinition.md) +[KeptnEvaluationDefinition](../yaml-crd-ref/evaluationdefinition.md) resource is misconfigured or a pre-deployment evaluation checks the wrong URL. diff --git a/docs/content/en/docs/implementing/slo/_index.md b/docs/content/en/docs/implementing/slo.md similarity index 94% rename from docs/content/en/docs/implementing/slo/_index.md rename to docs/content/en/docs/implementing/slo.md index 17ce34794f..886c775633 100644 --- a/docs/content/en/docs/implementing/slo/_index.md +++ b/docs/content/en/docs/implementing/slo.md @@ -35,7 +35,7 @@ For more information,see: * [SLO converter](https://github.com/keptn/lifecycle-toolkit/blob/main/metrics-operator/converter/slo_converter.md#slo-converter) * [SLI converter](https://github.com/keptn/lifecycle-toolkit/blob/main/metrics-operator/converter/sli_converter.md#sli-converter) -* [Migrate Quality Gates](../../migrate/metrics-observe.md) +* [Migrate Quality Gates](../migrate/metrics-observe.md) The Analysis result is exposed as an OpenTelemetry metric and can be displayed on dashboard tools, such as Grafana. @@ -44,7 +44,7 @@ and can be displayed on dashboard tools, such as Grafana. A Keptn Analysis is implemented with three resources: -* [AnalysisValueTemplate](../../yaml-crd-ref/analysisvaluetemplate.md) +* [AnalysisValueTemplate](../yaml-crd-ref/analysisvaluetemplate.md) defines the SLI with the `KeptnMetricsProvider` (data source) and the query to perform for each SLI @@ -53,11 +53,11 @@ A Keptn Analysis is implemented with three resources: One `Analysis` can use data from multiple instances of multiple types of data provider; you must define a - [KeptnMetricsProvider](../../yaml-crd-ref/metricsprovider.md) + [KeptnMetricsProvider](../yaml-crd-ref/metricsprovider.md) resource for each instance of each data provider you are using. The template refers to that provider and queries it. -* [AnalysisDefinition](../../yaml-crd-ref/analysisdefinition.md) +* [AnalysisDefinition](../yaml-crd-ref/analysisdefinition.md) define the list of SLOs for an `Analysis` An `AnalysisDefinition` resource contains a list of objectives to satisfy. @@ -71,7 +71,7 @@ A Keptn Analysis is implemented with three resources: defining the data provider from which to gather the data and how to compute the Analysis -* [Analysis](../../yaml-crd-ref/analysis.md) +* [Analysis](../yaml-crd-ref/analysis.md) define the specific configurations and the Analysis to report. An `Analysis` resource customizes the templates diff --git a/docs/content/en/docs/implementing/tasks-non-k8s-apps.md b/docs/content/en/docs/implementing/tasks-non-k8s-apps.md index 4b98580e34..03c9f07cd8 100644 --- a/docs/content/en/docs/implementing/tasks-non-k8s-apps.md +++ b/docs/content/en/docs/implementing/tasks-non-k8s-apps.md @@ -33,7 +33,7 @@ When you have Keptn installed, create a YAML file that defines what you want to execute as a `KeptnTaskDefinition` resource. See -[Deployment tasks](../implementing/tasks/) +[Deployment tasks](./tasks.md) and the [KeptnTaskDefinition](../yaml-crd-ref/taskdefinition.md/) reference page for more information. @@ -59,7 +59,7 @@ spec: This example uses the `container-runtime` runner, but you can instead use the `deno-runtime` or `python-runtime` runner. See -[Runners and containers](tasks/#runners-and-containers) +[Runners and containers](./tasks.md#runners-and-containers) for more information. ## Create and apply a KeptnTask diff --git a/docs/content/en/docs/implementing/tasks/_index.md b/docs/content/en/docs/implementing/tasks.md similarity index 92% rename from docs/content/en/docs/implementing/tasks/_index.md rename to docs/content/en/docs/implementing/tasks.md index 335cafbc99..1427410fed 100644 --- a/docs/content/en/docs/implementing/tasks/_index.md +++ b/docs/content/en/docs/implementing/tasks.md @@ -6,24 +6,24 @@ hidechildren: false # this flag hides all sub-pages in the sidebar-multicard.htm --- A -[KeptnTaskDefinition](../../yaml-crd-ref/taskdefinition.md/) +[KeptnTaskDefinition](../yaml-crd-ref/taskdefinition.md/) resource defines one or more "executables" (functions, programs, scripts, etc) that Keptn runs as part of the pre- and post-deployment phases of a -[KeptnApp](../../yaml-crd-ref/app.md) or -[KeptnWorkload](../../crd-ref/lifecycle/v1alpha3/#keptnworkload). +[KeptnApp](../yaml-crd-ref/app.md) or +[KeptnWorkload](../crd-ref/lifecycle/v1alpha3/#keptnworkload). - pre-deployment (before the pod is scheduled) - post-deployment (after the pod is scheduled) These `KeptnTask` resources and the `KeptnEvaluation` resources (discussed in -[Evaluations](../evaluations.md)) +[Evaluations](./evaluations.md)) are part of the Keptn Release Lifecycle Management. A -[KeptnTask](../../crd-ref/lifecycle/v1alpha3/#keptntask) +[KeptnTask](../crd-ref/lifecycle/v1alpha3/#keptntask) executes as a runner in an application [container](https://kubernetes.io/docs/concepts/containers/), which runs as part of a Kubernetes @@ -33,20 +33,20 @@ A `KeptnTaskDefinition` includes calls to executables to be run. To implement a `KeptnTask`: - Define a - [KeptnTaskDefinition](../../yaml-crd-ref/taskdefinition.md) + [KeptnTaskDefinition](../yaml-crd-ref/taskdefinition.md) resource that defines the runner to use for the container and the executables to be run pre- and post-deployment -- Apply [basic-annotations](../integrate/#basic-annotations) +- Apply [basic-annotations](./integrate.md#basic-annotations) to your workloads to integrate your task with Kubernetes and, if desired, creates a `KeptnApp` resource that consolidates multiple workloads into a single application - Annotate the appropriate - [KeptnApp](../../yaml-crd-ref/app.md) + [KeptnApp](../yaml-crd-ref/app.md) resource to associate your `KeptnTaskDefinition` with the pre- and post-deployment tasks that should be run; see - [Pre- and post-deployment tasks and checks](../integrate/#pre--and-post-deployment-checks) + [Pre- and post-deployment tasks and checks](./integrate.md#pre--and-post-deployment-checks) for more information This page provides information to help you create your tasks: @@ -104,7 +104,7 @@ can be configured in one of four different ways: resource that is populated with the function to execute See the -[KeptnTaskDefinition](../../yaml-crd-ref/taskdefinition.md) +[KeptnTaskDefinition](../yaml-crd-ref/taskdefinition.md) reference page for the synopsis and examples for each runner. ## Executing sequential tasks @@ -136,7 +136,7 @@ You have the following options: (either `deno-runtime` or `python-runtime`) to code the actual calls inline in the `KeptnTaskDefinition` resource. See - [Fields for pre-defined containers](../../yaml-crd-ref/taskdefinition.md/#fields-for-pre-defined-containers) + [Fields for pre-defined containers](../yaml-crd-ref/taskdefinition.md/#fields-for-pre-defined-containers) for more information. - Create a script that calls the functions, programs, and scripts @@ -147,7 +147,7 @@ You have the following options: which can set parameters for the script if appropriate. For more details about implementing these options, see the -[KeptnTaskDefinition](../../yaml-crd-ref/taskdefinition.md) +[KeptnTaskDefinition](../yaml-crd-ref/taskdefinition.md) page. ## Context @@ -160,7 +160,7 @@ For more information, see You may need to include context information in the `function` code included in the YAML file that defines a -[KeptnTaskDefinition](../../yaml-crd-ref/taskdefinition.md) +[KeptnTaskDefinition](../yaml-crd-ref/taskdefinition.md) resource. For an example of how to do this, see the [keptn-tasks.yaml](https://github.com/keptn-sandbox/klt-on-k3s-with-argocd/blob/main/simplenode-dev/keptn-tasks.yaml) diff --git a/docs/content/en/docs/install/install.md b/docs/content/en/docs/install/install.md index dce1392be6..82cb323c7d 100644 --- a/docs/content/en/docs/install/install.md +++ b/docs/content/en/docs/install/install.md @@ -28,7 +28,7 @@ After Keptn is installed, you must in order to run some Keptn functionality. You are then ready to -[Integrate Keptn with your applications](../implementing/integrate). +[Integrate Keptn with your applications](../implementing/integrate.md). ## Running Keptn with vCluster @@ -190,4 +190,4 @@ This annotation tells the webhook to handle the namespace. After enabling Keptn for your namespace(s), you are ready to -[Integrate Keptn with your applications](../implementing/integrate). +[Integrate Keptn with your applications](../implementing/integrate.md). diff --git a/docs/content/en/docs/install/k8s.md b/docs/content/en/docs/install/k8s.md index 2653ce15c6..ef19ff8d77 100644 --- a/docs/content/en/docs/install/k8s.md +++ b/docs/content/en/docs/install/k8s.md @@ -93,7 +93,7 @@ Your cluster should include the following: * SLIs for pre- and post-deployment [evaluations](../implementing/evaluations.md/) * SLIs used for - [analyses](../implementing/slo/) + [analyses](../implementing/slo.md) * If you want to use the standardized observability feature, you must have an OpenTelemetry collector diff --git a/docs/content/en/docs/intro/_index.md b/docs/content/en/docs/intro/_index.md index daf32f5016..fa1f240a91 100644 --- a/docs/content/en/docs/intro/_index.md +++ b/docs/content/en/docs/intro/_index.md @@ -65,7 +65,7 @@ deployment durations and failures across multiple deployment strategies. using different deployment strategies. * Captures - [DORA metrics](../implementing/dora/) + [DORA metrics](../implementing/dora.md) and exposes them as OpenTelemetry metrics out of the box. * Reports traces and custom Keptn metrics from configured data providers @@ -88,7 +88,7 @@ To learn more, see: * [Getting started with Keptn Observability](../getting-started/observability.md) * [Standardize observability](usecase-observability.md/) -* [DORA metrics](../implementing/dora) User Guide +* [DORA metrics](../implementing/dora.md) User Guide * [OpenTelemetry observability](../implementing/otel.md) User Guide ## Release lifecycle management @@ -135,7 +135,7 @@ which is a single, cohesive unit that groups multiple [workloads](https://kubern For more information, see: * [Getting started with release lifecycle management](../getting-started/lifecycle-management.md) -* [Deployment tasks](../implementing/tasks) User Guide +* [Deployment tasks](../implementing/tasks.md) User Guide * [Evaluations](../implementing/evaluations.md) User Guide * [Manage release lifecycle](usecase-orchestrate.md) * [KeptnApp and KeptnWorkload resources](../architecture/keptn-apps.md) diff --git a/docs/content/en/docs/intro/usecase-observability.md b/docs/content/en/docs/intro/usecase-observability.md index af289bf731..7e30f768ff 100644 --- a/docs/content/en/docs/intro/usecase-observability.md +++ b/docs/content/en/docs/intro/usecase-observability.md @@ -69,7 +69,7 @@ you need to do the following: [Install and update](../install) to install and enable Keptn on your cluster. 1. Follow the instructions in - [Basic annotations](../implementing/integrate/#basic-annotations) + [Basic annotations](../implementing/integrate.md#basic-annotations) to integrate Keptn into your Kubernetes cluster by applying basic annotations to your [workload](https://kubernetes.io/docs/concepts/workloads/) resources. @@ -86,7 +86,7 @@ about your deployments. Keptn starts collecting these metrics as soon as you annotate the `Deployment` resource. See -[DORA metrics](../implementing/dora) +[DORA metrics](../implementing/dora.md) for more details. ## Using OpenTelemetry diff --git a/docs/content/en/docs/intro/usecase-orchestrate.md b/docs/content/en/docs/intro/usecase-orchestrate.md index 045f44f57d..1dbb44d12f 100644 --- a/docs/content/en/docs/intro/usecase-orchestrate.md +++ b/docs/content/en/docs/intro/usecase-orchestrate.md @@ -78,7 +78,7 @@ you need to do the following: [Install and update](../install/_index.md) to install and enable Keptn on your cluster. 1. Follow the instructions in - [Annotate workload](../implementing/integrate/#basic-annotations) + [Annotate workload](../implementing/integrate.md#basic-annotations) to integrate Keptn into your Kubernetes cluster by applying basic annotations to your `Deployment` resource. This also creates appropriate @@ -160,7 +160,7 @@ you can also use Python 3 to define your task, or you can define a standard Kubernetes container that uses the image, runner, and runtime dependencies that you choose. For more information, see -[Working with Keptn tasks](../implementing/tasks). +[Working with Keptn tasks](../implementing/tasks.md). You can view the actual JavaScript code for the task in the repository. You see that "context" is important in this code. @@ -173,7 +173,7 @@ is protected by a secret, the task definition also specifies that secret. ## Integrate evaluations and tasks into the cluster Follow the instructions in -[Annotate workload](../implementing/integrate/#pre--and-post-deployment-checks) +[Annotate workload](../implementing/integrate.md#pre--and-post-deployment-checks) to integrate the evaluations and tasks you defined into the cluster by applying annotations to the `Deployment` resource. diff --git a/docs/content/en/docs/migrate/metrics-observe.md b/docs/content/en/docs/migrate/metrics-observe.md index 3c54831987..ea6bc42e79 100644 --- a/docs/content/en/docs/migrate/metrics-observe.md +++ b/docs/content/en/docs/migrate/metrics-observe.md @@ -23,7 +23,7 @@ appropriate Keptn facilities: * Keptn v1 calculations that use weighting and scoring can be converted to use the - [Keptn Analysis](../implementing/slo) + [Keptn Analysis](../implementing/slo.md) feature. Tools are provided to help with this conversion; see below. @@ -31,7 +31,7 @@ appropriate Keptn facilities: By default, Keptn includes additional observability features that are not included in Keptn v1: -* [DORA metrics](../implementing/dora) +* [DORA metrics](../implementing/dora.md) * [OpenTelemetry observability](../implementing/otel.md) ## Paradigm changes diff --git a/docs/content/en/docs/migrate/strategy.md b/docs/content/en/docs/migrate/strategy.md index 095fabe2e5..f692bc0af8 100644 --- a/docs/content/en/docs/migrate/strategy.md +++ b/docs/content/en/docs/migrate/strategy.md @@ -141,7 +141,7 @@ but some services may be translated into [KeptnTaskDefinition](../yaml-crd-ref/app.md) or other resources. See -[Working with Keptn tasks](../implementing/tasks/) +[Working with Keptn tasks](../implementing/tasks.md) for more information. For example: @@ -288,7 +288,7 @@ resources resources. * [AnalysisValueTemplate](../yaml-crd-ref/analysisvaluetemplate.md) resources to do - [analyses](../implementing/slo) + [analyses](../implementing/slo.md) with [AnalysisDefinition](../yaml-crd-ref/analysisdefinition.md) resources. @@ -312,7 +312,7 @@ can be implemented on Keptn as evaluations or analyses: * Complex analyses that use weighting and scoring and analyze the value over a specified time frame can be implemented as - [Analyses](../implementing/slo) + [Analyses](../implementing/slo.md) that are defined in [AnalysisDefinition](../yaml-crd-ref/analysisdefinition.md) resources. diff --git a/docs/content/en/docs/yaml-crd-ref/analysis.md b/docs/content/en/docs/yaml-crd-ref/analysis.md index 0fc713f931..74ade7640b 100644 --- a/docs/content/en/docs/yaml-crd-ref/analysis.md +++ b/docs/content/en/docs/yaml-crd-ref/analysis.md @@ -321,7 +321,7 @@ This `Analysis` resource: will be substituted for this string. For a full example of how to implement the Keptn Analysis feature, see the -[Analysis](../implementing/slo) +[Analysis](../implementing/slo.md) guide page. ## Files @@ -339,4 +339,4 @@ in the `metrics-operator` deployment. * [AnalysisDefinition](analysisdefinition.md) * [AnalysisValueTemplate](analysisvaluetemplate.md) -* [Analysis](../implementing/slo) guide +* [Analysis](../implementing/slo.md) guide diff --git a/docs/content/en/docs/yaml-crd-ref/analysisdefinition.md b/docs/content/en/docs/yaml-crd-ref/analysisdefinition.md index a6523dbfd8..ffbe851d1c 100644 --- a/docs/content/en/docs/yaml-crd-ref/analysisdefinition.md +++ b/docs/content/en/docs/yaml-crd-ref/analysisdefinition.md @@ -150,7 +150,7 @@ spec: ``` For an example of how to implement the Keptn Analysis feature, see the -[Analysis](../implementing/slo) +[Analysis](../implementing/slo.md) guide page. ## Files @@ -169,4 +169,4 @@ in the `metrics-operator` deployment. * [Analysis](analysis.md) * [AnalysisValueTemplate](analysisvaluetemplate.md) -* [Analysis](../implementing/slo) guide +* [Analysis](../implementing/slo.md) guide diff --git a/docs/content/en/docs/yaml-crd-ref/analysisvaluetemplate.md b/docs/content/en/docs/yaml-crd-ref/analysisvaluetemplate.md index 4c5d8fd557..dfaf2a7fbe 100644 --- a/docs/content/en/docs/yaml-crd-ref/analysisvaluetemplate.md +++ b/docs/content/en/docs/yaml-crd-ref/analysisvaluetemplate.md @@ -33,7 +33,7 @@ spec: * **metadata** * **labels** -- The Analysis feature uses the `name` and `part-of` labels that are discussed in - [Basic annotations](../implementing/integrate/#basic-annotations) + [Basic annotations](../implementing/integrate.md#basic-annotations) plus the following: * **app.kubernetes.io/instance** analysis-sample * **app.kuberentes.io/managed-by** -- Tool used to manage @@ -88,7 +88,7 @@ The template refers to that provider and queries it. For a full example of how the `AnalysisValueTemplate` is used to implement the Keptn Analysis feature, see the -[Analysis](../implementing/slo) +[Analysis](../implementing/slo.md) guide page. ## Files @@ -107,4 +107,4 @@ in the `metrics-operator` deployment. * [Analysis](analysis.md) * [AnalysisDefinition](analysisdefinition.md) -* [Analysis](../implementing/slo) guide +* [Analysis](../implementing/slo.md) guide diff --git a/docs/content/en/docs/yaml-crd-ref/app.md b/docs/content/en/docs/yaml-crd-ref/app.md index 9e06a18c43..e2b9591a7f 100644 --- a/docs/content/en/docs/yaml-crd-ref/app.md +++ b/docs/content/en/docs/yaml-crd-ref/app.md @@ -69,7 +69,7 @@ when the app discovery feature generates the `KeptnApp` resource: that failed to deploy, perhaps because a `preDeploymentEvaluation` or `preDeploymentTask` failed. See - [Restart an Application Deployment](../implementing/restart-application-deployment/) + [Restart an Application Deployment](../implementing/restart-application-deployment.md) for a longer discussion of this. - **workloads** - **name** (required) -- name of this Kubernetes @@ -121,10 +121,10 @@ into the repository of the deployment engine and is then deployed by that deployment engine. A `KeptnApp` resource is created automatically, using the -[automatic application discovery](../implementing/integrate/#use-keptn-automatic-app-discovery) +[automatic application discovery](../implementing/integrate.md#use-keptn-automatic-app-discovery) feature to generate a `KeptnApp` resource based on the -[basic annotations](../implementing/integrate/#basic-annotations) +[basic annotations](../implementing/integrate.md#basic-annotations) that are applied to any of the workload resources. This allows you to use the Keptn observability features for existing resources without manually populating any Keptn related resources. @@ -170,9 +170,9 @@ spec: - [KeptnTaskDefinition](taskdefinition.md) - [KeptnEvaluationDefinition](evaluationdefinition.md) -- [Working with tasks](../implementing/tasks) +- [Working with tasks](../implementing/tasks.md) - [Architecture of KeptnWorkloads and KeptnTasks](../architecture/keptn-apps.md) -- [Pre- and post-deployment tasks](../implementing/integrate/#pre--and-post-deployment-checks) +- [Pre- and post-deployment tasks](../implementing/integrate.md#pre--and-post-deployment-checks) - [Orchestrate deployment checks](../intro/usecase-orchestrate.md) -- [Use Keptn automatic app discovery](../implementing/integrate/#use-keptn-automatic-app-discovery) -- [Restart an Application Deployment](../implementing/restart-application-deployment/) +- [Use Keptn automatic app discovery](../implementing/integrate.md#use-keptn-automatic-app-discovery) +- [Restart an Application Deployment](../implementing/restart-application-deployment.md) diff --git a/docs/content/en/docs/yaml-crd-ref/config.md b/docs/content/en/docs/yaml-crd-ref/config.md index d3b722ca22..d5df29c83a 100644 --- a/docs/content/en/docs/yaml-crd-ref/config.md +++ b/docs/content/en/docs/yaml-crd-ref/config.md @@ -77,4 +77,4 @@ API Reference: * [KeptnApp](../yaml-crd-ref/app.md) * [OpenTelemetry observability](../implementing/otel.md) -* [Keptn automatic app discovery](../implementing/integrate/_index.md/#use-keptn-automatic-app-discovery) +* [Keptn automatic app discovery](../implementing/integrate.md/#use-keptn-automatic-app-discovery) diff --git a/docs/content/en/docs/yaml-crd-ref/task.md b/docs/content/en/docs/yaml-crd-ref/task.md index b615ddc979..ae673cafd3 100644 --- a/docs/content/en/docs/yaml-crd-ref/task.md +++ b/docs/content/en/docs/yaml-crd-ref/task.md @@ -85,7 +85,7 @@ spec: * **secureParameters** -- Secure parameters that are passed to the job that executes the `KeptnTask`. These are stored and accessed as Kubernetes `Secrets` in the cluster. - See [Working with secrets](../implementing/tasks/#working-with-secrets) + See [Working with secrets](../implementing/tasks.md#working-with-secrets) for more information. * **checkType** -- Defines whether task is part of pre- or post-deployment phase. Keptn populates this field based on annotations diff --git a/docs/content/en/docs/yaml-crd-ref/taskdefinition.md b/docs/content/en/docs/yaml-crd-ref/taskdefinition.md index a5e4ea097a..2d84bf3cfc 100644 --- a/docs/content/en/docs/yaml-crd-ref/taskdefinition.md +++ b/docs/content/en/docs/yaml-crd-ref/taskdefinition.md @@ -305,7 +305,7 @@ spec: See [Passing secrets, environment variables, and modifying the python command](#passing-secrets-environment-variables-and-modifying-the-python-command) and - [Parameterized functions](../implementing/tasks/#parameterized-functions) + [Parameterized functions](../implementing/tasks.md#parameterized-functions) for more information. * **deno example:** @@ -321,7 +321,7 @@ spec: Note that, currently, only one secret can be passed per `KeptnTaskDefinition` resource. - See [Create secret text](../implementing/tasks/#create-secret-text) + See [Create secret text](../implementing/tasks.md#create-secret-text) for details. * **deno example:** @@ -358,7 +358,7 @@ and and in the [KeptnApp](app.md) resource. See -[Pre- and post-deployment tasks](../implementing/integrate/#pre--and-post-deployment-checks) +[Pre- and post-deployment tasks](../implementing/integrate.md#pre--and-post-deployment-checks) for details. Note that the annotation identifies the task by `name`. This means that you can modify the `function` code in the resource definition @@ -371,7 +371,7 @@ either by using the `inline` syntax for a pre-defined container image or by creating your own image and running it in the Keptn `container-runtime` runner. See -[Executing sequential tasks](../implementing/tasks/#executing-sequential-tasks) +[Executing sequential tasks](../implementing/tasks.md#executing-sequential-tasks) for more information. ## Examples for a container-runtime runner @@ -608,8 +608,8 @@ This modifies the synopsis in the following ways: ## See also * [KeptnApp](app.md) -* [Working with tasks](../implementing/tasks) -* [Pre- and post-deployment tasks](../implementing/integrate/#pre--and-post-deployment-checks) +* [Working with tasks](../implementing/tasks.md) +* [Pre- and post-deployment tasks](../implementing/integrate.md#pre--and-post-deployment-checks) * [KeptnApp and KeptnWorkload resources](../architecture/keptn-apps.md). * [Orchestrate deployment checks](../intro/usecase-orchestrate.md) -* [Executing sequential tasks](../implementing/tasks/#executing-sequential-tasks) +* [Executing sequential tasks](../implementing/tasks.md#executing-sequential-tasks) diff --git a/docs/layouts/shortcodes/docsembed.html b/docs/layouts/shortcodes/docsembed.html new file mode 100644 index 0000000000..afe89de35b --- /dev/null +++ b/docs/layouts/shortcodes/docsembed.html @@ -0,0 +1,6 @@ +{{ $u := (.Get "path") }} +{{ with readFile $u }} + {{- highlight (. | htmlUnescape | safeHTML ) "yaml" -}} +{{ else }} + {{ errorf "Unable to get local resource %s" (.Get "path") }} +{{ end }} \ No newline at end of file