Skip to content

Commit

Permalink
Add broken links checker (#3305)
Browse files Browse the repository at this point in the history
* Add workflow to check markdown links and comment on PRs

* Add PyGithub dependency for GitHub Actions workflow

* Fix Python version and update code formatting.- Update Python version to 3.x- Improve code formatting

* Update markdown link checker script to use shell script

* Add script for checking and commenting on GitHub

* Update default directory to "docs/book" in check_and_comment.sh

* Update broken links comment creation logic

* Ensure proper exit codes for GitHub Actions

* Add functionality to check and comment on broken markdown links

* fix all links

* fix more links

* typo fix

---------

Co-authored-by: Jayesh Sharma <[email protected]>
  • Loading branch information
htahir1 and wjayesh authored Jan 25, 2025
1 parent ed1a2b6 commit 5c76c3e
Show file tree
Hide file tree
Showing 65 changed files with 374 additions and 298 deletions.
20 changes: 20 additions & 0 deletions .github/workflows/check-markdown-links.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
---
name: Check Markdown Links
on:
pull_request:
types: [opened, synchronize, reopened]
jobs:
check-links:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: 3.x
- name: Install dependencies
run: pip install PyGithub
- name: Run markdown link checker
run: ./scripts/check_and_comment.sh docs
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
2 changes: 1 addition & 1 deletion docs/book/component-guide/artifact-stores/custom.md
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,7 @@ zenml artifact-store flavor register flavors.my_flavor.MyArtifactStoreFlavor
```

{% hint style="warning" %}
ZenML resolves the flavor class by taking the path where you initialized zenml (via `zenml init`) as the starting point of resolution. Therefore, please ensure you follow [the best practice](../../how-to/setting-up-a-project-repository/best-practices.md) of initializing zenml at the root of your repository.
ZenML resolves the flavor class by taking the path where you initialized zenml (via `zenml init`) as the starting point of resolution. Therefore, please ensure you follow [the best practice](../../how-to/infrastructure-deployment/infrastructure-as-code/best-practices.md) of initializing zenml at the root of your repository.

If ZenML does not find an initialized ZenML repository in any parent directory, it will default to the current working directory, but usually, it's better to not have to rely on this mechanism and initialize zenml at the root.
{% endhint %}
Expand Down
2 changes: 1 addition & 1 deletion docs/book/component-guide/container-registries/custom.md
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ zenml container-registry flavor register flavors.my_flavor.MyContainerRegistryFl
```

{% hint style="warning" %}
ZenML resolves the flavor class by taking the path where you initialized zenml (via `zenml init`) as the starting point of resolution. Therefore, please ensure you follow [the best practice](../../how-to/setting-up-a-project-repository/best-practices.md) of initializing zenml at the root of your repository.
ZenML resolves the flavor class by taking the path where you initialized zenml (via `zenml init`) as the starting point of resolution. Therefore, please ensure you follow [the best practice](../../how-to/infrastructure-deployment/infrastructure-as-code/best-practices.md) of initializing zenml at the root of your repository.

If ZenML does not find an initialized ZenML repository in any parent directory, it will default to the current working directory, but usually it's better to not have to rely on this mechanism, and initialize zenml at the root.
{% endhint %}
Expand Down
2 changes: 1 addition & 1 deletion docs/book/component-guide/data-validators/custom.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ zenml data-validator flavor register flavors.my_flavor.MyDataValidatorFlavor
```

{% hint style="warning" %}
ZenML resolves the flavor class by taking the path where you initialized zenml (via `zenml init`) as the starting point of resolution. Therefore, please ensure you follow [the best practice](../../how-to/setting-up-a-project-repository/best-practices.md) of initializing zenml at the root of your repository.
ZenML resolves the flavor class by taking the path where you initialized zenml (via `zenml init`) as the starting point of resolution. Therefore, please ensure you follow [the best practice](../../how-to/infrastructure-deployment/infrastructure-as-code/best-practices.md) of initializing zenml at the root of your repository.

If ZenML does not find an initialized ZenML repository in any parent directory, it will default to the current working directory, but usually it's better to not have to rely on this mechanism, and initialize zenml at the root.
{% endhint %}
Expand Down
2 changes: 1 addition & 1 deletion docs/book/component-guide/experiment-trackers/custom.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ zenml experiment-tracker flavor register flavors.my_flavor.MyExperimentTrackerFl
```

{% hint style="warning" %}
ZenML resolves the flavor class by taking the path where you initialized zenml (via `zenml init`) as the starting point of resolution. Therefore, please ensure you follow [the best practice](../../how-to/setting-up-a-project-repository/best-practices.md) of initializing zenml at the root of your repository.
ZenML resolves the flavor class by taking the path where you initialized zenml (via `zenml init`) as the starting point of resolution. Therefore, please ensure you follow [the best practice](../../how-to/infrastructure-deployment/infrastructure-as-code/best-practices.md) of initializing zenml at the root of your repository.

If ZenML does not find an initialized ZenML repository in any parent directory, it will default to the current working directory, but usually, it's better to not have to rely on this mechanism and initialize zenml at the root.
{% endhint %}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ through Experiment Tracker stack components. This establishes a clear link betwe
Related concepts:

* the Experiment Tracker is an optional type of Stack Component that needs to be registered as part of your
ZenML [Stack](/docs/book/user-guide/production-guide/understand-stacks.md).
ZenML [Stack](../../user-guide/production-guide/understand-stacks.md).
* ZenML already provides versioning and tracking for the pipeline artifacts by storing artifacts in
the [Artifact Store](../artifact-stores/artifact-stores.md).

Expand Down
2 changes: 1 addition & 1 deletion docs/book/component-guide/image-builders/custom.md
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ zenml image-builder flavor register flavors.my_flavor.MyImageBuilderFlavor
```

{% hint style="warning" %}
ZenML resolves the flavor class by taking the path where you initialized zenml (via `zenml init`) as the starting point of resolution. Therefore, please ensure you follow [the best practice](../../how-to/setting-up-a-project-repository/best-practices.md) of initializing zenml at the root of your repository.
ZenML resolves the flavor class by taking the path where you initialized zenml (via `zenml init`) as the starting point of resolution. Therefore, please ensure you follow [the best practice](../../how-to/infrastructure-deployment/infrastructure-as-code/best-practices.md) of initializing zenml at the root of your repository.

If ZenML does not find an initialized ZenML repository in any parent directory, it will default to the current working directory, but usually it's better to not have to rely on this mechanism, and initialize zenml at the root.
{% endhint %}
Expand Down
2 changes: 1 addition & 1 deletion docs/book/component-guide/image-builders/image-builders.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ zenml image-builder flavor list
### How to use it

You don't need to directly interact with any image builder in your code. As long as the image builder that you want to
use is part of your active [ZenML stack](/docs/book/user-guide/production-guide/understand-stacks.md), it will be used
use is part of your active [ZenML stack](../../user-guide/production-guide/understand-stacks.md), it will be used
automatically by any component that needs to build container images.

<!-- For scarf -->
Expand Down
2 changes: 1 addition & 1 deletion docs/book/component-guide/model-deployers/custom.md
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,7 @@ zenml model-deployer flavor register flavors.my_flavor.MyModelDeployerFlavor
```

{% hint style="warning" %}
ZenML resolves the flavor class by taking the path where you initialized zenml (via `zenml init`) as the starting point of resolution. Therefore, please ensure you follow [the best practice](../../how-to/setting-up-a-project-repository/best-practices.md) of initializing zenml at the root of your repository.
ZenML resolves the flavor class by taking the path where you initialized zenml (via `zenml init`) as the starting point of resolution. Therefore, please ensure you follow [the best practice](../../how-to/infrastructure-deployment/infrastructure-as-code/best-practices.md) of initializing zenml at the root of your repository.

If ZenML does not find an initialized ZenML repository in any parent directory, it will default to the current working directory, but usually, it's better to not have to rely on this mechanism and initialize zenml at the root.
{% endhint %}
Expand Down
8 changes: 4 additions & 4 deletions docs/book/component-guide/orchestrators/airflow.md
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ of your Airflow deployment.
{% hint style="info" %}
ZenML will build a Docker image called `<CONTAINER_REGISTRY_URI>/zenml:<PIPELINE_NAME>` which includes your code and use
it to run your pipeline steps in Airflow. Check
out [this page](/docs/book/how-to/customize-docker-builds/README.md) if you want to learn
out [this page](../../how-to/customize-docker-builds/README.md) if you want to learn
more about how ZenML builds these images and how you can customize them.
{% endhint %}

Expand Down Expand Up @@ -204,13 +204,13 @@ The username will always be `admin`.
For additional configuration of the Airflow orchestrator, you can pass `AirflowOrchestratorSettings` when defining or
running your pipeline. Check out
the [SDK docs](https://sdkdocs.zenml.io/latest/integration\_code\_docs/integrations-airflow/#zenml.integrations.airflow.flavors.airflow\_orchestrator\_flavor.AirflowOrchestratorSettings)
for a full list of available attributes and [this docs page](/docs/book/how-to/pipeline-development/use-configuration-files/README.md) for
for a full list of available attributes and [this docs page](../../how-to/pipeline-development/use-configuration-files/README.md) for
more information on how to specify settings.

#### Enabling CUDA for GPU-backed hardware

Note that if you wish to use this orchestrator to run steps on a GPU, you will need to
follow [the instructions on this page](/docs/book/how-to/pipeline-development/training-with-gpus/README.md) to ensure that it
follow [the instructions on this page](../../how-to/pipeline-development/training-with-gpus/README.md) to ensure that it
works. It requires adding some extra settings customization and is essential to enable CUDA for the GPU to give its full
acceleration.

Expand Down Expand Up @@ -297,7 +297,7 @@ the [original module](https://github.com/zenml-io/zenml/blob/main/src/zenml/inte
. For this reason, we suggest starting by copying the original and modifying it according to your needs.

Check out our docs on how to apply settings to your
pipelines [here](/docs/book/how-to/pipeline-development/use-configuration-files/README.md).
pipelines [here](../../how-to/pipeline-development/use-configuration-files/README.md).

For more information and a full list of configurable attributes of the Airflow orchestrator, check out the [SDK Docs](https://sdkdocs.zenml.io/latest/integration_code_docs/integrations-airflow/#zenml.integrations.airflow.orchestrators.airflow_orchestrator.AirflowOrchestrator) .

Expand Down
2 changes: 1 addition & 1 deletion docs/book/component-guide/orchestrators/azureml.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ In order to use an AzureML orchestrator, you need to first
deploy [ZenML to the cloud](../../getting-started/deploying-zenml/README.md).
It would be recommended to deploy ZenML in the same region as you plan on
using for AzureML, but it is not necessary to do so. You must ensure that
you are [connected to the remote ZenML server](../../how-to/connecting-to-zenml/connect-in-with-your-user-interactive.md)
you are [connected to the remote ZenML server](../../how-to/manage-zenml-server/connecting-to-zenml/connect-in-with-your-user-interactive.md)
before using this stack component.

## How to use it
Expand Down
2 changes: 1 addition & 1 deletion docs/book/component-guide/orchestrators/custom.md
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ zenml orchestrator flavor register flavors.my_flavor.MyOrchestratorFlavor
```

{% hint style="warning" %}
ZenML resolves the flavor class by taking the path where you initialized zenml (via `zenml init`) as the starting point of resolution. Therefore, please ensure you follow [the best practice](../../how-to/setting-up-a-project-repository/best-practices.md) of initializing zenml at the root of your repository.
ZenML resolves the flavor class by taking the path where you initialized zenml (via `zenml init`) as the starting point of resolution. Therefore, please ensure you follow [the best practice](../../how-to/infrastructure-deployment/infrastructure-as-code/best-practices.md) of initializing zenml at the root of your repository.

If ZenML does not find an initialized ZenML repository in any parent directory, it will default to the current working directory, but usually, it's better to not have to rely on this mechanism and initialize zenml at the root.
{% endhint %}
Expand Down
4 changes: 2 additions & 2 deletions docs/book/component-guide/orchestrators/orchestrators.md
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,9 @@ zenml orchestrator flavor list
### How to use it

You don't need to directly interact with any ZenML orchestrator in your code. As long as the orchestrator that you want
to use is part of your active [ZenML stack](/docs/book/user-guide/production-guide/understand-stacks.md), using the
to use is part of your active [ZenML stack](../../user-guide/production-guide/understand-stacks.md), using the
orchestrator is as simple as executing a Python file
that [runs a ZenML pipeline](/docs/book/user-guide/starter-guide/starter-guide.md):
that [runs a ZenML pipeline](../../user-guide/starter-guide/starter-project.md):

```shell
python file_that_runs_a_zenml_pipeline.py
Expand Down
2 changes: 1 addition & 1 deletion docs/book/component-guide/step-operators/custom.md
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ zenml step-operator flavor register flavors.my_flavor.MyStepOperatorFlavor
```

{% hint style="warning" %}
ZenML resolves the flavor class by taking the path where you initialized zenml (via `zenml init`) as the starting point of resolution. Therefore, please ensure you follow [the best practice](../../how-to/setting-up-a-project-repository/best-practices.md) of initializing zenml at the root of your repository.
ZenML resolves the flavor class by taking the path where you initialized zenml (via `zenml init`) as the starting point of resolution. Therefore, please ensure you follow [the best practice](../../how-to/infrastructure-deployment/infrastructure-as-code/best-practices.md) of initializing zenml at the root of your repository.

If ZenML does not find an initialized ZenML repository in any parent directory, it will default to the current working directory, but usually, it's better to not have to rely on this mechanism and initialize zenml at the root.
{% endhint %}
Expand Down
2 changes: 1 addition & 1 deletion docs/book/component-guide/step-operators/modal.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ ZenML will build a Docker image which includes your code and use it to run your
#### Additional configuration

You can specify the hardware requirements for each step using the
`ResourceSettings` class as described in our documentation on [resource settings](../../how-to/training-with-gpus/training-with-gpus.md):
`ResourceSettings` class as described in our documentation on [resource settings](../../how-to/pipeline-development/training-with-gpus/README.md):

```python
from zenml.config import ResourceSettings
Expand Down
2 changes: 1 addition & 1 deletion docs/book/component-guide/step-operators/step-operators.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ zenml step-operator flavor list
### How to use it

You don't need to directly interact with any ZenML step operator in your code. As long as the step operator that you
want to use is part of your active [ZenML stack](/docs/book/user-guide/production-guide/understand-stacks.md), you can simply
want to use is part of your active [ZenML stack](../../user-guide/production-guide/understand-stacks.md), you can simply
specify it in the `@step` decorator of your step.

```python
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,6 @@ If you want to create your own custom secrets store implementation, you can foll

1. Create a class that inherits from the `zenml.zen_stores.secrets_stores.base_secrets_store.BaseSecretsStore` base class and implements the `abstractmethod`s shown in the interface above. Use `SecretsStoreType.CUSTOM` as the `TYPE` value for your secrets store class.
2. If you need to provide any configuration, create a class that inherits from the `SecretsStoreConfiguration` class and add your configuration parameters there. Use that as the `CONFIG_TYPE` value for your secrets store class.
3. To configure the ZenML server to use your custom secrets store, make sure your code is available in the container image that is used to run the ZenML server. Then, use environment variables or helm chart values to configure the ZenML server to use your custom secrets store, as covered in the [deployment guide](../README.md).
3. To configure the ZenML server to use your custom secrets store, make sure your code is available in the container image that is used to run the ZenML server. Then, use environment variables or helm chart values to configure the ZenML server to use your custom secrets store, as covered in the [deployment guide](./README.md).

<figure><img src="https://static.scarf.sh/a.png?x-pxid=f0b4f458-0a54-4fcd-aa95-d5ee424815bc" alt="ZenML Scarf"><figcaption></figcaption></figure>
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ description: Deploying ZenML with custom Docker images.

In most cases, deploying ZenML with the default `zenmlhub/zenml-server` Docker image should work just fine. However, there are some scenarios when you might need to deploy ZenML with a custom Docker image:

* You have implemented a custom artifact store for which you want to enable [artifact visualizations](../../how-to/handle-data-artifacts/visualize-artifacts.md) or [step logs](../../how-to/setting-up-a-project-repository/best-practices.md#logging) in your dashboard.
* You have implemented a custom artifact store for which you want to enable [artifact visualizations](../../how-to/data-artifact-management/visualize-artifacts/README.md) or [step logs](../../../how-to/setting-up-a-project-repository/best-practices.md#logging) in your dashboard.
* You have forked the ZenML repository and want to deploy a ZenML server based on your own fork because you made changes to the server / database logic.

{% hint style="warning" %}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,7 @@ These configuration options are only relevant if you're using Hashicorp Vault as
{% endtab %}

{% tab title="Custom" %}
These configuration options are only relevant if you're using a custom secrets store backend implementation. For this to work, you must have [a custom implementation of the secrets store API](manage-the-deployed-services/custom-secret-stores.md) in the form of a class derived from `zenml.zen_stores.secrets_stores.base_secrets_store.BaseSecretsStore`. This class must be importable from within the ZenML server container, which means you most likely need to mount the directory containing the class into the container or build a custom container image that contains the class.
These configuration options are only relevant if you're using a custom secrets store backend implementation. For this to work, you must have [a custom implementation of the secrets store API](custom-secret-stores.md) in the form of a class derived from `zenml.zen_stores.secrets_stores.base_secrets_store.BaseSecretsStore`. This class must be importable from within the ZenML server container, which means you most likely need to mount the directory containing the class into the container or build a custom container image that contains the class.

The following configuration option is required:

Expand Down
Loading

0 comments on commit 5c76c3e

Please sign in to comment.