diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..47a6366 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,166 @@ +--- + +# ------------------------------------------------------------------------------------------------- +# Job Name +# ------------------------------------------------------------------------------------------------- +name: build + + +# ------------------------------------------------------------------------------------------------- +# When to run +# ------------------------------------------------------------------------------------------------- +on: + # Runs on Pull Requests + pull_request: + # Runs on Push + push: + + +# ------------------------------------------------------------------------------------------------- +# What to run +# ------------------------------------------------------------------------------------------------- +jobs: + build: + name: "[ ${{ matrix.version }} ]" + runs-on: ubuntu-latest + strategy: + fail-fast: False + matrix: + version: + - 'latest' + steps: + + # ------------------------------------------------------------ + # Checkout repository + # ------------------------------------------------------------ + - name: Checkout repository + uses: actions/checkout@v2 + with: + fetch-depth: 0 + + - name: Set variables + id: vars + run: | + # Retrieve git info (tags, etc) + git fetch --all + + # Branch, Tag or Commit + GIT_TYPE="$( \ + curl -sS https://raw.githubusercontent.com/cytopia/git-tools/master/git-info.sh \ + | sh \ + | grep '^GIT_TYPE' \ + | sed 's|.*=||g' \ + )" + # Branch name, Tag name or Commit Hash + GIT_SLUG="$( \ + curl -sS https://raw.githubusercontent.com/cytopia/git-tools/master/git-info.sh \ + | sh \ + | grep '^GIT_NAME' \ + | sed 's|.*=||g' \ + )" + # Docker Tag + if [ "${GIT_TYPE}" = "BRANCH" ] && [ "${GIT_SLUG}" = "master" ]; then + DOCKER_TAG="${VERSION}" + else + DOCKER_TAG="${VERSION}-${GIT_SLUG}" + fi + + # Output + echo "GIT_TYPE=${GIT_TYPE}" + echo "GIT_SLUG=${GIT_SLUG}" + echo "DOCKER_TAG=${DOCKER_TAG}" + + # Export variable + # https://docs.github.com/en/free-pro-team@latest/actions/reference/workflow-commands-for-github-actions#environment-files + echo "GIT_TYPE=${GIT_TYPE}" >> ${GITHUB_ENV} + echo "GIT_SLUG=${GIT_SLUG}" >> ${GITHUB_ENV} + echo "DOCKER_TAG=${DOCKER_TAG}" >> ${GITHUB_ENV} + env: + VERSION: ${{ matrix.version }} + + + # ------------------------------------------------------------ + # Build + # ------------------------------------------------------------ + - name: Build + run: | + retry() { + for n in $(seq ${RETRIES}); do + echo "[${n}/${RETRIES}] ${*}"; + if eval "${*}"; then + echo "[SUCC] ${n}/${RETRIES}"; + return 0; + fi; + sleep 2; + echo "[FAIL] ${n}/${RETRIES}"; + done; + return 1; + } + retry make build VERSION=${VERSION} + env: + VERSION: ${{ matrix.version }} + RETRIES: 20 + + - name: Test + run: | + retry() { + for n in $(seq ${RETRIES}); do + echo "[${n}/${RETRIES}] ${*}"; + if eval "${*}"; then + echo "[SUCC] ${n}/${RETRIES}"; + return 0; + fi; + sleep 2; + echo "[FAIL] ${n}/${RETRIES}"; + done; + return 1; + } + retry make test VERSION=${VERSION} + git diff --quiet || { echo "Build Changes"; git diff; git status; false; } + env: + VERSION: ${{ matrix.version }} + RETRIES: 20 + + + # ------------------------------------------------------------ + # Deploy + # ------------------------------------------------------------ + - name: Publish images (only repo owner) + run: | + retry() { + for n in $(seq ${RETRIES}); do + echo "[${n}/${RETRIES}] ${*}"; + if eval "${*}"; then + echo "[SUCC] ${n}/${RETRIES}"; + return 0; + fi; + sleep ${PAUSE}; + echo "[FAIL] ${n}/${RETRIES}"; + done; + return 1; + } + + # Output + echo "GIT_TYPE=${GIT_TYPE}" + echo "GIT_SLUG=${GIT_SLUG}" + echo "DOCKER_TAG=${DOCKER_TAG}" + + # Tag image + retry make tag TAG=${DOCKER_TAG} + docker images + + # Login and Push + retry make login USER=${{ secrets.DOCKERHUB_USERNAME }} PASS=${{ secrets.DOCKERHUB_PASSWORD }} + retry make push TAG=${DOCKER_TAG} + env: + RETRIES: 20 + PAUSE: 10 + # https://help.github.com/en/github/automating-your-workflow-with-github-actions/contexts-and-expression-syntax-for-github-actions#functions + if: github.event.pull_request.base.repo.id == github.event.pull_request.head.repo.id + && ( + (github.event_name == 'schedule' && (github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags/'))) + || + (github.event_name == 'push' && (github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags/'))) + || + (github.event_name == 'push' && startsWith(github.ref, 'refs/heads/release-')) + ) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 0000000..ae19b94 --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,40 @@ +--- + +# ------------------------------------------------------------------------------------------------- +# Job Name +# ------------------------------------------------------------------------------------------------- +name: lint + + +# ------------------------------------------------------------------------------------------------- +# When to run +# ------------------------------------------------------------------------------------------------- +on: + # Runs on Pull Requests + pull_request: + + +# ------------------------------------------------------------------------------------------------- +# What to run +# ------------------------------------------------------------------------------------------------- +jobs: + lint: + name: "Lint" + runs-on: ubuntu-latest + steps: + # ------------------------------------------------------------ + # Setup repository + # ------------------------------------------------------------ + - name: Checkout repository + uses: actions/checkout@v2 + with: + fetch-depth: 0 + + # ------------------------------------------------------------ + # Lint repository + # ------------------------------------------------------------ + - name: Lint + id: vars + run: | + make lint + diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml new file mode 100644 index 0000000..0e55717 --- /dev/null +++ b/.github/workflows/nightly.yml @@ -0,0 +1,169 @@ +--- + +# ------------------------------------------------------------------------------------------------- +# Job Name +# ------------------------------------------------------------------------------------------------- +name: nightly + + +# ------------------------------------------------------------------------------------------------- +# When to run +# ------------------------------------------------------------------------------------------------- +on: + # Runs daily + schedule: + - cron: '0 0 * * *' + + +# ------------------------------------------------------------------------------------------------- +# What to run +# ------------------------------------------------------------------------------------------------- +jobs: + nightly: + name: "[ ${{ matrix.version }} ] (ref: ${{ matrix.refs }})" + runs-on: ubuntu-latest + strategy: + fail-fast: False + matrix: + version: + - 'latest' + refs: + - 'master' + - '0.3' + steps: + + # ------------------------------------------------------------ + # Checkout repository + # ------------------------------------------------------------ + - name: Checkout repository + uses: actions/checkout@v2 + with: + fetch-depth: 0 + ref: ${{ matrix.refs }} + + - name: Set variables + id: vars + run: | + # Retrieve git info (tags, etc) + git fetch --all + + # Branch, Tag or Commit + GIT_TYPE="$( \ + curl -sS https://raw.githubusercontent.com/cytopia/git-tools/master/git-info.sh \ + | sh \ + | grep '^GIT_TYPE' \ + | sed 's|.*=||g' \ + )" + # Branch name, Tag name or Commit Hash + GIT_SLUG="$( \ + curl -sS https://raw.githubusercontent.com/cytopia/git-tools/master/git-info.sh \ + | sh \ + | grep '^GIT_NAME' \ + | sed 's|.*=||g' \ + )" + # Docker Tag + if [ "${GIT_TYPE}" = "BRANCH" ] && [ "${GIT_SLUG}" = "master" ]; then + DOCKER_TAG="${VERSION}" + else + DOCKER_TAG="${VERSION}-${GIT_SLUG}" + fi + + # Output + echo "GIT_TYPE=${GIT_TYPE}" + echo "GIT_SLUG=${GIT_SLUG}" + echo "DOCKER_TAG=${DOCKER_TAG}" + + # Export variable + # https://docs.github.com/en/free-pro-team@latest/actions/reference/workflow-commands-for-github-actions#environment-files + echo "GIT_TYPE=${GIT_TYPE}" >> ${GITHUB_ENV} + echo "GIT_SLUG=${GIT_SLUG}" >> ${GITHUB_ENV} + echo "DOCKER_TAG=${DOCKER_TAG}" >> ${GITHUB_ENV} + env: + VERSION: ${{ matrix.version }} + + + # ------------------------------------------------------------ + # Build + # ------------------------------------------------------------ + - name: Build + run: | + retry() { + for n in $(seq ${RETRIES}); do + echo "[${n}/${RETRIES}] ${*}"; + if eval "${*}"; then + echo "[SUCC] ${n}/${RETRIES}"; + return 0; + fi; + sleep 2; + echo "[FAIL] ${n}/${RETRIES}"; + done; + return 1; + } + retry make build VERSION=${VERSION} + env: + VERSION: ${{ matrix.version }} + RETRIES: 20 + + - name: Test + run: | + retry() { + for n in $(seq ${RETRIES}); do + echo "[${n}/${RETRIES}] ${*}"; + if eval "${*}"; then + echo "[SUCC] ${n}/${RETRIES}"; + return 0; + fi; + sleep 2; + echo "[FAIL] ${n}/${RETRIES}"; + done; + return 1; + } + retry make test VERSION=${VERSION} + git diff --quiet || { echo "Build Changes"; git diff; git status; false; } + env: + VERSION: ${{ matrix.version }} + RETRIES: 20 + + + # ------------------------------------------------------------ + # Deploy + # ------------------------------------------------------------ + - name: Publish images (only repo owner) + run: | + retry() { + for n in $(seq ${RETRIES}); do + echo "[${n}/${RETRIES}] ${*}"; + if eval "${*}"; then + echo "[SUCC] ${n}/${RETRIES}"; + return 0; + fi; + sleep ${PAUSE}; + echo "[FAIL] ${n}/${RETRIES}"; + done; + return 1; + } + + # Output + echo "GIT_TYPE=${GIT_TYPE}" + echo "GIT_SLUG=${GIT_SLUG}" + echo "DOCKER_TAG=${DOCKER_TAG}" + + # Tag image + retry make tag TAG=${DOCKER_TAG} + docker images + + # Login and Push + retry make login USER=${{ secrets.DOCKERHUB_USERNAME }} PASS=${{ secrets.DOCKERHUB_PASSWORD }} + retry make push TAG=${DOCKER_TAG} + env: + RETRIES: 20 + PAUSE: 10 + # https://help.github.com/en/github/automating-your-workflow-with-github-actions/contexts-and-expression-syntax-for-github-actions#functions + if: github.event.pull_request.base.repo.id == github.event.pull_request.head.repo.id + && ( + (github.event_name == 'schedule' && (github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags/'))) + || + (github.event_name == 'push' && (github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags/'))) + || + (github.event_name == 'push' && startsWith(github.ref, 'refs/heads/release-')) + ) diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 8f72df2..0000000 --- a/.travis.yml +++ /dev/null @@ -1,72 +0,0 @@ ---- - -### -### Enable sudo (required for docker service) -### -sudo: required - - -### -### Language -### -language: minimal - - -### -### Add services -### -services: - - docker - - -### -### Build Matrix -### -env: - matrix: - - VERSION=latest - - -### -### Install requirements -### -install: - - retry() { - for ((n=0; n<10; n++)); do - echo "[${n}] ${*}"; - if eval "${*}"; then - return 0; - fi; - done; - return 1; - } - - -### -### Check generation changes, build and test -### -before_script: - - retry make lint - - retry make build TAG=${VERSION} - - retry make test TAG=${VERSION} - - -### -### Push to Dockerhub -### -script: - # Push to docker hub on success - - if [ "${TRAVIS_PULL_REQUEST}" == "false" ]; then - while ! make login USER="${DOCKER_USERNAME}" PASS="${DOCKER_PASSWORD}"; do sleep 1; done; - if [ -n "${TRAVIS_TAG}" ]; then - while ! make push TAG="${VERSION}-${TRAVIS_TAG}"; do sleep 1; done; - elif [ "${TRAVIS_BRANCH}" == "master" ]; then - while ! make push TAG=${VERSION}; do sleep 1; done; - elif [[ ${TRAVIS_BRANCH} =~ ^(release-[.0-9]+)$ ]]; then - while ! make push TAG="${VERSION}-${TRAVIS_BRANCH}"; do sleep 1; done; - else - echo "Skipping branch ${TRAVIS_BRANCH}"; - fi - else - echo "Skipping push on PR"; - fi diff --git a/Dockerfile b/Dockerfile index 2cfe949..80864a8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM alpine:3.11 as builder +FROM alpine:3.13 as builder RUN set -x \ && apk add --no-cache \ @@ -8,10 +8,11 @@ RUN set -x \ make \ musl-dev \ openssl-dev \ + py3-pip \ python3 \ python3-dev -ARG VERSION=latest +ARG VERSION RUN set -x \ && if [ "${VERSION}" = "latest" ]; then \ pip3 install --no-cache-dir --no-compile pylint; \ @@ -22,15 +23,29 @@ RUN set -x \ && find /usr/lib/ -name '*.pyc' -print0 | xargs -0 -n1 rm -rf -FROM alpine:3.11 as production -LABEL \ - maintainer="cytopia " \ - repo="https://github.com/cytopia/docker-pylint" +FROM alpine:3.13 as production +ARG VERSION +# https://github.com/opencontainers/image-spec/blob/master/annotations.md +#LABEL "org.opencontainers.image.created"="" +#LABEL "org.opencontainers.image.version"="" +#LABEL "org.opencontainers.image.revision"="" +LABEL "maintainer"="cytopia " +LABEL "org.opencontainers.image.authors"="cytopia " +LABEL "org.opencontainers.image.vendor"="cytopia" +LABEL "org.opencontainers.image.licenses"="MIT" +LABEL "org.opencontainers.image.url"="https://github.com/cytopia/docker-pylint" +LABEL "org.opencontainers.image.documentation"="https://github.com/cytopia/docker-pylint" +LABEL "org.opencontainers.image.source"="https://github.com/cytopia/docker-pylint" +LABEL "org.opencontainers.image.ref.name"="pylint ${VERSION}" +LABEL "org.opencontainers.image.title"="pylint ${VERSION}" +LABEL "org.opencontainers.image.description"="pylint ${VERSION}" + RUN set -x \ && apk add --no-cache python3 \ && ln -sf /usr/bin/python3 /usr/bin/python \ && find /usr/lib/ -name '__pycache__' -print0 | xargs -0 -n1 rm -rf \ && find /usr/lib/ -name '*.pyc' -print0 | xargs -0 -n1 rm -rf + COPY --from=builder /usr/lib/python3.8/site-packages/ /usr/lib/python3.8/site-packages/ COPY --from=builder /usr/bin/pylint /usr/bin/pylint WORKDIR /data diff --git a/Makefile b/Makefile index 953b26e..1ca35bf 100644 --- a/Makefile +++ b/Makefile @@ -2,21 +2,34 @@ ifneq (,) .error This Makefile requires GNU Make. endif -.PHONY: build rebuild lint test _test-version _test-run tag pull login push enter +.PHONY: lint build rebuild test tag login push pull-base-image enter CURRENT_DIR = $(dir $(abspath $(lastword $(MAKEFILE_LIST)))) DIR = . FILE = Dockerfile IMAGE = cytopia/pylint +VERSION = latest TAG = latest +NO_CACHE = -build: - docker build --build-arg VERSION=$(TAG) -t $(IMAGE) -f $(DIR)/$(FILE) $(DIR) -rebuild: pull - docker build --no-cache --build-arg VERSION=$(TAG) -t $(IMAGE) -f $(DIR)/$(FILE) $(DIR) +# -------------------------------------------------------------------------------------------------- +# Default Target +# -------------------------------------------------------------------------------------------------- +help: + @echo "lint Lint project files and repository" + @echo "build [VERSION=...] Build bandit docker image" + @echo "rebuild [VERSION=...] Build bandit docker image without cache" + @echo "test [VERSION=...] Test built bandit docker image" + @echo "tag TAG=... Retag Docker image" + @echo "login USER=... PASS=... Login to Docker hub" + @echo "push [TAG=...] Push Docker image to Docker hub" + +# -------------------------------------------------------------------------------------------------- +# Lint Targets +# -------------------------------------------------------------------------------------------------- lint: @docker run --rm -v $(CURRENT_DIR):/data cytopia/file-lint file-cr --text --ignore '.git/,.github/,tests/' --path . @docker run --rm -v $(CURRENT_DIR):/data cytopia/file-lint file-crlf --text --ignore '.git/,.github/,tests/' --path . @@ -25,6 +38,27 @@ lint: @docker run --rm -v $(CURRENT_DIR):/data cytopia/file-lint file-utf8 --text --ignore '.git/,.github/,tests/' --path . @docker run --rm -v $(CURRENT_DIR):/data cytopia/file-lint file-utf8-bom --text --ignore '.git/,.github/,tests/' --path . + +# -------------------------------------------------------------------------------------------------- +# Build Targets +# -------------------------------------------------------------------------------------------------- +build: + docker build $(NO_CACHE) \ + --build-arg VERSION=$(VERSION) \ + --label "org.opencontainers.image.created"="$$(date --rfc-3339=s)" \ + --label "org.opencontainers.image.revision"="$$(git rev-parse HEAD)" \ + --label "org.opencontainers.image.version"="${VERSION}" \ + -t $(IMAGE) \ + -f $(DIR)/$(FILE) $(DIR) + +rebuild: pull-base-image +rebuild: NO_CACHE=--no-cache +rebuild: build + + +# -------------------------------------------------------------------------------------------------- +# Test Targets +# -------------------------------------------------------------------------------------------------- test: @$(MAKE) --no-print-directory _test-version @$(MAKE) --no-print-directory _test-run @@ -33,7 +67,7 @@ _test-version: @echo "------------------------------------------------------------" @echo "- Testing correct version" @echo "------------------------------------------------------------" - @if [ "$(TAG)" = "latest" ]; then \ + @if [ "$(VERSION)" = "latest" ]; then \ echo "Fetching latest version from GitHub"; \ LATEST="$$( \ curl -L -sS https://github.com/PyCQA/pylint/releases/ \ @@ -50,8 +84,8 @@ _test-version: exit 1; \ fi; \ else \ - echo "Testing for tag: $(TAG)"; \ - if ! docker run --rm $(IMAGE) --version | grep -E "^$(TAG)"; then \ + echo "Testing for tag: $(VERSION)"; \ + if ! docker run --rm $(IMAGE) --version | grep -E "^$(VERSION)"; then \ echo "Failed"; \ exit 1; \ fi; \ @@ -68,20 +102,27 @@ _test-run: fi; \ echo "Success"; + +# ------------------------------------------------------------------------------------------------- +# Deploy Targets +# ------------------------------------------------------------------------------------------------- tag: docker tag $(IMAGE) $(IMAGE):$(TAG) -pull: - @grep -E '^\s*FROM' Dockerfile \ - | sed -e 's/^FROM//g' -e 's/[[:space:]]*as[[:space:]]*.*$$//g' \ - | xargs -n1 docker pull; - login: - yes | docker login --username $(USER) --password $(PASS) + @yes | docker login --username $(USER) --password $(PASS) push: - @$(MAKE) tag TAG=$(TAG) docker push $(IMAGE):$(TAG) + +# ------------------------------------------------------------------------------------------------- +# Helper Targets +# ------------------------------------------------------------------------------------------------- +pull-base-image: + @grep -E '^\s*FROM' Dockerfile \ + | sed -e 's/^FROM//g' -e 's/[[:space:]]*as[[:space:]]*.*$$//g' \ + | xargs -n1 docker pull; + enter: docker run --rm --name $(subst /,-,$(IMAGE)) -it --entrypoint=/bin/sh $(ARG) $(IMAGE):$(TAG) diff --git a/README.md b/README.md index 877c7b5..6a13132 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,5 @@ # Docker image for `pylint` -[![Build Status](https://travis-ci.com/cytopia/docker-pylint.svg?branch=master)](https://travis-ci.com/cytopia/docker-pylint) [![Tag](https://img.shields.io/github/tag/cytopia/docker-pylint.svg)](https://github.com/cytopia/docker-pylint/releases) [![](https://images.microbadger.com/badges/version/cytopia/pylint:latest.svg?kill_cache=1)](https://microbadger.com/images/cytopia/pylint:latest "pylint") [![](https://images.microbadger.com/badges/image/cytopia/pylint:latest.svg?kill_cache=1)](https://microbadger.com/images/cytopia/pylint:latest "pylint") @@ -8,11 +7,16 @@ [![](https://img.shields.io/badge/github-cytopia%2Fdocker--pylint-red.svg)](https://github.com/cytopia/docker-pylint "github.com/cytopia/docker-pylint") [![License](https://img.shields.io/badge/license-MIT-%233DA639.svg)](https://opensource.org/licenses/MIT) +[![lint](https://github.com/cytopia/docker-pylint/workflows/lint/badge.svg)](https://github.com/cytopia/docker-pylint/actions?query=workflow%3Alint) +[![build](https://github.com/cytopia/docker-pylint/workflows/build/badge.svg)](https://github.com/cytopia/docker-pylint/actions?query=workflow%3Abuild) +[![nightly](https://github.com/cytopia/docker-pylint/workflows/nightly/badge.svg)](https://github.com/cytopia/docker-pylint/actions?query=workflow%3Anightly) + > #### All [#awesome-ci](https://github.com/topics/awesome-ci) Docker images > -> [ansible][ansible-git-lnk] **•** > [ansible-lint][alint-git-lnk] **•** +> [ansible][ansible-git-lnk] **•** > [awesome-ci][aci-git-lnk] **•** +> [bandit][bandit-git-lnk] **•** > [black][black-git-lnk] **•** > [checkmake][cm-git-lnk] **•** > [eslint][elint-git-lnk] **•** @@ -21,15 +25,18 @@ > [goimports][gimp-git-lnk] **•** > [golint][glint-git-lnk] **•** > [jsonlint][jlint-git-lnk] **•** +> [linkcheck][linkcheck-git-lnk] **•** +> [mypy][mypy-git-lnk] **•** +> [php-cs-fixer][pcsf-git-lnk] **•** > [phpcbf][pcbf-git-lnk] **•** > [phpcs][pcs-git-lnk] **•** > [phplint][plint-git-lnk] **•** -> [php-cs-fixer][pcsf-git-lnk] **•** > [pycodestyle][pycs-git-lnk] **•** +> [pydocstyle][pyds-git-lnk] **•** > [pylint][pylint-git-lnk] **•** > [terraform-docs][tfdocs-git-lnk] **•** -> [terragrunt][tg-git-lnk] **•** > [terragrunt-fmt][tgfmt-git-lnk] **•** +> [terragrunt][tg-git-lnk] **•** > [yamlfmt][yfmt-git-lnk] **•** > [yamllint][ylint-git-lnk] @@ -77,6 +84,7 @@ linter below for reproducible local or remote CI tests: |--------|-----------|------|-------------| | [awesome-ci][aci-git-lnk] | [![aci-hub-img]][aci-hub-lnk] | Basic | Tools for git, file and static source code analysis | | [file-lint][flint-git-lnk] | [![flint-hub-img]][flint-hub-lnk] | Basic | Baisc source code analysis | +| [linkcheck][linkcheck-git-lnk] | [![linkcheck-hub-img]][flint-hub-lnk] | Basic | Search for URLs in files and validate their HTTP status code | | [ansible][ansible-git-lnk] | [![ansible-hub-img]][ansible-hub-lnk] | Ansible | Multiple versions and flavours of Ansible | | [ansible-lint][alint-git-lnk] | [![alint-hub-img]][alint-hub-lnk] | Ansible | Lint Ansible | | [gofmt][gfmt-git-lnk] | [![gfmt-hub-img]][gfmt-hub-lnk] | Go | Format Go source code **[1]** | @@ -89,8 +97,11 @@ linter below for reproducible local or remote CI tests: | [phpcs][pcs-git-lnk] | [![pcs-hub-img]][pcs-hub-lnk] | PHP | PHP Code Sniffer | | [phplint][plint-git-lnk] | [![plint-hub-img]][plint-hub-lnk] | PHP | PHP Code Linter **[1]** | | [php-cs-fixer][pcsf-git-lnk] | [![pcsf-hub-img]][pcsf-hub-lnk] | PHP | PHP Coding Standards Fixer | +| [bandit][bandit-git-lnk] | [![bandit-hub-img]][bandit-hub-lnk] | Python | A security linter from PyCQA | [black][black-git-lnk] | [![black-hub-img]][black-hub-lnk] | Python | The uncompromising Python code formatter | +| [mypy][mypy-git-lnk] | [![mypy-hub-img]][mypy-hub-lnk] | Python | Static source code analysis | | [pycodestyle][pycs-git-lnk] | [![pycs-hub-img]][pycs-hub-lnk] | Python | Python style guide checker | +| [pydocstyle][pyds-git-lnk] | [![pyds-hub-img]][pyds-hub-lnk] | Python | Python docstyle checker | | [pylint][pylint-git-lnk] | [![pylint-hub-img]][pylint-hub-lnk] | Python | Python source code, bug and quality checker | | [terraform-docs][tfdocs-git-lnk] | [![tfdocs-hub-img]][tfdocs-hub-lnk] | Terraform | Terraform doc generator (TF 0.12 ready) **[1]** | | [terragrunt][tg-git-lnk] | [![tg-hub-img]][tg-hub-lnk] | Terraform | Terragrunt and Terraform | @@ -108,6 +119,10 @@ linter below for reproducible local or remote CI tests: [flint-hub-img]: https://img.shields.io/docker/pulls/cytopia/file-lint.svg [flint-hub-lnk]: https://hub.docker.com/r/cytopia/file-lint +[linkcheck-git-lnk]: https://github.com/cytopia/docker-linkcheck +[linkcheck-hub-img]: https://img.shields.io/docker/pulls/cytopia/linkcheck.svg +[linkcheck-hub-lnk]: https://hub.docker.com/r/cytopia/linkcheck + [jlint-git-lnk]: https://github.com/cytopia/docker-jsonlint [jlint-hub-img]: https://img.shields.io/docker/pulls/cytopia/jsonlint.svg [jlint-hub-lnk]: https://hub.docker.com/r/cytopia/jsonlint @@ -156,14 +171,26 @@ linter below for reproducible local or remote CI tests: [pcsf-hub-img]: https://img.shields.io/docker/pulls/cytopia/php-cs-fixer.svg [pcsf-hub-lnk]: https://hub.docker.com/r/cytopia/php-cs-fixer +[bandit-git-lnk]: https://github.com/cytopia/docker-bandit +[bandit-hub-img]: https://img.shields.io/docker/pulls/cytopia/bandit.svg +[bandit-hub-lnk]: https://hub.docker.com/r/cytopia/bandit + [black-git-lnk]: https://github.com/cytopia/docker-black [black-hub-img]: https://img.shields.io/docker/pulls/cytopia/black.svg [black-hub-lnk]: https://hub.docker.com/r/cytopia/black +[mypy-git-lnk]: https://github.com/cytopia/docker-mypy +[mypy-hub-img]: https://img.shields.io/docker/pulls/cytopia/mypy.svg +[mypy-hub-lnk]: https://hub.docker.com/r/cytopia/mypy + [pycs-git-lnk]: https://github.com/cytopia/docker-pycodestyle [pycs-hub-img]: https://img.shields.io/docker/pulls/cytopia/pycodestyle.svg [pycs-hub-lnk]: https://hub.docker.com/r/cytopia/pycodestyle +[pyds-git-lnk]: https://github.com/cytopia/docker-pydocstyle +[pyds-hub-img]: https://img.shields.io/docker/pulls/cytopia/pydocstyle.svg +[pyds-hub-lnk]: https://hub.docker.com/r/cytopia/pydocstyle + [pylint-git-lnk]: https://github.com/cytopia/docker-pylint [pylint-hub-img]: https://img.shields.io/docker/pulls/cytopia/pylint.svg [pylint-hub-lnk]: https://hub.docker.com/r/cytopia/pylint