--- tags: - GIT - CI/CD - CI-CD --- To test and validate your `docker-compose` infrastructure configurations right inside your homelab, you can use Gitea Actions to automatically check your YAML syntax and test your container builds every time you make an edit. [[1](https://mortylen.hashnode.dev/gitea-self-hosted-workflow-action-for-ci), [2](https://ramnode.com/guides/series/gitea-devops/gitea-setup)] Here is how to set up an automated testing pipeline specifically for a homelab Docker Compose repository. 🛠️ Step 1: Set Up the Workflow Directory In your homelab Git repository containing your `docker-compose.yml` files, create the specific workflow path: [[1](https://www.stackhero.io/en-CA/services/Docker/documentations/Deploy-with-GitHub-Actions)] - **File path:** `.gitea/workflows/docker-test.yaml` 📝 Step 2: Paste the Homelab Validation Template Copy and paste this template into your new file. It is optimized to perform two critical steps: lint your YAML formatting for typos, and dry-run your Docker Compose setup to ensure your container configurations are valid. [[1](https://www.reddit.com/r/docker/comments/1i32i3z/one_large_compose_file/), [2](https://www.docker.com/blog/compose-to-kubernetes-to-cloud-kanvas/)] `name: Docker Compose Validator` `run-name: Homelab configuration test by ${{ gitea.actor }} 🛠️` `on:` `push:` `branches: [ "main", "master" ]` `pull_request:` `branches: [ "main", "master" ]` `jobs:` `validate-and-test:` `runs-on: ubuntu-latest` `steps:` `# 1. Pull down your homelab repository code` `- name: Checkout Repository Code` `uses: actions/checkout@v4` `# 2. Check all YAML files for syntax, indentation, and formatting errors` `- name: Lint YAML Syntax` `uses: https://github.com` `with:` `file_or_dir: "."` `# 3. Verify that the docker-compose syntax is structurally sound` `- name: Verify Compose File Validity` `run: |` `echo "Checking docker-compose configuration..."` `docker compose config` `# 4. Dry-run the build sequence to ensure images and contexts are reachable` `- name: Test Build Sequence` `run: |` `echo "Simulating container build sequence..."` `docker compose build` 🔍 Breaking Down How This Works for Homelabbers - **YAML Linting:** Homelab configurations frequently break due to an accidental extra space or missing indentation. The `action-yamllint` step scans your files and alerts you to formatting errors before they hit your live system. - **`docker compose config`:** This command acts as a built-in validator. It reads your `docker-compose.yml` file, processes any variables, and outputs an error if you have typos in your keys, volume definitions, or network syntax. [[1](https://labex.io/tutorials/docker-how-to-use-docker-compose-config-command-to-validate-and-view-compose-files-555074), [2](https://www.reddit.com/r/docker/comments/13vupxt/switching_from_portainer_to_dockercompose_and/), [3](https://medium.com/@adriansyah1230/mastering-docker-compose-a-practical-guide-to-multi-container-applications-c76811010131)] - **`docker compose build`:** If your compose files use the `build:` block to compile local Dockerfiles instead of just pulling pre-made images, this step ensures your Dockerfiles successfully build without crashing. ⚠️ Crucial Homelab Gotchas to Keep in Mind 1. **Environment Variables (`.env`):** If your `docker-compose.yml` relies on an external `.env` file containing local paths, secret tokens, or personal domain names, `docker compose config` will fail in Gitea Actions because that file is missing. You should either add a `.env.example` file to your Git repository and rename it during the workflow run, or map those variables into **Gitea Secrets**. 2. **Local Volume Paths:** If your compose files map to absolute local storage paths (e.g., `/mnt/user/appdata/nginx`), the Gitea Act Runner environment won't have access to those actual directories. For testing purposes, it is safest to use relative paths (e.g., `./nginx/config`) or let Docker generate named volumes during the validation phase. 3. **Runner Capabilities:** Ensure that your local `act_runner` setup has access to a Docker daemon. If you installed your runner using Docker-in-Docker (DinD), it will easily execute the `docker compose` commands embedded in this workflow. [[1](https://versich.com/blog/a-practical-guide-to-building-docker-image-in-gitlab/)]