├── .gitignore ├── .github ├── dependabot.yml ├── labels.yml ├── workflows │ ├── release-drafter.yml │ ├── repository.yml │ ├── lint.yml │ ├── action_pull_request.yml │ ├── action_schedule.yml │ ├── action_branch.yml │ └── params.yml └── release-drafter.yml ├── .yamllint ├── tests ├── volumeclaim-mysql.yml ├── secret.yml ├── service-mysql.yml ├── configmap.yml ├── service-dvwa.yml ├── deployment-mysql.yml └── deployment-dvwa.yml ├── LICENSE ├── Dockerfiles └── Dockerfile ├── Makefile └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | Makefile.docker 2 | Makefile.lint 3 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | --- 2 | version: 2 3 | updates: 4 | # Maintain dependencies for GitHub Actions 5 | - package-ecosystem: "github-actions" 6 | directory: "/" 7 | schedule: 8 | interval: "daily" 9 | -------------------------------------------------------------------------------- /.yamllint: -------------------------------------------------------------------------------- 1 | --- 2 | extends: default 3 | 4 | ignore: | 5 | .yamllint 6 | 7 | 8 | rules: 9 | truthy: 10 | allowed-values: ['true', 'false'] 11 | check-keys: False 12 | level: error 13 | line-length: disable 14 | -------------------------------------------------------------------------------- /tests/volumeclaim-mysql.yml: -------------------------------------------------------------------------------- 1 | --- 2 | apiVersion: v1 3 | kind: PersistentVolumeClaim 4 | metadata: 5 | name: dvwa-mysql-data-claim 6 | spec: 7 | accessModes: 8 | - ReadWriteOnce 9 | resources: 10 | requests: 11 | storage: 1Gi 12 | -------------------------------------------------------------------------------- /tests/secret.yml: -------------------------------------------------------------------------------- 1 | --- 2 | apiVersion: v1 3 | kind: Secret 4 | metadata: 5 | name: dvwa-secrets 6 | type: Opaque 7 | data: 8 | ROOT_PASSWORD: czNyMDB0cGE1NQ== 9 | DVWA_USERNAME: ZHZ3YQ== 10 | DVWA_PASSWORD: cEBzc3dvcmQ= 11 | DVWA_DATABASE: ZHZ3YQ== 12 | -------------------------------------------------------------------------------- /tests/service-mysql.yml: -------------------------------------------------------------------------------- 1 | --- 2 | apiVersion: v1 3 | kind: Service 4 | metadata: 5 | name: dvwa-mysql-service 6 | spec: 7 | selector: 8 | app: dvwa-mysql 9 | tier: backend 10 | ports: 11 | - protocol: TCP 12 | port: 3306 13 | targetPort: 3306 14 | -------------------------------------------------------------------------------- /tests/configmap.yml: -------------------------------------------------------------------------------- 1 | --- 2 | apiVersion: v1 3 | kind: ConfigMap 4 | metadata: 5 | name: dvwa-config 6 | data: 7 | RECAPTCHA_PRIV_KEY: "" 8 | RECAPTCHA_PUB_KEY: "" 9 | SECURITY_LEVEL: "low" 10 | PHPIDS_ENABLED: "0" 11 | PHPIDS_VERBOSE: "1" 12 | PHP_DISPLAY_ERRORS: "1" 13 | -------------------------------------------------------------------------------- /tests/service-dvwa.yml: -------------------------------------------------------------------------------- 1 | --- 2 | apiVersion: v1 3 | kind: Service 4 | metadata: 5 | name: dvwa-web-service 6 | spec: 7 | selector: 8 | app: dvwa-web 9 | tier: frontend 10 | type: LoadBalancer 11 | ports: 12 | - protocol: TCP 13 | # Port accessible inside cluster 14 | port: 8081 15 | # Port to forward to inside the pod 16 | targetPort: 80 17 | -------------------------------------------------------------------------------- /.github/labels.yml: -------------------------------------------------------------------------------- 1 | # The labels in this file are automatically synced with the repository 2 | # using the micnncim/action-label-syncer action. 3 | --- 4 | - name: C-dependency 5 | color: 1abc9c 6 | description: "Category: Dependency" 7 | - name: PR-block 8 | color: 3498db 9 | description: "Pull Request: Do not merge" 10 | - name: PR-merge 11 | color: 3498db 12 | description: "Pull Request: Merge when ready" 13 | -------------------------------------------------------------------------------- /.github/workflows/release-drafter.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: Release Drafter 3 | 4 | on: 5 | push: 6 | # branches to consider in the event; optional, defaults to all 7 | branches: 8 | - master 9 | 10 | jobs: 11 | update_release_draft: 12 | runs-on: ubuntu-latest 13 | steps: 14 | # Drafts your next Release notes as Pull Requests are merged into "master" 15 | - uses: release-drafter/release-drafter@v5 16 | with: 17 | publish: true 18 | env: 19 | GITHUB_TOKEN: ${{ secrets.RELEASE_DRAFTER_TOKEN }} 20 | -------------------------------------------------------------------------------- /.github/workflows/repository.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: Repository 3 | 4 | on: 5 | push: 6 | branches: 7 | - master 8 | paths: 9 | - .github/labels.yml 10 | 11 | jobs: 12 | labels: 13 | name: Labels 14 | runs-on: ubuntu-latest 15 | 16 | steps: 17 | - name: Checkout code 18 | uses: actions/checkout@v3 19 | 20 | - name: Sync labels 21 | uses: micnncim/action-label-syncer@v1 22 | env: 23 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 24 | with: 25 | manifest: .github/labels.yml 26 | -------------------------------------------------------------------------------- /.github/release-drafter.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name-template: '$RESOLVED_VERSION 🌈' 3 | tag-template: '$RESOLVED_VERSION' 4 | version-template: '$MAJOR.$MINOR' 5 | categories: 6 | - title: '🚀 Features' 7 | labels: 8 | - 'feature' 9 | - 'enhancement' 10 | - title: '🐛 Bug Fixes' 11 | labels: 12 | - 'fix' 13 | - 'bugfix' 14 | - 'bug' 15 | - title: '🧰 Maintenance' 16 | label: 'chore' 17 | change-template: '- $TITLE @$AUTHOR (#$NUMBER)' 18 | change-title-escapes: '\<*_&' # You can add # and @ to disable mentions, and add ` to disable code blocks. 19 | version-resolver: 20 | major: 21 | labels: 22 | - 'major' 23 | minor: 24 | labels: 25 | - 'minor' 26 | patch: 27 | labels: 28 | - 'patch' 29 | default: minor 30 | template: | 31 | ## Changes 32 | 33 | $CHANGES 34 | -------------------------------------------------------------------------------- /.github/workflows/lint.yml: -------------------------------------------------------------------------------- 1 | --- 2 | 3 | # ------------------------------------------------------------------------------------------------- 4 | # Job Name 5 | # ------------------------------------------------------------------------------------------------- 6 | name: lint 7 | 8 | 9 | # ------------------------------------------------------------------------------------------------- 10 | # When to run 11 | # ------------------------------------------------------------------------------------------------- 12 | on: 13 | # Runs on Pull Requests 14 | pull_request: 15 | 16 | 17 | # ------------------------------------------------------------------------------------------------- 18 | # What to run 19 | # ------------------------------------------------------------------------------------------------- 20 | jobs: 21 | lint: 22 | uses: devilbox/github-actions/.github/workflows/lint-generic.yml@master 23 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 cytopia 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /.github/workflows/action_pull_request.yml: -------------------------------------------------------------------------------- 1 | --- 2 | 3 | # ------------------------------------------------------------------------------------------------- 4 | # Job Name 5 | # ------------------------------------------------------------------------------------------------- 6 | name: build 7 | 8 | 9 | # ------------------------------------------------------------------------------------------------- 10 | # When to run 11 | # ------------------------------------------------------------------------------------------------- 12 | on: 13 | pull_request: 14 | 15 | 16 | jobs: 17 | 18 | # (1/2) Determine repository params 19 | params: 20 | uses: ./.github/workflows/params.yml 21 | # Only run for forks (contributor) 22 | if: github.event.pull_request.head.repo.fork 23 | 24 | # (2/2) Build 25 | docker: 26 | needs: [params] 27 | uses: devilbox/github-actions/.github/workflows/docker-name-version-flavour-arch.yml@master 28 | with: 29 | enabled: true 30 | can_deploy: false 31 | matrix: ${{ needs.params.outputs.matrix }} 32 | refs: ${{ needs.params.outputs.refs }} 33 | secrets: 34 | dockerhub_username: "" 35 | dockerhub_password: "" 36 | -------------------------------------------------------------------------------- /.github/workflows/action_schedule.yml: -------------------------------------------------------------------------------- 1 | --- 2 | 3 | # ------------------------------------------------------------------------------------------------- 4 | # Job Name 5 | # ------------------------------------------------------------------------------------------------- 6 | name: nightly 7 | 8 | 9 | # ------------------------------------------------------------------------------------------------- 10 | # When to run 11 | # ------------------------------------------------------------------------------------------------- 12 | on: 13 | # Runs daily 14 | schedule: 15 | - cron: '0 0 * * *' 16 | 17 | 18 | jobs: 19 | 20 | # (1/2) Determine repository params 21 | params: 22 | uses: ./.github/workflows/params.yml 23 | 24 | # (2/2) Build 25 | docker: 26 | needs: [params] 27 | uses: devilbox/github-actions/.github/workflows/docker-name-version-flavour-arch.yml@master 28 | with: 29 | enabled: true 30 | can_deploy: true 31 | matrix: ${{ needs.params.outputs.matrix }} 32 | refs: ${{ needs.params.outputs.refs }} 33 | secrets: 34 | dockerhub_username: ${{ secrets.DOCKERHUB_USERNAME }} 35 | dockerhub_password: ${{ secrets.DOCKERHUB_PASSWORD }} 36 | -------------------------------------------------------------------------------- /.github/workflows/action_branch.yml: -------------------------------------------------------------------------------- 1 | --- 2 | 3 | # ------------------------------------------------------------------------------------------------- 4 | # Job Name 5 | # ------------------------------------------------------------------------------------------------- 6 | name: build 7 | 8 | 9 | # ------------------------------------------------------------------------------------------------- 10 | # When to run 11 | # ------------------------------------------------------------------------------------------------- 12 | on: 13 | push: 14 | paths: 15 | - 'Makefile' 16 | - 'Dockerfiles/**' 17 | - 'tests/**' 18 | - '.github/workflows/action*.yml' 19 | - '.github/workflows/params.yml' 20 | 21 | jobs: 22 | 23 | # (1/2) Determine repository params 24 | params: 25 | uses: ./.github/workflows/params.yml 26 | 27 | # (2/2) Build 28 | docker: 29 | needs: [params] 30 | uses: devilbox/github-actions/.github/workflows/docker-name-version-flavour-arch.yml@master 31 | with: 32 | enabled: true 33 | can_deploy: ${{ github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags/') || startsWith(github.ref, 'refs/heads/release-') }} 34 | matrix: ${{ needs.params.outputs.matrix }} 35 | refs: ${{ needs.params.outputs.refs }} 36 | secrets: 37 | dockerhub_username: ${{ secrets.DOCKERHUB_USERNAME }} 38 | dockerhub_password: ${{ secrets.DOCKERHUB_PASSWORD }} 39 | -------------------------------------------------------------------------------- /tests/deployment-mysql.yml: -------------------------------------------------------------------------------- 1 | --- 2 | apiVersion: apps/v1 3 | kind: Deployment 4 | 5 | 6 | ### 7 | ### Deployment Metadata 8 | ### 9 | metadata: 10 | name: dvwa-mysql 11 | 12 | 13 | ### 14 | ### Specs 15 | ### 16 | spec: 17 | replicas: 1 18 | 19 | selector: 20 | matchLabels: 21 | app: dvwa-mysql 22 | tier: backend 23 | 24 | template: 25 | 26 | # Template Metadata to be used by service for discovery 27 | metadata: 28 | labels: 29 | app: dvwa-mysql 30 | tier: backend 31 | 32 | # Container/Volume definition 33 | spec: 34 | containers: 35 | - name: mysql 36 | image: mariadb:10.4 37 | ports: 38 | - containerPort: 3306 39 | volumeMounts: 40 | - name: dvwa-mysql-vol 41 | mountPath: /var/lib/mysql 42 | env: 43 | - name: MYSQL_ROOT_PASSWORD 44 | valueFrom: 45 | secretKeyRef: 46 | name: dvwa-secrets 47 | key: ROOT_PASSWORD 48 | - name: MYSQL_USER 49 | valueFrom: 50 | secretKeyRef: 51 | name: dvwa-secrets 52 | key: DVWA_USERNAME 53 | - name: MYSQL_PASSWORD 54 | valueFrom: 55 | secretKeyRef: 56 | name: dvwa-secrets 57 | key: DVWA_PASSWORD 58 | - name: MYSQL_DATABASE 59 | valueFrom: 60 | secretKeyRef: 61 | name: dvwa-secrets 62 | key: DVWA_DATABASE 63 | volumes: 64 | - name: dvwa-mysql-vol 65 | persistentVolumeClaim: 66 | claimName: dvwa-mysql-data-claim 67 | -------------------------------------------------------------------------------- /Dockerfiles/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM alpine:3.16 as builder 2 | 3 | RUN set -eux \ 4 | && apk add --no-cache \ 5 | coreutils \ 6 | git \ 7 | go \ 8 | make \ 9 | wget 10 | 11 | ARG VERSION 12 | RUN set -eux \ 13 | && git clone https://github.com/instrumenta/kubeval /tmp/kubeval \ 14 | && cd /tmp/kubeval \ 15 | \ 16 | && if [ "${VERSION}" = "latest" ]; then \ 17 | GIT_TAG="$( git tag | sort -V | tail -1 )"; \ 18 | else \ 19 | GIT_TAG="$( git tag | grep "${VERSION}" | sort -V | tail -1 )"; \ 20 | fi \ 21 | \ 22 | && git checkout "${GIT_TAG}" \ 23 | \ 24 | && GIT_VERSION="$( echo "${GIT_TAG}" | sed 's/v//g' )" \ 25 | && GIT_COMMIT="$( git rev-parse HEAD )" \ 26 | && GIT_DATE="$( git show -s --format=%ci "${GIT_COMMIT}" )" \ 27 | \ 28 | && sed -i'' "s/^\s*version\s*=\s\".*\"\$/version = \"${GIT_VERSION}\"/g" main.go \ 29 | && sed -i'' "s/^\s*commit\s*=\s\".*\"\$/commit = \"${GIT_COMMIT}\"/g" main.go \ 30 | && sed -i'' "s/^\s*date\s*=\s\".*\"\$/date = \"${GIT_DATE}\"/g" main.go \ 31 | && grep 'var (' -A 10 main.go \ 32 | \ 33 | && make build \ 34 | && mv bin/kubeval /usr/bin/kubeval \ 35 | && chmod +x /usr/bin/kubeval \ 36 | && kubeval --version 37 | 38 | 39 | FROM alpine:3.16 as production 40 | ARG VERSION 41 | # https://github.com/opencontainers/image-spec/blob/master/annotations.md 42 | #LABEL "org.opencontainers.image.created"="" 43 | #LABEL "org.opencontainers.image.version"="" 44 | #LABEL "org.opencontainers.image.revision"="" 45 | LABEL "maintainer"="cytopia " 46 | LABEL "org.opencontainers.image.authors"="cytopia " 47 | LABEL "org.opencontainers.image.vendor"="cytopia" 48 | LABEL "org.opencontainers.image.licenses"="MIT" 49 | LABEL "org.opencontainers.image.url"="https://github.com/cytopia/docker-kubeval" 50 | LABEL "org.opencontainers.image.documentation"="https://github.com/cytopia/docker-kubeval" 51 | LABEL "org.opencontainers.image.source"="https://github.com/cytopia/docker-kubeval" 52 | LABEL "org.opencontainers.image.ref.name"="kubeval ${VERSION}" 53 | LABEL "org.opencontainers.image.title"="kubeval ${VERSION}" 54 | LABEL "org.opencontainers.image.description"="kubeval ${VERSION}" 55 | 56 | COPY --from=builder /usr/bin/kubeval /usr/bin/kubeval 57 | WORKDIR /data 58 | ENTRYPOINT ["kubeval"] 59 | CMD ["--version"] 60 | -------------------------------------------------------------------------------- /tests/deployment-dvwa.yml: -------------------------------------------------------------------------------- 1 | --- 2 | apiVersion: apps/v1 3 | kind: Deployment 4 | 5 | 6 | ### 7 | ### Deployment Metadata 8 | ### 9 | metadata: 10 | name: dvwa-web 11 | 12 | 13 | ### 14 | ### Specs 15 | ### 16 | spec: 17 | replicas: 1 18 | 19 | selector: 20 | matchLabels: 21 | app: dvwa-web 22 | tier: frontend 23 | 24 | template: 25 | 26 | # Template Metadata to be used by service for discovery 27 | metadata: 28 | labels: 29 | app: dvwa-web 30 | tier: frontend 31 | 32 | # Container/Volume definition 33 | spec: 34 | containers: 35 | - name: dvwa 36 | image: cytopia/dvwa:php-7.2 37 | ports: 38 | - containerPort: 80 39 | env: 40 | - name: RECAPTCHA_PRIV_KEY 41 | valueFrom: 42 | configMapKeyRef: 43 | name: dvwa-config 44 | key: RECAPTCHA_PRIV_KEY 45 | - name: RECAPTCHA_PUB_KEY 46 | valueFrom: 47 | configMapKeyRef: 48 | name: dvwa-config 49 | key: RECAPTCHA_PUB_KEY 50 | - name: SECURITY_LEVEL 51 | valueFrom: 52 | configMapKeyRef: 53 | name: dvwa-config 54 | key: SECURITY_LEVEL 55 | - name: PHPIDS_ENABLED 56 | valueFrom: 57 | configMapKeyRef: 58 | name: dvwa-config 59 | key: PHPIDS_ENABLED 60 | - name: PHPIDS_VERBOSE 61 | valueFrom: 62 | configMapKeyRef: 63 | name: dvwa-config 64 | key: PHPIDS_VERBOSE 65 | - name: PHP_DISPLAY_ERRORS 66 | valueFrom: 67 | configMapKeyRef: 68 | name: dvwa-config 69 | key: PHP_DISPLAY_ERRORS 70 | 71 | - name: MYSQL_HOSTNAME 72 | value: dvwa-mysql-service 73 | - name: MYSQL_DATABASE 74 | valueFrom: 75 | secretKeyRef: 76 | name: dvwa-secrets 77 | key: DVWA_DATABASE 78 | - name: MYSQL_USERNAME 79 | valueFrom: 80 | secretKeyRef: 81 | name: dvwa-secrets 82 | key: DVWA_USERNAME 83 | - name: MYSQL_PASSWORD 84 | valueFrom: 85 | secretKeyRef: 86 | name: dvwa-secrets 87 | key: DVWA_PASSWORD 88 | -------------------------------------------------------------------------------- /.github/workflows/params.yml: -------------------------------------------------------------------------------- 1 | --- 2 | 3 | # ------------------------------------------------------------------------------------------------- 4 | # Job Name 5 | # ------------------------------------------------------------------------------------------------- 6 | name: params 7 | 8 | 9 | # ------------------------------------------------------------------------------------------------- 10 | # Custom Variables 11 | # ------------------------------------------------------------------------------------------------- 12 | env: 13 | MATRIX: >- 14 | [ 15 | { 16 | "NAME": "kubeval", 17 | "VERSION": [ 18 | "latest", 19 | "0.16", 20 | "0.15", 21 | "0.14", 22 | "0.13", 23 | "0.12", 24 | "0.11", 25 | "0.10" 26 | ], 27 | "FLAVOUR": ["latest"], 28 | "ARCH": ["linux/amd64", "linux/386", "linux/arm64", "linux/arm/v7", "linux/arm/v6", "linux/ppc64le", "linux/s390x"] 29 | } 30 | ] 31 | 32 | 33 | # ------------------------------------------------------------------------------------------------- 34 | # When to run 35 | # ------------------------------------------------------------------------------------------------- 36 | on: 37 | workflow_call: 38 | outputs: 39 | matrix: 40 | description: "The determined version matrix" 41 | value: ${{ jobs.params.outputs.matrix }} 42 | refs: 43 | description: "The determined git ref matrix (only during scheduled run)" 44 | value: ${{ jobs.params.outputs.refs }} 45 | 46 | jobs: 47 | params: 48 | runs-on: ubuntu-latest 49 | 50 | outputs: 51 | matrix: ${{ steps.set-matrix.outputs.matrix }} 52 | refs: ${{ steps.set-refs.outputs.matrix }} 53 | 54 | steps: 55 | - name: "[Set-Output] Matrix" 56 | id: set-matrix 57 | run: | 58 | echo "matrix=$( echo '${{ env.MATRIX }}' | jq -M -c )" >> $GITHUB_OUTPUT 59 | 60 | - name: "[Set-Output] Matrix 'Refs' (master branch and latest tag)" 61 | id: set-refs 62 | uses: cytopia/git-ref-matrix-action@v0.1.13 63 | with: 64 | repository_default_branch: master 65 | branches: master 66 | num_latest_tags: 0 67 | if: github.event_name == 'schedule' 68 | 69 | - name: "[DEBUG] Show settings'" 70 | run: | 71 | echo 'Matrix' 72 | echo '--------------------' 73 | echo '${{ steps.set-matrix.outputs.matrix }}' 74 | echo 75 | 76 | echo 'Matrix: Refs' 77 | echo '--------------------' 78 | echo '${{ steps.set-matrix-refs.outputs.matrix }}' 79 | echo 80 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | ifneq (,) 2 | .error This Makefile requires GNU Make. 3 | endif 4 | 5 | # Ensure additional Makefiles are present 6 | MAKEFILES = Makefile.docker Makefile.lint 7 | $(MAKEFILES): URL=https://raw.githubusercontent.com/devilbox/makefiles/master/$(@) 8 | $(MAKEFILES): 9 | @if ! (curl --fail -sS -o $(@) $(URL) || wget -O $(@) $(URL)); then \ 10 | echo "Error, curl or wget required."; \ 11 | echo "Exiting."; \ 12 | false; \ 13 | fi 14 | include $(MAKEFILES) 15 | 16 | # Set default Target 17 | .DEFAULT_GOAL := help 18 | 19 | 20 | # ------------------------------------------------------------------------------------------------- 21 | # Default configuration 22 | # ------------------------------------------------------------------------------------------------- 23 | # Own vars 24 | TAG = latest 25 | 26 | # Makefile.docker overwrites 27 | NAME = kubeval 28 | VERSION = latest 29 | IMAGE = cytopia/kubeval 30 | FLAVOUR = latest 31 | DIR = Dockerfiles 32 | 33 | FILE = Dockerfile 34 | 35 | # Building from master branch: Tag == 'latest' 36 | ifeq ($(strip $(TAG)),latest) 37 | ifeq ($(strip $(VERSION)),latest) 38 | DOCKER_TAG = latest 39 | else 40 | DOCKER_TAG = $(VERSION) 41 | endif 42 | # Building from any other branch or tag: Tag == '' 43 | else 44 | ifeq ($(strip $(VERSION)),latest) 45 | DOCKER_TAG = latest-$(TAG) 46 | else 47 | DOCKER_TAG = $(VERSION)-$(TAG) 48 | endif 49 | endif 50 | 51 | # Makefile.lint overwrites 52 | FL_IGNORES = .git/,.github/ 53 | SC_IGNORES = .git/,.github/ 54 | JL_IGNORES = .git/,.github/ 55 | 56 | 57 | # ------------------------------------------------------------------------------------------------- 58 | # Default Target 59 | # ------------------------------------------------------------------------------------------------- 60 | .PHONY: help 61 | help: 62 | @echo "lint Lint project files and repository" 63 | @echo 64 | @echo "build [ARCH=...] [TAG=...] Build Docker image" 65 | @echo "rebuild [ARCH=...] [TAG=...] Build Docker image without cache" 66 | @echo "push [ARCH=...] [TAG=...] Push Docker image to Docker hub" 67 | @echo 68 | @echo "manifest-create [ARCHES=...] [TAG=...] Create multi-arch manifest" 69 | @echo "manifest-push [TAG=...] Push multi-arch manifest" 70 | @echo 71 | @echo "test [ARCH=...] Test built Docker image" 72 | @echo 73 | 74 | 75 | # ------------------------------------------------------------------------------------------------- 76 | # Docker Targets 77 | # ------------------------------------------------------------------------------------------------- 78 | .PHONY: build 79 | build: ARGS+=--build-arg VERSION=$(VERSION) 80 | build: docker-arch-build 81 | 82 | .PHONY: rebuild 83 | rebuild: ARGS+=--build-arg VERSION=$(VERSION) 84 | rebuild: docker-arch-rebuild 85 | 86 | .PHONY: push 87 | push: docker-arch-push 88 | 89 | 90 | # ------------------------------------------------------------------------------------------------- 91 | # Manifest Targets 92 | # ------------------------------------------------------------------------------------------------- 93 | .PHONY: manifest-create 94 | manifest-create: docker-manifest-create 95 | 96 | .PHONY: manifest-push 97 | manifest-push: docker-manifest-push 98 | 99 | 100 | # ------------------------------------------------------------------------------------------------- 101 | # Test Targets 102 | # ------------------------------------------------------------------------------------------------- 103 | .PHONY: test 104 | test: _test-version 105 | test: _test-run 106 | 107 | .PHONY: _test-version 108 | _test-version: 109 | @echo "------------------------------------------------------------" 110 | @echo "- Testing correct version" 111 | @echo "------------------------------------------------------------" 112 | @if [ "$(VERSION)" = "latest" ]; then \ 113 | echo "Fetching latest version from GitHub"; \ 114 | LATEST="$$( \ 115 | curl -L -sS https://github.com/instrumenta/kubeval/releases/ \ 116 | | tac | tac \ 117 | | grep -Eo "instrumenta/kubeval/releases/tag/v?[.0-9]+" \ 118 | | sed 's/.*tag\///g' \ 119 | | sort -V \ 120 | | tail -1 \ 121 | | grep -Eo '[.0-9]+' \ 122 | )"; \ 123 | echo "Testing for latest: $${LATEST}"; \ 124 | if ! docker run --rm --platform $(ARCH) $(IMAGE):$(DOCKER_TAG) --version | grep -E "Version: $${LATEST}$$"; then \ 125 | docker run --rm --platform $(ARCH) $(IMAGE):$(DOCKER_TAG) --version; \ 126 | echo "Failed"; \ 127 | exit 1; \ 128 | fi; \ 129 | else \ 130 | echo "Testing for tag: $(VERSION)"; \ 131 | if ! docker run --rm --platform $(ARCH) $(IMAGE):$(DOCKER_TAG) --version | grep -E "Version: $(VERSION)"; then \ 132 | docker run --rm --platform $(ARCH) $(IMAGE):$(DOCKER_TAG) --version; \ 133 | echo "Failed"; \ 134 | exit 1; \ 135 | fi; \ 136 | fi; \ 137 | echo "Success"; \ 138 | 139 | .PHONY: _test-run 140 | _test-run: 141 | @echo "------------------------------------------------------------" 142 | @echo "- Testing k8s files" 143 | @echo "------------------------------------------------------------" 144 | @if ! docker run --rm --platform $(ARCH) -v $(CURRENT_DIR):/data $(IMAGE):$(DOCKER_TAG) tests/*.yml ; then \ 145 | echo "Failed"; \ 146 | exit 1; \ 147 | fi; \ 148 | echo "Success"; 149 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Docker image for `kubeval` 2 | 3 | [![Tag](https://img.shields.io/github/tag/cytopia/docker-kubeval.svg)](https://github.com/cytopia/docker-kubeval/releases) 4 | [![](https://img.shields.io/badge/github-cytopia%2Fdocker--kubeval-red.svg)](https://github.com/cytopia/docker-kubeval "github.com/cytopia/docker-kubeval") 5 | [![License](https://img.shields.io/badge/license-MIT-%233DA639.svg)](https://opensource.org/licenses/MIT) 6 | 7 | [![lint](https://github.com/cytopia/docker-kubeval/workflows/lint/badge.svg)](https://github.com/cytopia/docker-kubeval/actions?query=workflow%3Alint) 8 | [![build](https://github.com/cytopia/docker-kubeval/workflows/build/badge.svg)](https://github.com/cytopia/docker-kubeval/actions?query=workflow%3Abuild) 9 | [![nightly](https://github.com/cytopia/docker-kubeval/workflows/nightly/badge.svg)](https://github.com/cytopia/docker-kubeval/actions?query=workflow%3Anightly) 10 | 11 | 12 | > #### All [#awesome-ci](https://github.com/topics/awesome-ci) Docker images 13 | > 14 | > [ansible-lint][alint-git-lnk] **•** 15 | > [ansible][ansible-git-lnk] **•** 16 | > [awesome-ci][aci-git-lnk] **•** 17 | > [bandit][bandit-git-lnk] **•** 18 | > [black][black-git-lnk] **•** 19 | > [checkmake][cm-git-lnk] **•** 20 | > [eslint][elint-git-lnk] **•** 21 | > [file-lint][flint-git-lnk] **•** 22 | > [gofmt][gfmt-git-lnk] **•** 23 | > [goimports][gimp-git-lnk] **•** 24 | > [golint][glint-git-lnk] **•** 25 | > [jsonlint][jlint-git-lnk] **•** 26 | > [kubeval][kubeval-git-lnk] **•** 27 | > [linkcheck][linkcheck-git-lnk] **•** 28 | > [mypy][mypy-git-lnk] **•** 29 | > [php-cs-fixer][pcsf-git-lnk] **•** 30 | > [phpcbf][pcbf-git-lnk] **•** 31 | > [phpcs][pcs-git-lnk] **•** 32 | > [phplint][plint-git-lnk] **•** 33 | > [pycodestyle][pycs-git-lnk] **•** 34 | > [pydocstyle][pyds-git-lnk] **•** 35 | > [pylint][pylint-git-lnk] **•** 36 | > [terraform-docs][tfdocs-git-lnk] **•** 37 | > [terragrunt-fmt][tgfmt-git-lnk] **•** 38 | > [terragrunt][tg-git-lnk] **•** 39 | > [yamlfmt][yfmt-git-lnk] **•** 40 | > [yamllint][ylint-git-lnk] 41 | 42 | View **[Dockerfiles](https://github.com/cytopia/docker-kubeval/blob/master/Dockerfiles/)** on GitHub. 43 | 44 | 45 | **Available Architectures:** `amd64`, `i386`, `arm64`, `arm/v7`, `arm/v6`, `ppc64le`, `s390x` 46 | 47 | Tiny Alpine-based multistage-build dockerized version of [kubeval](https://github.com/instrumenta/kubeval)[1]. 48 | The image is built nightly against multiple stable versions and pushed to Dockerhub. 49 | 50 | [1] Official project: https://github.com/instrumenta/kubeval 51 | 52 | ## :whale: Available Docker image versions 53 | 54 | [![](https://img.shields.io/docker/pulls/cytopia/kubeval.svg)](https://hub.docker.com/r/cytopia/kubeval) 55 | [![Docker](https://badgen.net/badge/icon/:latest?icon=docker&label=cytopia/kubeval)](https://hub.docker.com/r/cytopia/kubeval) 56 | 57 | #### Rolling releaess 58 | 59 | The following Docker image tags are rolling releases and are built and updated every night. 60 | 61 | [![nightly](https://github.com/cytopia/docker-kubeval/workflows/nightly/badge.svg)](https://github.com/cytopia/docker-kubeval/actions?query=workflow%3Anightly) 62 | 63 | | Docker Tag | Git Ref | kubeval | Available Architectures | 64 | |----------------------|-----------|--------------|----------------------------------------------| 65 | | `latest` | master | latest | `amd64`, `i386`, `arm64`, `arm/v7`, `arm/v6`, `ppc64le`, `s390x` | 66 | | `0.16` | master | **`0.16.x`** | `amd64`, `i386`, `arm64`, `arm/v7`, `arm/v6`, `ppc64le`, `s390x` | 67 | | `0.15` | master | **`0.15.x`** | `amd64`, `i386`, `arm64`, `arm/v7`, `arm/v6`, `ppc64le`, `s390x` | 68 | | `0.14` | master | **`0.14.x`** | `amd64`, `i386`, `arm64`, `arm/v7`, `arm/v6`, `ppc64le`, `s390x` | 69 | | `0.13` | master | **`0.13.x`** | `amd64`, `i386`, `arm64`, `arm/v7`, `arm/v6`, `ppc64le`, `s390x` | 70 | | `0.12` | master | **`0.12.x`** | `amd64`, `i386`, `arm64`, `arm/v7`, `arm/v6`, `ppc64le`, `s390x` | 71 | | `0.11` | master | **`0.11.x`** | `amd64`, `i386`, `arm64`, `arm/v7`, `arm/v6`, `ppc64le`, `s390x` | 72 | | `0.10` | master | **`0.10.x`** | `amd64`, `i386`, `arm64`, `arm/v7`, `arm/v6`, `ppc64le`, `s390x` | 73 | 74 | #### Point in time releases 75 | 76 | The following Docker image tags are built once and can be used for reproducible builds. Its version never changes so you will have to update tags in your pipelines from time to time in order to stay up-to-date. 77 | 78 | [![build](https://github.com/cytopia/docker-kubeval/workflows/build/badge.svg)](https://github.com/cytopia/docker-kubeval/actions?query=workflow%3Abuild) 79 | 80 | | Docker Tag | Git Ref | kubeval | Available Architectures | 81 | |----------------------|--------------|--------------|----------------------------------------------| 82 | | `latest-` | tag: `` | latest | `amd64`, `i386`, `arm64`, `arm/v7`, `arm/v6`, `ppc64le`, `s390x` | 83 | | `0.16-` | tag: `` | **`0.16.x`** | `amd64`, `i386`, `arm64`, `arm/v7`, `arm/v6`, `ppc64le`, `s390x` | 84 | | `0.15-` | tag: `` | **`0.15.x`** | `amd64`, `i386`, `arm64`, `arm/v7`, `arm/v6`, `ppc64le`, `s390x` | 85 | | `0.14-` | tag: `` | **`0.14.x`** | `amd64`, `i386`, `arm64`, `arm/v7`, `arm/v6`, `ppc64le`, `s390x` | 86 | | `0.13-` | tag: `` | **`0.13.x`** | `amd64`, `i386`, `arm64`, `arm/v7`, `arm/v6`, `ppc64le`, `s390x` | 87 | | `0.12-` | tag: `` | **`0.12.x`** | `amd64`, `i386`, `arm64`, `arm/v7`, `arm/v6`, `ppc64le`, `s390x` | 88 | | `0.11-` | tag: `` | **`0.11.x`** | `amd64`, `i386`, `arm64`, `arm/v7`, `arm/v6`, `ppc64le`, `s390x` | 89 | | `0.10-` | tag: `` | **`0.10.x`** | `amd64`, `i386`, `arm64`, `arm/v7`, `arm/v6`, `ppc64le`, `s390x` | 90 | 91 | > Where `` refers to the chosen git tag from this repository. 92 | 93 | 94 | ## :open_file_folder: Docker mounts 95 | 96 | The working directory inside the Docker container is **`/data/`** and should be mounted locally to 97 | the root of your project. 98 | 99 | 100 | ## :computer: Usage 101 | 102 | ```bash 103 | docker run --rm -v $(pwd):/data cytopia/kubeval *.yml 104 | ``` 105 | 106 | 107 | ## :arrows_counterclockwise: Related [#awesome-ci](https://github.com/topics/awesome-ci) projects 108 | 109 | ### Docker images 110 | 111 | Save yourself from installing lot's of dependencies and pick a dockerized version of your favourite 112 | linter below for reproducible local or remote CI tests: 113 | 114 | | GitHub | DockerHub | Type | Description | 115 | |--------|-----------|------|-------------| 116 | | [awesome-ci][aci-git-lnk] | [![aci-hub-img]][aci-hub-lnk] | Basic | Tools for git, file and static source code analysis | 117 | | [file-lint][flint-git-lnk] | [![flint-hub-img]][flint-hub-lnk] | Basic | Baisc source code analysis | 118 | | [linkcheck][linkcheck-git-lnk] | [![linkcheck-hub-img]][flint-hub-lnk] | Basic | Search for URLs in files and validate their HTTP status code | 119 | | [ansible][ansible-git-lnk] | [![ansible-hub-img]][ansible-hub-lnk] | Ansible | Multiple versions and flavours of Ansible | 120 | | [ansible-lint][alint-git-lnk] | [![alint-hub-img]][alint-hub-lnk] | Ansible | Lint Ansible | 121 | | [gofmt][gfmt-git-lnk] | [![gfmt-hub-img]][gfmt-hub-lnk] | Go | Format Go source code **[1]** | 122 | | [goimports][gimp-git-lnk] | [![gimp-hub-img]][gimp-hub-lnk] | Go | Format Go source code **[1]** | 123 | | [golint][glint-git-lnk] | [![glint-hub-img]][glint-hub-lnk] | Go | Lint Go code | 124 | | [eslint][elint-git-lnk] | [![elint-hub-img]][elint-hub-lnk] | Javascript | Lint Javascript code | 125 | | [jsonlint][jlint-git-lnk] | [![jlint-hub-img]][jlint-hub-lnk] | JSON | Lint JSON files **[1]** | 126 | | [kubeval][kubeval-git-lnk] | [![kubeval-hub-img]][kubeval-hub-lnk] | K8s | Lint Kubernetes files | 127 | | [checkmake][cm-git-lnk] | [![cm-hub-img]][cm-hub-lnk] | Make | Lint Makefiles | 128 | | [phpcbf][pcbf-git-lnk] | [![pcbf-hub-img]][pcbf-hub-lnk] | PHP | PHP Code Beautifier and Fixer | 129 | | [phpcs][pcs-git-lnk] | [![pcs-hub-img]][pcs-hub-lnk] | PHP | PHP Code Sniffer | 130 | | [phplint][plint-git-lnk] | [![plint-hub-img]][plint-hub-lnk] | PHP | PHP Code Linter **[1]** | 131 | | [php-cs-fixer][pcsf-git-lnk] | [![pcsf-hub-img]][pcsf-hub-lnk] | PHP | PHP Coding Standards Fixer | 132 | | [bandit][bandit-git-lnk] | [![bandit-hub-img]][bandit-hub-lnk] | Python | A security linter from PyCQA 133 | | [black][black-git-lnk] | [![black-hub-img]][black-hub-lnk] | Python | The uncompromising Python code formatter | 134 | | [mypy][mypy-git-lnk] | [![mypy-hub-img]][mypy-hub-lnk] | Python | Static source code analysis | 135 | | [pycodestyle][pycs-git-lnk] | [![pycs-hub-img]][pycs-hub-lnk] | Python | Python style guide checker | 136 | | [pydocstyle][pyds-git-lnk] | [![pyds-hub-img]][pyds-hub-lnk] | Python | Python docstyle checker | 137 | | [pylint][pylint-git-lnk] | [![pylint-hub-img]][pylint-hub-lnk] | Python | Python source code, bug and quality checker | 138 | | [terraform-docs][tfdocs-git-lnk] | [![tfdocs-hub-img]][tfdocs-hub-lnk] | Terraform | Terraform doc generator (TF 0.12 ready) **[1]** | 139 | | [terragrunt][tg-git-lnk] | [![tg-hub-img]][tg-hub-lnk] | Terraform | Terragrunt and Terraform | 140 | | [terragrunt-fmt][tgfmt-git-lnk] | [![tgfmt-hub-img]][tgfmt-hub-lnk] | Terraform | `terraform fmt` for Terragrunt files **[1]** | 141 | | [yamlfmt][yfmt-git-lnk] | [![yfmt-hub-img]][yfmt-hub-lnk] | Yaml | Format Yaml files **[1]** | 142 | | [yamllint][ylint-git-lnk] | [![ylint-hub-img]][ylint-hub-lnk] | Yaml | Lint Yaml files | 143 | 144 | > **[1]** Uses a shell wrapper to add **enhanced functionality** not available by original project. 145 | 146 | [aci-git-lnk]: https://github.com/cytopia/awesome-ci 147 | [aci-hub-img]: https://img.shields.io/docker/pulls/cytopia/awesome-ci.svg 148 | [aci-hub-lnk]: https://hub.docker.com/r/cytopia/awesome-ci 149 | 150 | [flint-git-lnk]: https://github.com/cytopia/docker-file-lint 151 | [flint-hub-img]: https://img.shields.io/docker/pulls/cytopia/file-lint.svg 152 | [flint-hub-lnk]: https://hub.docker.com/r/cytopia/file-lint 153 | 154 | [linkcheck-git-lnk]: https://github.com/cytopia/docker-linkcheck 155 | [linkcheck-hub-img]: https://img.shields.io/docker/pulls/cytopia/linkcheck.svg 156 | [linkcheck-hub-lnk]: https://hub.docker.com/r/cytopia/linkcheck 157 | 158 | [jlint-git-lnk]: https://github.com/cytopia/docker-jsonlint 159 | [jlint-hub-img]: https://img.shields.io/docker/pulls/cytopia/jsonlint.svg 160 | [jlint-hub-lnk]: https://hub.docker.com/r/cytopia/jsonlint 161 | 162 | [ansible-git-lnk]: https://github.com/cytopia/docker-ansible 163 | [ansible-hub-img]: https://img.shields.io/docker/pulls/cytopia/ansible.svg 164 | [ansible-hub-lnk]: https://hub.docker.com/r/cytopia/ansible 165 | 166 | [alint-git-lnk]: https://github.com/cytopia/docker-ansible-lint 167 | [alint-hub-img]: https://img.shields.io/docker/pulls/cytopia/ansible-lint.svg 168 | [alint-hub-lnk]: https://hub.docker.com/r/cytopia/ansible-lint 169 | 170 | [kubeval-git-lnk]: https://github.com/cytopia/docker-kubeval 171 | [kubeval-hub-img]: https://img.shields.io/docker/pulls/cytopia/kubeval.svg 172 | [kubeval-hub-lnk]: https://hub.docker.com/r/cytopia/kubeval 173 | 174 | [gfmt-git-lnk]: https://github.com/cytopia/docker-gofmt 175 | [gfmt-hub-img]: https://img.shields.io/docker/pulls/cytopia/gofmt.svg 176 | [gfmt-hub-lnk]: https://hub.docker.com/r/cytopia/gofmt 177 | 178 | [gimp-git-lnk]: https://github.com/cytopia/docker-goimports 179 | [gimp-hub-img]: https://img.shields.io/docker/pulls/cytopia/goimports.svg 180 | [gimp-hub-lnk]: https://hub.docker.com/r/cytopia/goimports 181 | 182 | [glint-git-lnk]: https://github.com/cytopia/docker-golint 183 | [glint-hub-img]: https://img.shields.io/docker/pulls/cytopia/golint.svg 184 | [glint-hub-lnk]: https://hub.docker.com/r/cytopia/golint 185 | 186 | [elint-git-lnk]: https://github.com/cytopia/docker-eslint 187 | [elint-hub-img]: https://img.shields.io/docker/pulls/cytopia/eslint.svg 188 | [elint-hub-lnk]: https://hub.docker.com/r/cytopia/eslint 189 | 190 | [cm-git-lnk]: https://github.com/cytopia/docker-checkmake 191 | [cm-hub-img]: https://img.shields.io/docker/pulls/cytopia/checkmake.svg 192 | [cm-hub-lnk]: https://hub.docker.com/r/cytopia/checkmake 193 | 194 | [pcbf-git-lnk]: https://github.com/cytopia/docker-phpcbf 195 | [pcbf-hub-img]: https://img.shields.io/docker/pulls/cytopia/phpcbf.svg 196 | [pcbf-hub-lnk]: https://hub.docker.com/r/cytopia/phpcbf 197 | 198 | [pcs-git-lnk]: https://github.com/cytopia/docker-phpcs 199 | [pcs-hub-img]: https://img.shields.io/docker/pulls/cytopia/phpcs.svg 200 | [pcs-hub-lnk]: https://hub.docker.com/r/cytopia/phpcs 201 | 202 | [plint-git-lnk]: https://github.com/cytopia/docker-phplint 203 | [plint-hub-img]: https://img.shields.io/docker/pulls/cytopia/phplint.svg 204 | [plint-hub-lnk]: https://hub.docker.com/r/cytopia/phplint 205 | 206 | [pcsf-git-lnk]: https://github.com/cytopia/docker-php-cs-fixer 207 | [pcsf-hub-img]: https://img.shields.io/docker/pulls/cytopia/php-cs-fixer.svg 208 | [pcsf-hub-lnk]: https://hub.docker.com/r/cytopia/php-cs-fixer 209 | 210 | [bandit-git-lnk]: https://github.com/cytopia/docker-bandit 211 | [bandit-hub-img]: https://img.shields.io/docker/pulls/cytopia/bandit.svg 212 | [bandit-hub-lnk]: https://hub.docker.com/r/cytopia/bandit 213 | 214 | [black-git-lnk]: https://github.com/cytopia/docker-black 215 | [black-hub-img]: https://img.shields.io/docker/pulls/cytopia/black.svg 216 | [black-hub-lnk]: https://hub.docker.com/r/cytopia/black 217 | 218 | [mypy-git-lnk]: https://github.com/cytopia/docker-mypy 219 | [mypy-hub-img]: https://img.shields.io/docker/pulls/cytopia/mypy.svg 220 | [mypy-hub-lnk]: https://hub.docker.com/r/cytopia/mypy 221 | 222 | [pycs-git-lnk]: https://github.com/cytopia/docker-pycodestyle 223 | [pycs-hub-img]: https://img.shields.io/docker/pulls/cytopia/pycodestyle.svg 224 | [pycs-hub-lnk]: https://hub.docker.com/r/cytopia/pycodestyle 225 | 226 | [pyds-git-lnk]: https://github.com/cytopia/docker-pydocstyle 227 | [pyds-hub-img]: https://img.shields.io/docker/pulls/cytopia/pydocstyle.svg 228 | [pyds-hub-lnk]: https://hub.docker.com/r/cytopia/pydocstyle 229 | 230 | [pylint-git-lnk]: https://github.com/cytopia/docker-pylint 231 | [pylint-hub-img]: https://img.shields.io/docker/pulls/cytopia/pylint.svg 232 | [pylint-hub-lnk]: https://hub.docker.com/r/cytopia/pylint 233 | 234 | [tfdocs-git-lnk]: https://github.com/cytopia/docker-terraform-docs 235 | [tfdocs-hub-img]: https://img.shields.io/docker/pulls/cytopia/terraform-docs.svg 236 | [tfdocs-hub-lnk]: https://hub.docker.com/r/cytopia/terraform-docs 237 | 238 | [tg-git-lnk]: https://github.com/cytopia/docker-terragrunt 239 | [tg-hub-img]: https://img.shields.io/docker/pulls/cytopia/terragrunt.svg 240 | [tg-hub-lnk]: https://hub.docker.com/r/cytopia/terragrunt 241 | 242 | [tgfmt-git-lnk]: https://github.com/cytopia/docker-terragrunt-fmt 243 | [tgfmt-hub-img]: https://img.shields.io/docker/pulls/cytopia/terragrunt-fmt.svg 244 | [tgfmt-hub-lnk]: https://hub.docker.com/r/cytopia/terragrunt-fmt 245 | 246 | [yfmt-git-lnk]: https://github.com/cytopia/docker-yamlfmt 247 | [yfmt-hub-img]: https://img.shields.io/docker/pulls/cytopia/yamlfmt.svg 248 | [yfmt-hub-lnk]: https://hub.docker.com/r/cytopia/yamlfmt 249 | 250 | [ylint-git-lnk]: https://github.com/cytopia/docker-yamllint 251 | [ylint-hub-img]: https://img.shields.io/docker/pulls/cytopia/yamllint.svg 252 | [ylint-hub-lnk]: https://hub.docker.com/r/cytopia/yamllint 253 | 254 | 255 | ### Makefiles 256 | 257 | Visit **[cytopia/makefiles](https://github.com/cytopia/makefiles)** for dependency-less, seamless project integration and minimum required best-practice code linting for CI. 258 | The provided Makefiles will only require GNU Make and Docker itself removing the need to install anything else. 259 | 260 | 261 | ## :page_facing_up: License 262 | 263 | 264 | **[MIT License](LICENSE)** 265 | 266 | Copyright (c) 2019 [cytopia](https://github.com/cytopia) 267 | --------------------------------------------------------------------------------