├── dind ├── requirements.txt ├── config.yml └── Dockerfile ├── .gitignore ├── cloudsploit ├── package.json ├── config.yml └── Dockerfile ├── base_config.yml ├── sonar ├── config.yml └── Dockerfile ├── claude ├── config.yml └── Dockerfile ├── upsun ├── config.yml └── Dockerfile ├── Pipfile ├── chrome ├── config.yml └── Dockerfile ├── scaleway ├── config.yml └── Dockerfile ├── golang ├── config.yml ├── 1.24 │ └── Dockerfile └── 1.25 │ └── Dockerfile ├── java ├── 17 │ └── Dockerfile ├── 21 │ └── Dockerfile ├── 25 │ └── Dockerfile └── config.yml ├── aws ├── config.yml └── Dockerfile ├── azure ├── config.yml └── Dockerfile ├── node ├── config.yml └── Dockerfile ├── .github ├── workflows │ ├── auto-merge.yml │ ├── build-checker.yml │ ├── claude-app.yml │ └── build.yml ├── copilot-instructions.md └── dependabot.yml ├── php ├── config.yml ├── 8.4 │ └── Dockerfile ├── 8.3 │ └── Dockerfile ├── 8.1 │ └── Dockerfile ├── 8.2 │ └── Dockerfile └── test.php ├── python ├── 3.10 │ └── Dockerfile ├── 3.11 │ └── Dockerfile ├── 3.12 │ └── Dockerfile ├── 3.13 │ └── Dockerfile ├── 3.14 │ └── Dockerfile └── config.yml ├── matrix_generator.py ├── image_builder.py ├── src ├── config.py └── docker_tools.py ├── CLAUDE.md ├── README.md ├── Pipfile.lock └── CHANGELOG.md /dind/requirements.txt: -------------------------------------------------------------------------------- 1 | pipenv==2026.0.2 2 | azure-cli==2.81.0 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | */build.log 2 | .idea 3 | *.iml 4 | .vscode 5 | src/__pycache__/* 6 | .claude/settings.local.json 7 | -------------------------------------------------------------------------------- /cloudsploit/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "cloudsploit": "git+https://git@github.com/aquasecurity/cloudsploit.git#v3.10.0" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /base_config.yml: -------------------------------------------------------------------------------- 1 | --- 2 | namespace: ekino 3 | DOCKER_SOCK_PATH: unix://var/run/docker.sock 4 | DOCKER_TIMEOUT: 600 5 | 6 | base_platforms: &base_platforms 7 | - linux/amd64 8 | -------------------------------------------------------------------------------- /cloudsploit/config.yml: -------------------------------------------------------------------------------- 1 | versions: 2 | "3": 3 | platforms: 4 | - linux/amd64 5 | - linux/arm64 6 | test_config: 7 | cmd: 8 | - aws --version 9 | - cloudsploit -h 10 | -------------------------------------------------------------------------------- /sonar/config.yml: -------------------------------------------------------------------------------- 1 | versions: 2 | "7.2": 3 | platforms: 4 | - linux/amd64 5 | - linux/arm64 6 | test_config: 7 | cmd: 8 | - java -version 9 | - sonar-scanner -v 10 | -------------------------------------------------------------------------------- /claude/config.yml: -------------------------------------------------------------------------------- 1 | test_config: &test_config 2 | cmd: 3 | - node --version 4 | - npm --version 5 | - claude --version 6 | - glab --version 7 | 8 | versions: 9 | '1': 10 | platforms: 11 | - linux/amd64 12 | - linux/arm64 13 | test_config: *test_config 14 | -------------------------------------------------------------------------------- /upsun/config.yml: -------------------------------------------------------------------------------- 1 | versions: 2 | "1": 3 | platforms: 4 | - linux/amd64 5 | - linux/arm64 6 | test_config: 7 | cmd: 8 | - git --version 9 | - upsun --version 10 | - platform --version 11 | - python --version 12 | - pip --version 13 | - pipenv --version -------------------------------------------------------------------------------- /Pipfile: -------------------------------------------------------------------------------- 1 | [[source]] 2 | url = "https://pypi.org/simple" 3 | verify_ssl = true 4 | name = "pypi" 5 | 6 | [packages] 7 | pyyaml = "==6.0.3" 8 | click = "==8.3.1" 9 | python-on-whales = "==0.79.0" 10 | gitpython = "==3.1.45" 11 | pydantic = "2.12.5" 12 | 13 | [dev-packages] 14 | 15 | [requires] 16 | python_version = "3.11" 17 | -------------------------------------------------------------------------------- /dind/config.yml: -------------------------------------------------------------------------------- 1 | versions: 2 | "1": 3 | platforms: 4 | - linux/amd64 5 | - linux/arm64 6 | test_config: 7 | cmd: 8 | - aws --version 9 | - az version 10 | - docker --version 11 | - docker-compose --version 12 | - task --version 13 | - trivy --version 14 | -------------------------------------------------------------------------------- /chrome/config.yml: -------------------------------------------------------------------------------- 1 | versions: 2 | "1": 3 | platforms: 4 | - linux/amd64 5 | - linux/arm64 6 | test_config: 7 | cmd: 8 | - google-chrome --no-sandbox --version 9 | - google-chrome-unstable --no-sandbox --version 10 | - node --version 11 | - npm --version 12 | - yarn --version 13 | - task --version 14 | -------------------------------------------------------------------------------- /scaleway/config.yml: -------------------------------------------------------------------------------- 1 | versions: 2 | '1': 3 | platforms: 4 | - linux/amd64 5 | - linux/arm64 6 | test_config: 7 | cmd: 8 | - scw version 9 | - git --version 10 | - helm diff version 11 | - helm version 12 | - kustomize version 13 | - pip --version 14 | - pipenv --version 15 | - trivy --version 16 | - zip --version 17 | - terragrunt --version 18 | - tfenv init 19 | - kubectl version --client 20 | -------------------------------------------------------------------------------- /golang/config.yml: -------------------------------------------------------------------------------- 1 | test_config: &test_config 2 | cmd: 3 | - aws --version 4 | - gitleaks version 5 | - go version 6 | - golangci-lint --version 7 | - migrate -version 8 | - mockgen -version 9 | - rsync --version 10 | - swagger version 11 | 12 | versions: 13 | "1.24": 14 | platforms: 15 | - linux/amd64 16 | - linux/arm64 17 | test_config: *test_config 18 | "1.25": 19 | platforms: 20 | - linux/amd64 21 | - linux/arm64 22 | test_config: *test_config 23 | -------------------------------------------------------------------------------- /java/config.yml: -------------------------------------------------------------------------------- 1 | test_config: &test_config 2 | cmd: 3 | - java -version 4 | - aws --version 5 | - dot -V 6 | - jq --version 7 | - psql --version 8 | 9 | versions: 10 | "17": 11 | platforms: 12 | - linux/amd64 13 | - linux/arm64 14 | test_config: *test_config 15 | "21": 16 | platforms: 17 | - linux/amd64 18 | - linux/arm64 19 | test_config: *test_config 20 | "25": 21 | platforms: 22 | - linux/amd64 23 | - linux/arm64 24 | test_config: *test_config 25 | -------------------------------------------------------------------------------- /aws/config.yml: -------------------------------------------------------------------------------- 1 | versions: 2 | "1": 3 | platforms: 4 | - linux/amd64 5 | - linux/arm64 6 | test_config: 7 | cmd: 8 | - aws --version 9 | - git --version 10 | - helm diff version 11 | - helm version 12 | - kustomize version 13 | - pip --version 14 | - pipenv --version 15 | - trivy --version 16 | - zip --version 17 | - terragrunt --version 18 | - infracost --version 19 | - tfenv init 20 | - kubectl version --client 21 | -------------------------------------------------------------------------------- /azure/config.yml: -------------------------------------------------------------------------------- 1 | versions: 2 | "2": 3 | platforms: 4 | - linux/amd64 5 | - linux/arm64 6 | test_config: 7 | cmd: 8 | - az --version 9 | - git --version 10 | - helm diff version 11 | - helm version 12 | - kustomize version 13 | - pip --version 14 | - pipenv --version 15 | - trivy --version 16 | - terragrunt --version 17 | - infracost --version 18 | - tfenv init 19 | - unzip -v 20 | - zip --version 21 | - kubectl version --client 22 | -------------------------------------------------------------------------------- /node/config.yml: -------------------------------------------------------------------------------- 1 | test_config: &test_config 2 | cmd: 3 | - node --version 4 | - npm --version 5 | - aws --version 6 | - yarn --version 7 | - sass --version 8 | - task --version 9 | 10 | versions: 11 | "20": 12 | platforms: 13 | - linux/amd64 14 | - linux/arm64 15 | test_config: *test_config 16 | "22": 17 | platforms: 18 | - linux/amd64 19 | - linux/arm64 20 | test_config: *test_config 21 | "24": 22 | platforms: 23 | - linux/amd64 24 | - linux/arm64 25 | test_config: *test_config 26 | -------------------------------------------------------------------------------- /.github/workflows/auto-merge.yml: -------------------------------------------------------------------------------- 1 | name: Dependabot auto-merge 2 | on: pull_request 3 | 4 | permissions: 5 | contents: write 6 | pull-requests: write 7 | 8 | jobs: 9 | dependabot: 10 | runs-on: ubuntu-24.04 11 | if: github.actor == 'dependabot[bot]' 12 | steps: 13 | - name: Dependabot metadata 14 | id: metadata 15 | uses: dependabot/fetch-metadata@v2 16 | with: 17 | github-token: "${{ secrets.GITHUB_TOKEN }}" 18 | - name: Enable auto-merge for Dependabot PRs 19 | if: steps.metadata.outputs.update-type == 'version-update:semver-patch' 20 | run: gh pr merge --auto --merge "$PR_URL" 21 | env: 22 | PR_URL: ${{github.event.pull_request.html_url}} 23 | GH_TOKEN: ${{secrets.GITHUB_TOKEN}} 24 | -------------------------------------------------------------------------------- /.github/workflows/build-checker.yml: -------------------------------------------------------------------------------- 1 | name: Build Checker 2 | 3 | on: 4 | pull_request: 5 | branches: 6 | - master 7 | 8 | concurrency: 9 | group: ${{ github.workflow }}-${{ github.ref }} 10 | cancel-in-progress: true 11 | 12 | jobs: 13 | check: 14 | runs-on: ubuntu-24.04 15 | steps: 16 | - name: Wait for commit statuses 17 | id: status 18 | uses: WyriHaximus/github-action-wait-for-status@v1.8.0 19 | with: 20 | ignoreActions: check 21 | checkInterval: 60 22 | env: 23 | GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" 24 | - name: Succeed 25 | if: steps.status.outputs.status == 'success' 26 | run: exit 0 27 | - name: Fail 28 | if: steps.status.outputs.status == 'failure' 29 | run: exit 1 30 | -------------------------------------------------------------------------------- /php/config.yml: -------------------------------------------------------------------------------- 1 | platforms: &platforms 2 | - linux/amd64 3 | - linux/arm64 4 | 5 | test_config: &test_config 6 | volume: php:/tmp 7 | cmd: 8 | - php --version 9 | - composer --version 10 | - php-cs-fixer --version 11 | - php /tmp/test.php 12 | - aws --version 13 | build_args: &build_args 14 | APCU_VERSION: 5.1.26 15 | COMPOSER_VERSION: 2.8.10 16 | MEMCACHED_VERSION: 3.3.0 17 | PHP_CS_FIXER_VERSION: 3.86.0 18 | REDIS_VERSION: 6.2.0 19 | XDEBUG_VERSION: 3.4.5 20 | versions: 21 | "8.1": 22 | platforms: *platforms 23 | build_args: 24 | <<: *build_args 25 | test_config: *test_config 26 | "8.2": 27 | platforms: *platforms 28 | build_args: 29 | <<: *build_args 30 | test_config: *test_config 31 | "8.3": 32 | platforms: *platforms 33 | build_args: 34 | <<: *build_args 35 | test_config: *test_config 36 | "8.4": 37 | platforms: *platforms 38 | build_args: 39 | <<: *build_args 40 | test_config: *test_config 41 | -------------------------------------------------------------------------------- /python/3.10/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:3.10.19-slim-trixie AS base 2 | LABEL org.opencontainers.image.source="https://github.com/ekino/docker-buildbox/" 3 | 4 | ARG TARGETARCH 5 | ARG POETRY_HOME 6 | 7 | FROM base AS base-amd64 8 | ARG ARCH="x86_64" 9 | 10 | FROM base AS base-arm64 11 | ARG ARCH="aarch64" 12 | 13 | FROM base-$TARGETARCH 14 | 15 | # Install system dependencies for python and pip 16 | RUN apt-get update -y && \ 17 | apt-get install curl unzip groff less -y && \ 18 | pip install -U pip && \ 19 | # Installing AWS CLIv2 20 | curl "https://awscli.amazonaws.com/awscli-exe-linux-{$ARCH}.zip" -o "awscliv2.zip" && \ 21 | unzip -q awscliv2.zip && \ 22 | ./aws/install && \ 23 | rm -rf aws && \ 24 | rm -f awscliv2.zip && \ 25 | # Install basics Python tools 26 | pip install pipenv boto3 && \ 27 | apt-get -qq -y autoremove && \ 28 | apt-get -qq clean && apt-get -qq purge && \ 29 | rm -rf /var/lib/apt/lists/* /var/lib/dpkg/*-old && \ 30 | # Install Poetry 31 | curl -sSL https://install.python-poetry.org | python3 - 32 | -------------------------------------------------------------------------------- /python/3.11/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:3.11.14-slim-trixie AS base 2 | LABEL org.opencontainers.image.source="https://github.com/ekino/docker-buildbox/" 3 | 4 | ARG TARGETARCH 5 | ARG POETRY_HOME 6 | 7 | FROM base AS base-amd64 8 | ARG ARCH="x86_64" 9 | 10 | FROM base AS base-arm64 11 | ARG ARCH="aarch64" 12 | 13 | FROM base-$TARGETARCH 14 | 15 | # Install system dependencies for python and pip 16 | RUN apt-get update -y && \ 17 | apt-get install curl unzip groff less -y && \ 18 | pip install -U pip && \ 19 | # Installing AWS CLIv2 20 | curl "https://awscli.amazonaws.com/awscli-exe-linux-{$ARCH}.zip" -o "awscliv2.zip" && \ 21 | unzip -q awscliv2.zip && \ 22 | ./aws/install && \ 23 | rm -rf aws && \ 24 | rm -f awscliv2.zip && \ 25 | # Install basics Python tools 26 | pip install pipenv boto3 && \ 27 | apt-get -qq -y autoremove && \ 28 | apt-get -qq clean && apt-get -qq purge && \ 29 | rm -rf /var/lib/apt/lists/* /var/lib/dpkg/*-old && \ 30 | # Install Poetry 31 | curl -sSL https://install.python-poetry.org | python3 - 32 | -------------------------------------------------------------------------------- /python/3.12/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:3.12.12-slim-trixie AS base 2 | LABEL org.opencontainers.image.source="https://github.com/ekino/docker-buildbox/" 3 | 4 | ARG TARGETARCH 5 | ARG POETRY_HOME 6 | 7 | FROM base AS base-amd64 8 | ARG ARCH="x86_64" 9 | 10 | FROM base AS base-arm64 11 | ARG ARCH="aarch64" 12 | 13 | FROM base-$TARGETARCH 14 | 15 | # Install system dependencies for python and pip 16 | RUN apt-get update -y && \ 17 | apt-get install curl unzip groff less -y && \ 18 | pip install -U pip && \ 19 | # Installing AWS CLIv2 20 | curl "https://awscli.amazonaws.com/awscli-exe-linux-{$ARCH}.zip" -o "awscliv2.zip" && \ 21 | unzip -q awscliv2.zip && \ 22 | ./aws/install && \ 23 | rm -rf aws && \ 24 | rm -f awscliv2.zip && \ 25 | # Install basics Python tools 26 | pip install pipenv boto3 && \ 27 | apt-get -qq -y autoremove && \ 28 | apt-get -qq clean && apt-get -qq purge && \ 29 | rm -rf /var/lib/apt/lists/* /var/lib/dpkg/*-old && \ 30 | # Install Poetry 31 | curl -sSL https://install.python-poetry.org | python3 - 32 | -------------------------------------------------------------------------------- /python/3.13/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:3.13.11-slim-trixie AS base 2 | LABEL org.opencontainers.image.source="https://github.com/ekino/docker-buildbox/" 3 | 4 | ARG TARGETARCH 5 | ARG POETRY_HOME 6 | 7 | FROM base AS base-amd64 8 | ARG ARCH="x86_64" 9 | 10 | FROM base AS base-arm64 11 | ARG ARCH="aarch64" 12 | 13 | FROM base-$TARGETARCH 14 | 15 | # Install system dependencies for python and pip 16 | RUN apt-get update -y && \ 17 | apt-get install curl postgresql-client unzip groff less -y && \ 18 | pip install -U pip && \ 19 | # Installing AWS CLIv2 20 | curl "https://awscli.amazonaws.com/awscli-exe-linux-{$ARCH}.zip" -o "awscliv2.zip" && \ 21 | unzip -q awscliv2.zip && \ 22 | ./aws/install && \ 23 | rm -rf aws && \ 24 | rm -f awscliv2.zip && \ 25 | # Install basics Python tools 26 | pip install pipenv boto3 && \ 27 | apt-get -qq -y autoremove && \ 28 | apt-get -qq clean && apt-get -qq purge && \ 29 | rm -rf /var/lib/apt/lists/* /var/lib/dpkg/*-old && \ 30 | # Install Poetry 31 | curl -sSL https://install.python-poetry.org | python3 - 32 | -------------------------------------------------------------------------------- /python/3.14/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:3.14.2-slim-trixie AS base 2 | LABEL org.opencontainers.image.source="https://github.com/ekino/docker-buildbox/" 3 | 4 | ARG TARGETARCH 5 | ARG POETRY_HOME 6 | 7 | FROM base AS base-amd64 8 | ARG ARCH="x86_64" 9 | 10 | FROM base AS base-arm64 11 | ARG ARCH="aarch64" 12 | 13 | FROM base-$TARGETARCH 14 | 15 | # Install system dependencies for python and pip 16 | RUN apt-get update -y && \ 17 | apt-get install curl postgresql-client unzip groff less -y && \ 18 | pip install -U pip && \ 19 | # Installing AWS CLIv2 20 | curl "https://awscli.amazonaws.com/awscli-exe-linux-{$ARCH}.zip" -o "awscliv2.zip" && \ 21 | unzip -q awscliv2.zip && \ 22 | ./aws/install && \ 23 | rm -rf aws && \ 24 | rm -f awscliv2.zip && \ 25 | # Install basics Python tools 26 | pip install pipenv boto3 && \ 27 | apt-get -qq -y autoremove && \ 28 | apt-get -qq clean && apt-get -qq purge && \ 29 | rm -rf /var/lib/apt/lists/* /var/lib/dpkg/*-old && \ 30 | # Install Poetry 31 | curl -sSL https://install.python-poetry.org | python3 - 32 | -------------------------------------------------------------------------------- /python/config.yml: -------------------------------------------------------------------------------- 1 | platforms: &platforms 2 | - linux/amd64 3 | - linux/arm64 4 | 5 | test_config: &test_config 6 | cmd: 7 | - pip --version 8 | - python --version 9 | - aws --version 10 | - poetry --version 11 | 12 | build_args: &build_args 13 | POETRY_HOME: "/usr/local" 14 | 15 | versions: 16 | "3.10": 17 | build_args: *build_args 18 | platforms: *platforms 19 | test_config: *test_config 20 | "3.11": 21 | build_args: *build_args 22 | platforms: *platforms 23 | test_config: *test_config 24 | "3.12": 25 | build_args: *build_args 26 | platforms: *platforms 27 | test_config: *test_config 28 | "3.13": 29 | build_args: *build_args 30 | platforms: *platforms 31 | test_config: 32 | cmd: 33 | - pip --version 34 | - python --version 35 | - aws --version 36 | - poetry --version 37 | - psql --version 38 | "3.14": 39 | build_args: *build_args 40 | platforms: *platforms 41 | test_config: 42 | cmd: 43 | - pip --version 44 | - python --version 45 | - aws --version 46 | - poetry --version 47 | - psql --version 48 | -------------------------------------------------------------------------------- /upsun/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:3.14.1-slim-trixie AS base 2 | LABEL maintainer="opensource@ekino.com" 3 | LABEL org.opencontainers.image.source="https://github.com/ekino/docker-buildbox/" 4 | 5 | ARG VERSION 6 | 7 | FROM base AS base-amd64 8 | ARG CLI_ARCH="amd64" 9 | 10 | FROM base AS base-arm64 11 | ARG CLI_ARCH="arm64" 12 | 13 | FROM base-$TARGETARCH 14 | RUN apt-get update -qq && apt-get install -y curl git jq \ 15 | && pip install pipenv \ 16 | && echo "Fetching latest version of Platform.sh and Upsun CLIs..." \ 17 | && CLI_VERSION=$(curl -s https://api.github.com/repos/platformsh/cli/releases/latest | jq -r '.tag_name') \ 18 | && echo "Using CLI version: ${CLI_VERSION}" \ 19 | && curl -sSL "https://github.com/platformsh/cli/releases/download/${CLI_VERSION}/upsun-cli_${CLI_VERSION}_linux_${CLI_ARCH}.deb" -o /tmp/upsun.deb \ 20 | && curl -sSL "https://github.com/platformsh/cli/releases/download/${CLI_VERSION}/platformsh-cli_${CLI_VERSION}_linux_${CLI_ARCH}.deb" -o /tmp/platform.deb \ 21 | && apt install -y /tmp/upsun.deb /tmp/platform.deb \ 22 | && rm -f /tmp/upsun.deb /tmp/platform.deb \ 23 | && apt-get clean \ 24 | && rm -rf /var/lib/apt/lists/* 25 | -------------------------------------------------------------------------------- /claude/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:24-alpine3.22 2 | LABEL maintainer="opensource@ekino.com" 3 | LABEL org.opencontainers.image.source="https://github.com/ekino/docker-buildbox/" 4 | 5 | RUN apk update && apk add --no-cache git curl bash jq 6 | 7 | # Install GitLab CLI (glab) 8 | ARG TARGETARCH 9 | RUN case "$TARGETARCH" in \ 10 | amd64) ARCH="linux_amd64" ;; \ 11 | arm64) ARCH="linux_arm64" ;; \ 12 | *) echo "Unsupported architecture: $TARGETARCH" && exit 1 ;; \ 13 | esac && \ 14 | GLAB_VERSION=$(curl -s "https://gitlab.com/api/v4/projects/34675721/releases" | jq -r '.[0].tag_name' | sed 's/^v//') && \ 15 | curl -L "https://gitlab.com/gitlab-org/cli/-/releases/v${GLAB_VERSION}/downloads/glab_${GLAB_VERSION}_${ARCH}.tar.gz" | tar -xz -C /tmp && \ 16 | mv /tmp/bin/glab /usr/local/bin/glab && \ 17 | chmod +x /usr/local/bin/glab && \ 18 | rm -rf /tmp/bin 19 | 20 | # Create claude user and group 21 | RUN addgroup claude && \ 22 | adduser -G claude -s /bin/sh -D claude 23 | 24 | # Install claude-code globally 25 | RUN npm install -g @anthropic-ai/claude-code 26 | 27 | # Switch to claude user 28 | USER claude:claude 29 | 30 | # Set working directory to claude's home 31 | WORKDIR /home/claude 32 | -------------------------------------------------------------------------------- /java/25/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM eclipse-temurin:25_36-jdk-noble AS base 2 | 3 | LABEL maintainer="opensource@ekino.com" 4 | LABEL org.opencontainers.image.source="https://github.com/ekino/docker-buildbox/" 5 | 6 | ENV DEBIAN_FRONTEND=noninteractive \ 7 | LANG=C.UTF-8 8 | 9 | FROM base AS base-amd64 10 | ARG AWSCLI_ARCH="linux-x86_64" 11 | 12 | FROM base AS base-arm64 13 | ARG AWSCLI_ARCH="linux-aarch64" 14 | 15 | FROM base-${TARGETARCH} 16 | 17 | # Updating packages using sources 18 | RUN cat /etc/apt/sources.list && \ 19 | apt-get -qq clean -qq && apt-get -qq update && \ 20 | # Install base 21 | apt-get -qq -y install curl git openssh-client jq unzip graphviz postgresql-client && \ 22 | # Installing AWS CLIv2 23 | curl https://awscli.amazonaws.com/awscli-exe-${AWSCLI_ARCH}.zip -o awscliv2.zip && \ 24 | unzip -q awscliv2.zip && \ 25 | ./aws/install && \ 26 | rm -f awscliv2.zip && \ 27 | rm -rf aws && \ 28 | # Cleaning files! 29 | rm -rf /tmp/* && \ 30 | apt-get -y remove --purge patch xauth && \ 31 | apt-get -qq -y autoremove && \ 32 | apt-get -qq clean && apt-get -qq purge && \ 33 | rm -rf /var/lib/apt/lists/* /var/lib/dpkg/*-old && \ 34 | rm -rf /usr/share/doc /usr/share/locale/[a-df-z]* /usr/share/locale/e[a-lo-z]* /usr/share/locale/en@* /usr/share/locale/en_GB 35 | -------------------------------------------------------------------------------- /sonar/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM alpine:3.23.0 AS base 2 | LABEL maintainer="opensource@ekino.com" 3 | LABEL org.opencontainers.image.source="https://github.com/ekino/docker-buildbox/" 4 | 5 | ARG SONARSCANNER_HOME=/sonar-scanner 6 | ARG VERSION 7 | 8 | ENV PATH=${SONARSCANNER_HOME}/bin:${PATH} 9 | 10 | RUN echo "Starting ..." && \ 11 | apk --update upgrade && apk add curl gcompat make tzdata unzip openjdk21-jre jq && \ 12 | echo "Done base install!" && \ 13 | echo "Starting Sonar Scanner" && \ 14 | echo "Fetching latest version for major version ${VERSION}..." && \ 15 | SONARSCANNER_VERSION=$(curl -s https://api.github.com/repos/SonarSource/sonar-scanner-cli/releases | \ 16 | jq -r --arg major "${VERSION}" \ 17 | '[.[] | select(.tag_name | startswith($major)) | .tag_name] | sort_by(. | split(".") | map(tonumber)) | last') && \ 18 | echo "Using SonarScanner version: ${SONARSCANNER_VERSION}" && \ 19 | curl -o ./sonarscanner.zip -L https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-${SONARSCANNER_VERSION}.zip && \ 20 | unzip sonarscanner.zip && \ 21 | rm sonarscanner.zip && \ 22 | mv sonar-scanner-${SONARSCANNER_VERSION} ${SONARSCANNER_HOME} && \ 23 | echo "Done Sonar Scanner!" && \ 24 | echo "Cleaning files!" && \ 25 | rm -rf /tmp/* /var/cache/apk/* && \ 26 | echo "Done!" 27 | -------------------------------------------------------------------------------- /cloudsploit/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:3.14.1-slim-trixie AS base 2 | LABEL maintainer="Axel Pavageau " 3 | LABEL org.opencontainers.image.source="https://github.com/ekino/docker-buildbox/" 4 | 5 | FROM base AS base-amd64 6 | ARG AWSCLI_URL="https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" 7 | 8 | FROM base AS base-arm64 9 | ARG AWSCLI_URL="https://awscli.amazonaws.com/awscli-exe-linux-aarch64.zip" 10 | 11 | FROM base-$TARGETARCH 12 | WORKDIR /tmp 13 | 14 | ADD package.json . 15 | RUN apt-get update -qq && apt-get install -y wget zip curl ca-certificates gnupg \ 16 | && mkdir -p /etc/apt/keyrings \ 17 | && curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg \ 18 | && export NODE_MAJOR=20 \ 19 | && echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list \ 20 | && apt-get update \ 21 | && pip install -U pip \ 22 | && pip install pipenv boto3 \ 23 | && apt install -y nodejs git \ 24 | && curl ${AWSCLI_URL} -o "awscliv2.zip" \ 25 | && unzip -q awscliv2.zip\ 26 | && ./aws/install \ 27 | && rm -f awscliv2.zip && rm -rf aws 28 | RUN npm install \ 29 | && ln -s /tmp/node_modules/cloudsploit/index.js /usr/local/bin/cloudsploit 30 | -------------------------------------------------------------------------------- /chrome/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:10-alpine 2 | LABEL maintainer="opensource@ekino.com" 3 | LABEL org.opencontainers.image.source="https://github.com/ekino/docker-buildbox/" 4 | 5 | # Tell Puppeteer to skip installing Chrome. We'll be using the installed package. 6 | ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true 7 | 8 | # Based on: https://github.com/GoogleChrome/puppeteer/blob/master/docs/troubleshooting.md#running-on-alpine 9 | 10 | # Installs Chromium 72 package. 11 | RUN apk update && apk upgrade && \ 12 | apk add --no-cache \ 13 | chromium \ 14 | harfbuzz \ 15 | freetype \ 16 | ttf-freefont \ 17 | nss && \ 18 | # Puppeteer v1.11.0 works with Chromium 72. 19 | yarn add puppeteer@1.13.0 && \ 20 | apk add --update curl git grep make ncurses tzdata && \ 21 | echo "Install Taskfile" && \ 22 | sh -c "$(curl --location https://taskfile.dev/install.sh)" -- -d && \ 23 | echo "Done Install Taskfile" && \ 24 | echo "Adding an up to date mime-types definition file" && \ 25 | curl -sSL https://salsa.debian.org/debian/mime-support/raw/master/mime.types -o /etc/mime.types && \ 26 | echo "Linking the Chrome executable with all the known/used names" && \ 27 | ln -s /usr/bin/chromium-browser /usr/bin/google-chrome && \ 28 | ln -s /usr/bin/chromium-browser /usr/bin/google-chrome-unstable && \ 29 | rm -rf /tmp/* /var/cache/apk/* 30 | -------------------------------------------------------------------------------- /java/17/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM eclipse-temurin:17.0.17_10-jdk-noble AS base 2 | LABEL maintainer="opensource@ekino.com" 3 | LABEL org.opencontainers.image.source="https://github.com/ekino/docker-buildbox/" 4 | 5 | ENV DEBIAN_FRONTEND=noninteractive \ 6 | LANG=C.UTF-8 7 | 8 | FROM base AS base-amd64 9 | ARG AWSCLI_ARCH="linux-x86_64" 10 | 11 | FROM base AS base-arm64 12 | ARG AWSCLI_ARCH="linux-aarch64" 13 | 14 | FROM base-${TARGETARCH} 15 | 16 | # Updating packages using sources 17 | RUN cat /etc/apt/sources.list && \ 18 | apt-get -qq clean -qq && apt-get -qq update && \ 19 | # Install base 20 | apt-get -qq -y install build-essential curl git make openssh-client jq unzip groff less && \ 21 | # Installing AWS CLIv2 22 | curl https://awscli.amazonaws.com/awscli-exe-${AWSCLI_ARCH}.zip -o awscliv2.zip && \ 23 | unzip -q awscliv2.zip && \ 24 | ./aws/install && \ 25 | rm -f awscliv2.zip && \ 26 | rm -rf aws && \ 27 | # Install graphviz 28 | apt-get -qq -y install graphviz && \ 29 | # Install postgresql-client 30 | apt-get -qq -y install postgresql-client && \ 31 | # Cleaning files! 32 | rm -rf /tmp/* && \ 33 | apt-get -y remove --purge dpkg-dev fakeroot file manpages manpages-dev patch xauth xz-utils && \ 34 | apt-get -qq -y autoremove && \ 35 | apt-get -qq clean && apt-get -qq purge && \ 36 | rm -rf /var/lib/apt/lists/* /var/lib/dpkg/*-old && \ 37 | rm -rf /usr/share/doc /usr/share/locale/[a-df-z]* /usr/share/locale/e[a-lo-z]* /usr/share/locale/en@* /usr/share/locale/en_GB 38 | -------------------------------------------------------------------------------- /java/21/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM eclipse-temurin:21.0.9_10-jdk-noble AS base 2 | 3 | LABEL maintainer="opensource@ekino.com" 4 | LABEL org.opencontainers.image.source="https://github.com/ekino/docker-buildbox/" 5 | 6 | ENV DEBIAN_FRONTEND=noninteractive \ 7 | LANG=C.UTF-8 8 | 9 | FROM base AS base-amd64 10 | ARG AWSCLI_ARCH="linux-x86_64" 11 | 12 | FROM base AS base-arm64 13 | ARG AWSCLI_ARCH="linux-aarch64" 14 | 15 | FROM base-${TARGETARCH} 16 | 17 | # Updating packages using sources 18 | RUN cat /etc/apt/sources.list && \ 19 | apt-get -qq clean -qq && apt-get -qq update && \ 20 | # Install base 21 | apt-get -qq -y install build-essential curl git make openssh-client jq unzip groff less && \ 22 | # Installing AWS CLIv2 23 | curl https://awscli.amazonaws.com/awscli-exe-${AWSCLI_ARCH}.zip -o awscliv2.zip && \ 24 | unzip -q awscliv2.zip && \ 25 | ./aws/install && \ 26 | rm -f awscliv2.zip && \ 27 | rm -rf aws && \ 28 | # Install graphviz 29 | apt-get -qq -y install graphviz && \ 30 | # Install postgresql-client 31 | apt-get -qq -y install postgresql-client && \ 32 | # Cleaning files! 33 | rm -rf /tmp/* && \ 34 | apt-get -y remove --purge dpkg-dev fakeroot file manpages manpages-dev patch xauth xz-utils && \ 35 | apt-get -qq -y autoremove && \ 36 | apt-get -qq clean && apt-get -qq purge && \ 37 | rm -rf /var/lib/apt/lists/* /var/lib/dpkg/*-old && \ 38 | rm -rf /usr/share/doc /usr/share/locale/[a-df-z]* /usr/share/locale/e[a-lo-z]* /usr/share/locale/en@* /usr/share/locale/en_GB 39 | -------------------------------------------------------------------------------- /.github/workflows/claude-app.yml: -------------------------------------------------------------------------------- 1 | name: Claude PR Action 2 | 3 | permissions: 4 | contents: write 5 | pull-requests: write 6 | issues: write 7 | id-token: write 8 | 9 | on: 10 | issue_comment: 11 | types: [created] 12 | pull_request_review_comment: 13 | types: [created] 14 | issues: 15 | types: [opened, assigned] 16 | 17 | jobs: 18 | claude-pr: 19 | if: | 20 | (github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) || 21 | (github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude')) || 22 | (github.event_name == 'issues' && contains(github.event.issue.body, '@claude')) 23 | runs-on: ubuntu-latest 24 | env: 25 | AWS_REGION: eu-west-3 26 | steps: 27 | - name: Checkout repository 28 | uses: actions/checkout@v6 29 | 30 | - name: Generate GitHub App token 31 | id: app-token 32 | uses: actions/create-github-app-token@v2 33 | with: 34 | app-id: ${{ secrets.APP_ID }} 35 | private-key: ${{ secrets.APP_PRIVATE_KEY }} 36 | 37 | - name: Configure AWS Credentials (OIDC) 38 | uses: aws-actions/configure-aws-credentials@v5 39 | with: 40 | role-to-assume: ${{ secrets.AWS_ROLE_TO_ASSUME }} 41 | aws-region: us-west-2 42 | 43 | - uses: anthropics/claude-code-action@v1 44 | env: 45 | AWS_REGION: eu-west-3 46 | AWS_DEFAULT_REGION: eu-west-3 47 | with: 48 | github_token: ${{ steps.app-token.outputs.token }} 49 | use_bedrock: "true" 50 | claude_args: "--model ${{ vars.BEDROCK_MODEL }} --max-turns 10" 51 | -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: Build and test images 2 | 3 | on: 4 | push: 5 | pull_request: 6 | branches: 7 | - master 8 | release: 9 | types: [published] 10 | schedule: 11 | - cron: "0 0 * * *" 12 | 13 | concurrency: 14 | group: ${{ github.workflow }}-${{ github.ref }}-${{ github.event_name }} 15 | cancel-in-progress: true 16 | 17 | jobs: 18 | 19 | generate_matrix: 20 | runs-on: ubuntu-24.04 21 | if: github.actor != 'dependabot[bot]' || github.event_name == 'pull_request' 22 | 23 | steps: 24 | - name: Checkout 25 | uses: actions/checkout@v6 26 | with: 27 | fetch-depth: 0 28 | - name: Set up Python 29 | uses: actions/setup-python@v6 30 | with: 31 | python-version: 3.11 32 | - name: Set up Pipenv 33 | run: | 34 | pip install pip pipenv 35 | pipenv sync 36 | - name: Run script 37 | id: run_script 38 | run: echo "::set-output name=matrix::$(pipenv run python matrix_generator.py)" 39 | 40 | outputs: 41 | matrix: ${{ steps.run_script.outputs.matrix }} 42 | 43 | build: 44 | runs-on: ubuntu-24.04 45 | if: (github.actor != 'dependabot[bot]' || github.event_name == 'pull_request') && fromJSON(needs.generate_matrix.outputs.matrix).include[0] 46 | needs: generate_matrix 47 | 48 | strategy: 49 | matrix: ${{fromJSON(needs.generate_matrix.outputs.matrix)}} 50 | fail-fast: false 51 | 52 | steps: 53 | - uses: actions/checkout@v6 54 | - uses: docker/setup-qemu-action@v3 55 | - uses: docker/setup-buildx-action@v3 56 | - name: Set up Python 57 | uses: actions/setup-python@v6 58 | with: 59 | python-version: 3.11 60 | - name: Set up Pipenv 61 | run: | 62 | pip install pip pipenv 63 | pipenv sync 64 | - name: Build and tests images 65 | env: 66 | DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} 67 | DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} 68 | GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} 69 | run: | 70 | pipenv run python image_builder.py build -d --image ${{ matrix.image }} --version ${{ matrix.version }} 71 | -------------------------------------------------------------------------------- /matrix_generator.py: -------------------------------------------------------------------------------- 1 | import json 2 | from glob import glob 3 | from os.path import exists 4 | 5 | import yaml 6 | from git import Repo 7 | 8 | matrix = {"include": []} 9 | excluded_files = [ # Changes to those files shouldn't trigger a build 10 | '.gitignore', 11 | 'CHANGELOG.md', 12 | 'README.md', 13 | '.github/dependabot.yml', 14 | '.github/copilot-instructions.md', 15 | ] 16 | 17 | 18 | def get_diff_files_list(): 19 | repo = Repo('.') 20 | modified_files = repo.commit("origin/master").diff(repo.commit()) 21 | changedFiles = [item.a_path for item in modified_files] 22 | return changedFiles 23 | 24 | 25 | def filter_excluded_files(changedFiles): 26 | filteredFiles = [ 27 | file for file in changedFiles if file not in excluded_files 28 | ] 29 | return filteredFiles 30 | 31 | 32 | def get_paths(changedFiles, unfilteredFiles): 33 | paths = [] 34 | if changedFiles == []: 35 | if unfilteredFiles == []: 36 | # Master or tag job with no diff, builds everything 37 | return glob("*/") 38 | else: 39 | # All files were previously excluded, builds nothing 40 | return [] 41 | for file in changedFiles: 42 | if "/" not in file or "/src" in file or ".github" in file: 43 | return glob("*/") 44 | else: 45 | split_path = file.split("/") 46 | paths.append(split_path[0]) 47 | return set(paths) 48 | 49 | 50 | def generate_matrix(paths): 51 | for image_folder in paths: 52 | with open("base_config.yml", 'r') as base_config: 53 | if exists("{}/config.yml".format(image_folder)): 54 | with open("{}/config.yml".format(image_folder), 'r') as config: 55 | full_config = base_config.read() + config.read() 56 | 57 | image_config = yaml.safe_load(full_config) 58 | 59 | for version in image_config["versions"]: 60 | matrix["include"].append( 61 | { 62 | "image": image_folder.replace("/", ""), 63 | "version": str(version) 64 | } 65 | ) 66 | print(json.dumps(matrix)) 67 | 68 | 69 | changedFiles = get_diff_files_list() 70 | filteredFiles = filter_excluded_files(changedFiles) 71 | paths = get_paths(filteredFiles, changedFiles) 72 | generate_matrix(paths) 73 | -------------------------------------------------------------------------------- /dind/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM docker:29.1.3-dind AS base 2 | LABEL maintainer="Rémi Marseille " 3 | LABEL org.opencontainers.image.source="https://github.com/ekino/docker-buildbox/" 4 | 5 | FROM base AS base-amd64 6 | ARG TRIVY_ARCH="Linux-64bit" 7 | ARG AWSCLI_ARCH="linux-x86_64" 8 | ADD requirements.txt . 9 | RUN echo "Install AWS & Azure CLIs" && \ 10 | apk add -q --no-cache bash build-base ca-certificates curl gettext git libffi-dev linux-headers musl-dev openldap-dev openssh-client python3-dev gcc libffi-dev libressl-dev make rsync tzdata groff zip && \ 11 | rm -f /usr/lib/python*/EXTERNALLY-MANAGED && \ 12 | python3 -m ensurepip && \ 13 | pip3 install --no-cache --upgrade pip setuptools wheel && \ 14 | pip3 -q install boto3 PyYAML && \ 15 | pip3 install -r requirements.txt && \ 16 | apk add aws-cli && \ 17 | echo "Done installing AWS & Azure CLIs" 18 | 19 | FROM base AS base-arm64 20 | ARG TRIVY_ARCH="Linux-ARM64" 21 | ADD requirements.txt . 22 | RUN echo "Install AWS & Azure CLIs" && \ 23 | apk add -q --no-cache bash build-base ca-certificates curl gettext git libffi-dev linux-headers musl-dev openldap-dev openssh-client python3-dev gcc libffi-dev libressl-dev make rsync tzdata groff zip && \ 24 | rm -f /usr/lib/python*/EXTERNALLY-MANAGED && \ 25 | python3 -m ensurepip && \ 26 | pip3 install --no-cache --upgrade pip setuptools wheel && \ 27 | pip3 -q install boto3 PyYAML && \ 28 | pip3 install -r requirements.txt && \ 29 | apk add aws-cli && \ 30 | echo "Done installing AWS & Azure CLIs" 31 | 32 | FROM base-$TARGETARCH 33 | RUN echo "Install Taskfile" && \ 34 | sh -c "$(curl --location https://taskfile.dev/install.sh)" -- -d && \ 35 | echo "Done Install Taskfile" && \ 36 | echo "Install Docker Compose" && \ 37 | apk add --update docker-compose && \ 38 | echo "Done install Docker Compose" && \ 39 | echo "Install Trivy" && \ 40 | # Downloading latest trivy 41 | TRIVY_VERSION=$(curl -s https://api.github.com/repos/aquasecurity/trivy/releases/latest | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/') && \ 42 | curl -LO https://github.com/aquasecurity/trivy/releases/download/v${TRIVY_VERSION}/trivy_${TRIVY_VERSION}_${TRIVY_ARCH}.tar.gz && \ 43 | tar xf trivy_${TRIVY_VERSION}_${TRIVY_ARCH}.tar.gz && \ 44 | rm trivy_${TRIVY_VERSION}_${TRIVY_ARCH}.tar.gz && \ 45 | mv trivy /usr/bin/trivy && \ 46 | echo "Done install Trivy" && \ 47 | echo "Adding an up to date mime-types definition file" && \ 48 | curl -sSL https://salsa.debian.org/debian/mime-support/raw/master/mime.types -o /etc/mime.types && \ 49 | echo "Cleaning files!" && \ 50 | rm -rf /tmp/* /var/cache/apk/* && \ 51 | echo "Done!" 52 | -------------------------------------------------------------------------------- /image_builder.py: -------------------------------------------------------------------------------- 1 | from os.path import exists 2 | 3 | import click 4 | from python_on_whales import docker 5 | 6 | import src.config as config 7 | import src.docker_tools as docker_tools 8 | 9 | 10 | @click.command() 11 | @click.option("--image", "-i", default="aws", help="image to build") 12 | @click.option("--version", "-v", default="1", help="image version") 13 | @click.option("--debug", "-d", is_flag=True, help="debug") 14 | def build(image, version, debug): 15 | 16 | # Get env variables 17 | env_conf = config.load_ci_env(debug) 18 | 19 | # Get image configuration 20 | try: 21 | image_conf = config.load_image_config(image, version) 22 | except KeyError as e: 23 | print(e) 24 | exit(1) 25 | 26 | # Build dockerfile directory and path 27 | dockerfile_directory = image 28 | prefixed_dockerfile_path = f"{version}/Dockerfile" 29 | # Set the subdirectory in path because we want dockerfile_directory (aka the build context) to be the parent image directory 30 | dockerfile_path = prefixed_dockerfile_path if exists( 31 | f"{dockerfile_directory}/{prefixed_dockerfile_path}") else "Dockerfile" 32 | 33 | # Build image tags list (base tag + archs) 34 | image_tags = config.get_image_tags(image, version, image_conf, env_conf) 35 | 36 | with docker_tools.start_local_registry() as local_registry: 37 | 38 | # Build, tag and push docker image to local registry 39 | docker_tools.build_image(image_conf, image_tags["localname"], dockerfile_directory, dockerfile_path, debug) 40 | 41 | # Run defined test command 42 | docker_tools.run_image(image_tags["localname"], image_conf, debug) 43 | 44 | # Push to registry in case of: 45 | # - tag 46 | # - push to master 47 | # - nightly build 48 | if ( 49 | env_conf["tag"] != "" 50 | or (env_conf["event_type"] != "pull_request" and env_conf["branch"] == "master") 51 | or env_conf["event_type"] == "schedule" 52 | ): 53 | # Login to registry and push 54 | docker_tools.login_to_registries(env_conf) 55 | 56 | # Build, tag and push docker image to remote registry (Docker hub) 57 | docker_tools.build_image(image_conf, 58 | [ 59 | image_tags["docker_fullname"], 60 | image_tags["gh_fullname"] 61 | ], 62 | dockerfile_directory, 63 | dockerfile_path, 64 | debug) 65 | 66 | 67 | @click.group() 68 | def cli(): 69 | pass 70 | 71 | 72 | cli.add_command(build) 73 | 74 | 75 | if __name__ == "__main__": 76 | cli() 77 | -------------------------------------------------------------------------------- /src/config.py: -------------------------------------------------------------------------------- 1 | import copy 2 | import os 3 | import pprint 4 | 5 | import yaml 6 | from yaml import Loader 7 | 8 | 9 | def load_ci_env(debug): 10 | print("> [Info] Gathering env variables") 11 | event = os.environ.get("GITHUB_EVENT_NAME", "") 12 | ref = os.environ.get("GITHUB_REF", "").replace("refs/heads/", "").replace("refs/tags/", "") 13 | build_info = { 14 | "branch": ref, 15 | "tag": ref if event == "release" else "", 16 | "event_type": event, 17 | "docker_reg_username": os.environ.get("DOCKER_USERNAME", ""), 18 | "docker_reg_password": os.environ.get("DOCKER_PASSWORD", ""), 19 | "github_token": os.environ.get("GITHUB_TOKEN", ""), 20 | } 21 | if debug: 22 | pp = pprint.PrettyPrinter(indent=1) 23 | print(">> CI environment configuration: ") 24 | pp.pprint(build_info) 25 | print("\n") 26 | return build_info 27 | 28 | 29 | def load_base_config(): 30 | with open(f"base_config.yml") as base_config_file: 31 | base_config = base_config_file.read() 32 | return yaml.load(base_config, Loader=Loader) 33 | 34 | 35 | def load_image_config(image_type, version): 36 | config_path = "config.yml" 37 | base_config_path = f"base_{config_path}" 38 | image_config_path = f"{image_type}/{config_path}" 39 | full_config = "" 40 | with open(base_config_path) as base_config: 41 | full_config = base_config.read() 42 | with open(image_config_path) as image_config: 43 | full_config = f"{full_config}\n{image_config.read()}" 44 | config = yaml.load(full_config, Loader=Loader) 45 | 46 | # Raise exceptions if a key is not found 47 | if "versions" not in config: 48 | raise KeyError("No configuration is set for this image - Image: " + image_type) 49 | if version not in config["versions"]: 50 | existing_versions = [v for v, _ in config["versions"].items()] 51 | raise KeyError( 52 | f"This version is not defined for {image_type} image - Defined versions: {', '.join(existing_versions)}" 53 | ) 54 | 55 | image_config = config["versions"][version] or dict() 56 | 57 | # Add version as a build arg automatically 58 | if "build_args" not in image_config: 59 | image_config["build_args"] = {} 60 | image_config["build_args"]["VERSION"] = version 61 | 62 | # Make sure all args are used as strings for Docker API 63 | if "build_args" in image_config: 64 | for arg, value in image_config["build_args"].items(): 65 | image_config["build_args"][arg] = str(value) 66 | 67 | image_config["namespace"] = config["namespace"] 68 | 69 | return image_config 70 | 71 | 72 | def get_image_tags(image_name, version, image_conf, env_conf): 73 | image_repo_name_base = f"{image_conf['namespace']}/ci-{image_name}" 74 | local_repo_name_base = f"localhost:5000/ci-{image_name}" 75 | version_tag = f'{version}-' if version != "1" else "" 76 | 77 | if env_conf["tag"]: 78 | version_tag += env_conf["tag"] 79 | elif env_conf["event_type"] == "schedule": 80 | version_tag += "nightly" 81 | elif env_conf["branch"] in ["master"]: 82 | version_tag += "latest" 83 | else: 84 | version_tag += "latest" 85 | 86 | tags = { 87 | "docker_fullname": f"{image_repo_name_base}:{version_tag}", 88 | "gh_fullname": f"ghcr.io/{image_repo_name_base}:{version_tag}", 89 | "localname": f"{local_repo_name_base}:{version_tag}", 90 | "platforms": {}, 91 | } 92 | for platform in image_conf["platforms"]: 93 | _os, _arch, _variant = parse_platform(platform) 94 | tags["platforms"][platform] = f"{image_repo_name_base}-{_arch}:{version_tag}" 95 | 96 | return tags 97 | 98 | def parse_platform(platform): 99 | parts = platform.split("/") 100 | parts.extend([None]) 101 | 102 | return parts[0:3] 103 | -------------------------------------------------------------------------------- /node/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM debian:trixie-slim AS base 2 | LABEL maintainer="opensource@ekino.com" 3 | LABEL org.opencontainers.image.source="https://github.com/ekino/docker-buildbox/" 4 | 5 | ENV DEBIAN_FRONTEND=noninteractive \ 6 | LANG=C.UTF-8 \ 7 | NVM_DIR=/root/.nvm \ 8 | PATH=/root/.nvm/versions/node/current/bin:usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 9 | ARG VERSION 10 | ARG TARGETARCH 11 | 12 | FROM base AS base-amd64 13 | ARG AWSCLI_ARCH="linux-x86_64" 14 | 15 | FROM base AS base-arm64 16 | ARG AWSCLI_ARCH="linux-aarch64" 17 | 18 | FROM base-$TARGETARCH 19 | RUN echo "Starting ..." && \ 20 | apt-get -qq clean && apt-get -qq update && \ 21 | apt-get -qq -y install libssl-dev curl git imagemagick make gnupg \ 22 | libmcrypt-dev libreadline-dev ruby-full openssh-client ocaml libelf-dev bzip2 gcc g++ jq && \ 23 | gem install rb-inotify:'~> 0.9.10' sass --verbose && \ 24 | gem install scss_lint:'~> 0.57.1' --verbose && \ 25 | echo "Done base install!" && \ 26 | echo "Install Taskfile" && \ 27 | sh -c "$(curl --location https://taskfile.dev/install.sh)" -- -d && \ 28 | echo "Done Install Taskfile" && \ 29 | echo "Starting Javascript..." && \ 30 | echo "Fetching latest NVM version..." && \ 31 | LATEST_NVM_VERSION=$(curl -s https://api.github.com/repos/nvm-sh/nvm/releases/latest | jq -r '.tag_name' | sed 's/^v//') && \ 32 | echo "Using NVM version: ${LATEST_NVM_VERSION}" && \ 33 | echo "Fetching latest Node.js version for major version ${VERSION}..." && \ 34 | LATEST_NODE_VERSION=$(curl -s https://api.github.com/repos/nodejs/node/releases | jq -r --arg major "v${VERSION}" '[.[] | select(.tag_name | startswith($major)) | .tag_name] | sort_by(. | ltrimstr("v") | split(".") | map(tonumber)) | reverse | .[0]' | sed 's/^v//') && \ 35 | echo "Using Node.js version: ${LATEST_NODE_VERSION}" && \ 36 | git clone https://github.com/nvm-sh/nvm.git /root/.nvm && cd /root/.nvm && git checkout v${LATEST_NVM_VERSION} && \ 37 | . /root/.nvm/nvm.sh && \ 38 | nvm install ${LATEST_NODE_VERSION} && nvm alias default ${LATEST_NODE_VERSION} && \ 39 | ln -s /root/.nvm/versions/node/v${LATEST_NODE_VERSION} /root/.nvm/versions/node/current && \ 40 | echo "Fetching latest NPM version..." && \ 41 | LATEST_NPM_VERSION=$(curl -s https://api.github.com/repos/npm/cli/releases/latest | jq -r '.tag_name' | sed 's/^v//') && \ 42 | echo "Using NPM version: ${LATEST_NPM_VERSION}" && \ 43 | npm install -g npm@${LATEST_NPM_VERSION} && \ 44 | curl -sSL https://dl.yarnpkg.com/debian/pubkey.gpg -o /etc/apt/keyrings/yarn.gpg && \ 45 | echo "deb [signed-by=/etc/apt/keyrings/yarn.gpg] https://dl.yarnpkg.com/debian/ stable main" >> /etc/apt/sources.list.d/yarn.list && \ 46 | apt-get update && apt-get install yarn --no-install-recommends && \ 47 | echo "Done JS!" && \ 48 | echo "Starting AWS" && \ 49 | curl https://awscli.amazonaws.com/awscli-exe-${AWSCLI_ARCH}.zip -o awscliv2.zip && \ 50 | unzip -q awscliv2.zip && \ 51 | ./aws/install && \ 52 | rm -f awscliv2.zip && rm -rf aws && \ 53 | echo "Done installing AWS" && \ 54 | echo "Adding an up to date mime-types definition file" && \ 55 | curl -sSL https://salsa.debian.org/debian/mime-support/raw/master/mime.types -o /etc/mime.types && \ 56 | echo "Cleaning files!" && \ 57 | rm -rf /tmp/* && \ 58 | apt-get -qq -y remove --purge emacsen-common fakeroot file firebird3.0-common firebird3.0-common-doc \ 59 | firebird3.0-server firebird3.0-server-core man-db manpages manpages-dev \ 60 | default-mysql-client mysql-common default-mysql-server default-mysql-server-core odbcinst odbcinst1debian2 \ 61 | patch po-debconf psmisc xauth xtrans-dev xz-utils zlib1g-dev && \ 62 | apt-get -qq -y autoremove && \ 63 | apt-get -qq clean && apt-get -qq purge && \ 64 | rm -rf /var/lib/apt/lists/* /var/lib/dpkg/*-old && \ 65 | rm -rf /usr/share/doc /usr/share/locale/[a-df-z]* /usr/share/locale/e[a-lo-z]* /usr/share/locale/en@* /usr/share/locale/en_GB && \ 66 | echo "Done!" 67 | -------------------------------------------------------------------------------- /php/8.4/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM php:8.4.15-cli-alpine3.22 AS base 2 | LABEL maintainer="Rémi Marseille " 3 | 4 | ARG APCU_VERSION 5 | ARG COMPOSER_VERSION 6 | ARG MEMCACHED_VERSION 7 | ARG MODD_VERSION 8 | ARG PHP_CS_FIXER_VERSION 9 | ARG REDIS_VERSION 10 | ARG SSH2_VERSION 11 | ARG XDEBUG_VERSION 12 | ARG TARGETARCH 13 | 14 | # iconv issue https://github.com/docker-library/php/issues/240 15 | FROM base AS base-amd64 16 | 17 | FROM base AS base-arm64 18 | 19 | FROM base-$TARGETARCH 20 | ENV COMPOSER_NO_INTERACTION=1 \ 21 | COMPOSER_MEMORY_LIMIT=-1 \ 22 | TERM=xterm \ 23 | LD_PRELOAD="/usr/lib/preloadable_libiconv.so php" \ 24 | PHP_CPPFLAGS="$PHP_CPPFLAGS -std=c++17" 25 | 26 | RUN version=$(php -r "echo PHP_MAJOR_VERSION.PHP_MINOR_VERSION;") && \ 27 | apk add --update --upgrade alpine-sdk apk-tools autoconf bash bzip2 cyrus-sasl-dev curl freetype-dev gettext git \ 28 | icu-dev icu-data-full jq libgcrypt-dev libjpeg-turbo-dev \ 29 | libmcrypt-dev libmemcached-dev libpng-dev libssh2-dev libxml2-dev libxslt-dev libzip-dev linux-headers make \ 30 | mysql-client openssh-client patch postgresql-client postgresql-dev rsync tzdata && \ 31 | echo "Starting PHP with $version" && \ 32 | docker-php-ext-configure gd --with-freetype=/usr/include/ --with-jpeg=/usr/include/ && \ 33 | CFLAGS_PREVIOUS=$CFLAGS && \ 34 | export CFLAGS="$CFLAGS -D_GNU_SOURCE" && \ 35 | docker-php-ext-install -j$(getconf _NPROCESSORS_ONLN) bcmath exif gd intl mysqli pcntl pdo_mysql pdo_pgsql pgsql soap sockets xsl zip && \ 36 | export CFLAGS=$CFLAGS_PREVIOUS && \ 37 | pecl install apcu-${APCU_VERSION} && \ 38 | pecl install memcached-${MEMCACHED_VERSION} && \ 39 | pecl install pcov && \ 40 | docker-php-ext-enable pcov && \ 41 | docker-php-ext-enable memcached && \ 42 | docker-php-ext-configure pgsql -with-pgsql=/usr/local/pgsql && \ 43 | echo -e "\ 44 | date.timezone=${PHP_TIMEZONE:-UTC} \n\ 45 | short_open_tag=Off \n\ 46 | extension=apcu.so \n\ 47 | zend_extension=opcache.so \n\ 48 | " > /usr/local/etc/php/php.ini && \ 49 | curl -sSL https://getcomposer.org/download/${COMPOSER_VERSION}/composer.phar -o /usr/local/bin/composer && chmod a+x /usr/local/bin/composer && \ 50 | curl -sSL https://github.com/FriendsOfPHP/PHP-CS-Fixer/releases/download/v${PHP_CS_FIXER_VERSION}/php-cs-fixer.phar -o /usr/local/bin/php-cs-fixer && chmod a+x /usr/local/bin/php-cs-fixer && \ 51 | curl -sSL https://github.com/phpredis/phpredis/archive/${REDIS_VERSION}.tar.gz | tar xz -C /tmp && \ 52 | cd /tmp/phpredis-${REDIS_VERSION} && phpize && ./configure && make && make install && \ 53 | echo "extension=redis.so" > /usr/local/etc/php/conf.d/redis.ini && \ 54 | curl -sSL https://github.com/xdebug/xdebug/archive/${XDEBUG_VERSION}.tar.gz | tar xz -C /tmp && \ 55 | cd /tmp/xdebug-${XDEBUG_VERSION} && phpize && ./configure --enable-xdebug && make && make install && \ 56 | echo -e "zend_extension=xdebug.so \nxdebug.mode=coverage \n" > /usr/local/etc/php/conf.d/xdebug.ini && \ 57 | mkdir -p /tmp/blackfire-probe && \ 58 | curl -A "Docker" -o /tmp/blackfire-probe/blackfire-probe.tar.gz -D - -L -s https://blackfire.io/api/v1/releases/probe/php/alpine/${TARGETARCH}/$version && \ 59 | tar zxpf /tmp/blackfire-probe/blackfire-probe.tar.gz -C /tmp/blackfire-probe && \ 60 | mv /tmp/blackfire-probe/blackfire-*.so $(php -r "echo ini_get('extension_dir');")/blackfire.so && \ 61 | printf "extension=blackfire.so\nblackfire.agent_socket=tcp://blackfire:8707\n" > $PHP_INI_DIR/conf.d/blackfire.ini && \ 62 | mkdir -p /tmp/blackfire-client && \ 63 | curl -A "Docker" -L https://blackfire.io/api/v1/releases/cli/linux/${TARGETARCH} | tar zxp -C /tmp/blackfire-client && \ 64 | mv /tmp/blackfire-client/blackfire /usr/bin/blackfire && \ 65 | # Starting AWS 66 | apk add aws-cli && \ 67 | # Adding an up to date mime-types definition file 68 | curl -sSL https://salsa.debian.org/debian/mime-support/raw/master/mime.types -o /etc/mime.types && \ 69 | # Cleaning files 70 | apk del --purge alpine-sdk autoconf && \ 71 | rm -rf /tmp/* /usr/share/doc /var/cache/apk/* 72 | -------------------------------------------------------------------------------- /src/docker_tools.py: -------------------------------------------------------------------------------- 1 | import os 2 | import pprint 3 | 4 | from python_on_whales import docker 5 | from python_on_whales.exceptions import DockerException 6 | 7 | 8 | def build_image(image_conf, image_tag, dockerfile_directory, dockerfile_path, debug): 9 | print("> [Info] Building: " + image_tag[0]) 10 | try: 11 | if debug: 12 | pp = pprint.PrettyPrinter(indent=1) 13 | print(">> Building configuration: ") 14 | pp.pprint(image_conf) 15 | print("\n") 16 | print(">> Dockerfile directory: ") 17 | print(dockerfile_directory) 18 | print("\n") 19 | print(">> Dockerfile relative path: ") 20 | print(dockerfile_path) 21 | print("\n") 22 | 23 | # Create a buildx builder instance 24 | builder = docker.buildx.create( 25 | use=True, driver_options=dict(network="host")) 26 | 27 | # Build and push to local registry 28 | docker.buildx.build( 29 | builder=builder, 30 | file=os.path.join(dockerfile_directory, dockerfile_path), 31 | context_path=dockerfile_directory, 32 | tags=image_tag, 33 | cache=False, 34 | push=True, 35 | build_args=image_conf["build_args"] if "build_args" in image_conf else { 36 | }, platforms=image_conf["platforms"] 37 | ) 38 | 39 | except DockerException as docker_exception: 40 | print("> [Error] Build error - " + str(docker_exception)) 41 | exit(1) 42 | finally: 43 | builder.remove() 44 | 45 | print("Build successful") 46 | 47 | 48 | def run_image(image_name, image_conf, debug): 49 | volume = [] 50 | 51 | print("> [Info] Testing " + image_name) 52 | 53 | try: 54 | if "test_config" in image_conf: 55 | test_config = image_conf["test_config"] 56 | if "volume" in test_config: 57 | # Split path:directory string and build volume dict 58 | splitted_volume = test_config["volume"].split(":") 59 | volume = [(f"{os.getcwd()}/{splitted_volume[0]}", 60 | splitted_volume[1], 61 | "ro")] 62 | for cmd in test_config["cmd"]: 63 | cmd_list = cmd.split(" ") 64 | if debug: 65 | print(">> Running test: " + str(cmd_list)) 66 | for platform in image_conf["platforms"]: 67 | container_output = docker.container.run( 68 | image=image_name, 69 | platform=platform, 70 | command=cmd_list, 71 | volumes=volume 72 | ) 73 | if debug: 74 | print(container_output) 75 | print("Tests successful") 76 | except DockerException as e: 77 | print("> [Error] Command test failed - " + str(e)) 78 | exit(1) 79 | finally: 80 | docker.container.prune() 81 | 82 | 83 | def tag_image(image, tag): 84 | docker.image.tag(image, tag) 85 | 86 | 87 | def start_local_registry(): 88 | return docker.run("registry:2", detach=True, publish=[(5000, 5000)], restart='always', name='registry') 89 | 90 | 91 | def login_to_registries(env_conf): 92 | print("> [Info] Login to registries") 93 | try: 94 | docker.login( 95 | username=env_conf["docker_reg_username"], password=env_conf["docker_reg_password"] 96 | ) 97 | print("Login to docker hub successful") 98 | except DockerException as docker_exception: 99 | print("> [Error] Login failed - " + str(docker_exception)) 100 | exit(1) 101 | try: 102 | docker.login( 103 | server="ghcr.io", username="ci", password=env_conf["github_token"] 104 | ) 105 | print("Login to GHCR successful") 106 | except DockerException as docker_exception: 107 | print("> [Error] Login failed - " + str(docker_exception)) 108 | exit(1) 109 | -------------------------------------------------------------------------------- /php/8.3/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM php:8.3.28-cli-alpine3.21 AS base 2 | LABEL maintainer="Rémi Marseille " 3 | LABEL org.opencontainers.image.source="https://github.com/ekino/docker-buildbox/" 4 | 5 | ARG APCU_VERSION 6 | ARG COMPOSER_VERSION 7 | ARG MEMCACHED_VERSION 8 | ARG PHP_CS_FIXER_VERSION 9 | ARG REDIS_VERSION 10 | ARG SSH2_VERSION 11 | ARG XDEBUG_VERSION 12 | ARG TARGETARCH 13 | 14 | # iconv issue https://github.com/docker-library/php/issues/240 15 | FROM base AS base-amd64 16 | 17 | FROM base AS base-arm64 18 | 19 | FROM base-$TARGETARCH 20 | ENV COMPOSER_NO_INTERACTION=1 \ 21 | COMPOSER_MEMORY_LIMIT=-1 \ 22 | TERM=xterm \ 23 | LD_PRELOAD="/usr/lib/preloadable_libiconv.so php" \ 24 | PHP_CPPFLAGS="$PHP_CPPFLAGS -std=c++17" 25 | 26 | RUN version=$(php -r "echo PHP_MAJOR_VERSION.PHP_MINOR_VERSION;") && \ 27 | apk add --update --upgrade alpine-sdk apk-tools autoconf bash bzip2 cyrus-sasl-dev curl freetype-dev gettext git \ 28 | icu-dev icu-data-full jq libgcrypt-dev libjpeg-turbo-dev \ 29 | libmcrypt-dev libmemcached-dev libpng-dev libssh2-dev libxml2-dev libxslt-dev libzip-dev linux-headers make \ 30 | mysql-client openssh-client patch postgresql-client postgresql-dev rsync tzdata && \ 31 | echo "Starting PHP with $version" && \ 32 | docker-php-ext-configure gd --with-freetype=/usr/include/ --with-jpeg=/usr/include/ && \ 33 | CFLAGS_PREVIOUS=$CFLAGS && \ 34 | export CFLAGS="$CFLAGS -D_GNU_SOURCE" && \ 35 | docker-php-ext-install -j$(getconf _NPROCESSORS_ONLN) bcmath exif gd intl mysqli pcntl pdo_mysql pdo_pgsql pgsql soap sockets xsl zip && \ 36 | export CFLAGS=$CFLAGS_PREVIOUS && \ 37 | pecl install apcu-${APCU_VERSION} && \ 38 | pecl install memcached-${MEMCACHED_VERSION} && \ 39 | pecl install pcov && \ 40 | docker-php-ext-enable pcov && \ 41 | docker-php-ext-enable memcached && \ 42 | docker-php-ext-configure pgsql -with-pgsql=/usr/local/pgsql && \ 43 | echo -e "\ 44 | date.timezone=${PHP_TIMEZONE:-UTC} \n\ 45 | short_open_tag=Off \n\ 46 | extension=apcu.so \n\ 47 | zend_extension=opcache.so \n\ 48 | " > /usr/local/etc/php/php.ini && \ 49 | curl -sSL https://getcomposer.org/download/${COMPOSER_VERSION}/composer.phar -o /usr/local/bin/composer && chmod a+x /usr/local/bin/composer && \ 50 | curl -sSL https://github.com/FriendsOfPHP/PHP-CS-Fixer/releases/download/v${PHP_CS_FIXER_VERSION}/php-cs-fixer.phar -o /usr/local/bin/php-cs-fixer && chmod a+x /usr/local/bin/php-cs-fixer && \ 51 | curl -sSL https://github.com/phpredis/phpredis/archive/${REDIS_VERSION}.tar.gz | tar xz -C /tmp && \ 52 | cd /tmp/phpredis-${REDIS_VERSION} && phpize && ./configure && make && make install && \ 53 | echo "extension=redis.so" > /usr/local/etc/php/conf.d/redis.ini && \ 54 | curl -sSL https://github.com/xdebug/xdebug/archive/${XDEBUG_VERSION}.tar.gz | tar xz -C /tmp && \ 55 | cd /tmp/xdebug-${XDEBUG_VERSION} && phpize && ./configure --enable-xdebug && make && make install && \ 56 | echo -e "zend_extension=xdebug.so \nxdebug.mode=coverage \n" > /usr/local/etc/php/conf.d/xdebug.ini && \ 57 | mkdir -p /tmp/blackfire-probe && \ 58 | curl -A "Docker" -o /tmp/blackfire-probe/blackfire-probe.tar.gz -D - -L -s https://blackfire.io/api/v1/releases/probe/php/alpine/${TARGETARCH}/$version && \ 59 | tar zxpf /tmp/blackfire-probe/blackfire-probe.tar.gz -C /tmp/blackfire-probe && \ 60 | mv /tmp/blackfire-probe/blackfire-*.so $(php -r "echo ini_get('extension_dir');")/blackfire.so && \ 61 | printf "extension=blackfire.so\nblackfire.agent_socket=tcp://blackfire:8707\n" > $PHP_INI_DIR/conf.d/blackfire.ini && \ 62 | mkdir -p /tmp/blackfire-client && \ 63 | curl -A "Docker" -L https://blackfire.io/api/v1/releases/cli/linux/${TARGETARCH} | tar zxp -C /tmp/blackfire-client && \ 64 | mv /tmp/blackfire-client/blackfire /usr/bin/blackfire && \ 65 | # Starting AWS 66 | apk add aws-cli && \ 67 | # Adding an up to date mime-types definition file 68 | curl -sSL https://salsa.debian.org/debian/mime-support/raw/master/mime.types -o /etc/mime.types && \ 69 | # Cleaning files 70 | apk del --purge alpine-sdk autoconf && \ 71 | rm -rf /tmp/* /usr/share/doc /var/cache/apk/* 72 | -------------------------------------------------------------------------------- /php/8.1/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM php:8.1.33-cli-alpine3.21 AS base 2 | LABEL maintainer="Rémi Marseille " 3 | LABEL org.opencontainers.image.source="https://github.com/ekino/docker-buildbox/" 4 | 5 | ARG APCU_VERSION 6 | ARG COMPOSER_VERSION 7 | ARG MEMCACHED_VERSION 8 | ARG PHP_CS_FIXER_VERSION 9 | ARG REDIS_VERSION 10 | ARG SSH2_VERSION 11 | ARG XDEBUG_VERSION 12 | ARG TARGETARCH 13 | 14 | # iconv issue https://github.com/docker-library/php/issues/240 15 | FROM base AS base-amd64 16 | 17 | FROM base AS base-arm64 18 | 19 | FROM base-$TARGETARCH 20 | ENV COMPOSER_NO_INTERACTION=1 \ 21 | COMPOSER_MEMORY_LIMIT=-1 \ 22 | TERM=xterm \ 23 | LD_PRELOAD="/usr/lib/preloadable_libiconv.so php" \ 24 | PHP_CPPFLAGS="$PHP_CPPFLAGS -std=c++11" 25 | 26 | 27 | RUN version=$(php -r "echo PHP_MAJOR_VERSION.PHP_MINOR_VERSION;") && \ 28 | apk add --update --upgrade alpine-sdk apk-tools autoconf bash bzip2 cyrus-sasl-dev curl freetype-dev gettext git \ 29 | icu-dev icu-data-full jq libgcrypt-dev libjpeg-turbo-dev \ 30 | libmcrypt-dev libmemcached-dev libpng-dev libssh2-dev libxml2-dev libxslt-dev libzip-dev linux-headers make \ 31 | mysql-client openssh-client patch postgresql-client postgresql-dev rsync tzdata && \ 32 | echo "Starting PHP with $version" && \ 33 | docker-php-ext-configure gd --with-freetype=/usr/include/ --with-jpeg=/usr/include/ && \ 34 | CFLAGS_PREVIOUS=$CFLAGS && \ 35 | export CFLAGS="$CFLAGS -D_GNU_SOURCE" && \ 36 | docker-php-ext-install -j$(getconf _NPROCESSORS_ONLN) bcmath exif gd intl mysqli pcntl pdo_mysql pdo_pgsql pgsql soap sockets xsl zip && \ 37 | export CFLAGS=$CFLAGS_PREVIOUS && \ 38 | pecl install apcu-${APCU_VERSION} && \ 39 | pecl install memcached-${MEMCACHED_VERSION} && \ 40 | pecl install pcov && \ 41 | docker-php-ext-enable pcov && \ 42 | docker-php-ext-enable memcached && \ 43 | docker-php-ext-configure pgsql -with-pgsql=/usr/local/pgsql && \ 44 | echo -e "\ 45 | date.timezone=${PHP_TIMEZONE:-UTC} \n\ 46 | short_open_tag=Off \n\ 47 | extension=apcu.so \n\ 48 | zend_extension=opcache.so \n\ 49 | " > /usr/local/etc/php/php.ini && \ 50 | curl -sSL https://getcomposer.org/download/${COMPOSER_VERSION}/composer.phar -o /usr/local/bin/composer && chmod a+x /usr/local/bin/composer && \ 51 | curl -sSL https://github.com/FriendsOfPHP/PHP-CS-Fixer/releases/download/v${PHP_CS_FIXER_VERSION}/php-cs-fixer.phar -o /usr/local/bin/php-cs-fixer && chmod a+x /usr/local/bin/php-cs-fixer && \ 52 | curl -sSL https://github.com/phpredis/phpredis/archive/${REDIS_VERSION}.tar.gz | tar xz -C /tmp && \ 53 | cd /tmp/phpredis-${REDIS_VERSION} && phpize && ./configure && make && make install && \ 54 | echo "extension=redis.so" > /usr/local/etc/php/conf.d/redis.ini && \ 55 | curl -sSL https://github.com/xdebug/xdebug/archive/${XDEBUG_VERSION}.tar.gz | tar xz -C /tmp && \ 56 | cd /tmp/xdebug-${XDEBUG_VERSION} && phpize && ./configure --enable-xdebug && make && make install && \ 57 | echo -e "zend_extension=xdebug.so \nxdebug.mode=coverage \n" > /usr/local/etc/php/conf.d/xdebug.ini && \ 58 | mkdir -p /tmp/blackfire-probe && \ 59 | curl -A "Docker" -o /tmp/blackfire-probe/blackfire-probe.tar.gz -D - -L -s https://blackfire.io/api/v1/releases/probe/php/alpine/${TARGETARCH}/$version && \ 60 | tar zxpf /tmp/blackfire-probe/blackfire-probe.tar.gz -C /tmp/blackfire-probe && \ 61 | mv /tmp/blackfire-probe/blackfire-*.so $(php -r "echo ini_get('extension_dir');")/blackfire.so && \ 62 | printf "extension=blackfire.so\nblackfire.agent_socket=tcp://blackfire:8707\n" > $PHP_INI_DIR/conf.d/blackfire.ini && \ 63 | mkdir -p /tmp/blackfire-client && \ 64 | curl -A "Docker" -L https://blackfire.io/api/v1/releases/cli/linux/${TARGETARCH} | tar zxp -C /tmp/blackfire-client && \ 65 | mv /tmp/blackfire-client/blackfire /usr/bin/blackfire && \ 66 | # Starting AWS 67 | apk add aws-cli && \ 68 | # Adding an up to date mime-types definition file 69 | curl -sSL https://salsa.debian.org/debian/mime-support/raw/master/mime.types -o /etc/mime.types && \ 70 | # Cleaning files 71 | apk del --purge alpine-sdk autoconf && \ 72 | rm -rf /tmp/* /usr/share/doc /var/cache/apk/* 73 | -------------------------------------------------------------------------------- /php/8.2/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM php:8.2.29-cli-alpine3.21 AS base 2 | LABEL maintainer="Rémi Marseille " 3 | LABEL org.opencontainers.image.source="https://github.com/ekino/docker-buildbox/" 4 | 5 | ARG APCU_VERSION 6 | ARG COMPOSER_VERSION 7 | ARG MEMCACHED_VERSION 8 | ARG PHP_CS_FIXER_VERSION 9 | ARG REDIS_VERSION 10 | ARG SSH2_VERSION 11 | ARG XDEBUG_VERSION 12 | ARG TARGETARCH 13 | 14 | # iconv issue https://github.com/docker-library/php/issues/240 15 | FROM base AS base-amd64 16 | 17 | FROM base AS base-arm64 18 | 19 | FROM base-$TARGETARCH 20 | ENV COMPOSER_NO_INTERACTION=1 \ 21 | COMPOSER_MEMORY_LIMIT=-1 \ 22 | TERM=xterm \ 23 | LD_PRELOAD="/usr/lib/preloadable_libiconv.so php" \ 24 | PHP_CPPFLAGS="$PHP_CPPFLAGS -std=c++17" 25 | 26 | 27 | RUN version=$(php -r "echo PHP_MAJOR_VERSION.PHP_MINOR_VERSION;") && \ 28 | apk add --update --upgrade alpine-sdk apk-tools autoconf bash bzip2 cyrus-sasl-dev curl freetype-dev gettext git \ 29 | icu-dev icu-data-full jq libgcrypt-dev libjpeg-turbo-dev \ 30 | libmcrypt-dev libmemcached-dev libpng-dev libssh2-dev libxml2-dev libxslt-dev libzip-dev linux-headers make \ 31 | mysql-client openssh-client patch postgresql-client postgresql-dev rsync tzdata && \ 32 | echo "Starting PHP with $version" && \ 33 | docker-php-ext-configure gd --with-freetype=/usr/include/ --with-jpeg=/usr/include/ && \ 34 | CFLAGS_PREVIOUS=$CFLAGS && \ 35 | export CFLAGS="$CFLAGS -D_GNU_SOURCE" && \ 36 | docker-php-ext-install -j$(getconf _NPROCESSORS_ONLN) bcmath exif gd intl mysqli pcntl pdo_mysql pdo_pgsql pgsql soap sockets xsl zip && \ 37 | export CFLAGS=$CFLAGS_PREVIOUS && \ 38 | pecl install apcu-${APCU_VERSION} && \ 39 | pecl install memcached-${MEMCACHED_VERSION} && \ 40 | pecl install pcov && \ 41 | docker-php-ext-enable pcov && \ 42 | docker-php-ext-enable memcached && \ 43 | docker-php-ext-configure pgsql -with-pgsql=/usr/local/pgsql && \ 44 | echo -e "\ 45 | date.timezone=${PHP_TIMEZONE:-UTC} \n\ 46 | short_open_tag=Off \n\ 47 | extension=apcu.so \n\ 48 | zend_extension=opcache.so \n\ 49 | " > /usr/local/etc/php/php.ini && \ 50 | curl -sSL https://getcomposer.org/download/${COMPOSER_VERSION}/composer.phar -o /usr/local/bin/composer && chmod a+x /usr/local/bin/composer && \ 51 | curl -sSL https://github.com/FriendsOfPHP/PHP-CS-Fixer/releases/download/v${PHP_CS_FIXER_VERSION}/php-cs-fixer.phar -o /usr/local/bin/php-cs-fixer && chmod a+x /usr/local/bin/php-cs-fixer && \ 52 | curl -sSL https://github.com/phpredis/phpredis/archive/${REDIS_VERSION}.tar.gz | tar xz -C /tmp && \ 53 | cd /tmp/phpredis-${REDIS_VERSION} && phpize && ./configure && make && make install && \ 54 | echo "extension=redis.so" > /usr/local/etc/php/conf.d/redis.ini && \ 55 | curl -sSL https://github.com/xdebug/xdebug/archive/${XDEBUG_VERSION}.tar.gz | tar xz -C /tmp && \ 56 | cd /tmp/xdebug-${XDEBUG_VERSION} && phpize && ./configure --enable-xdebug && make && make install && \ 57 | echo -e "zend_extension=xdebug.so \nxdebug.mode=coverage \n" > /usr/local/etc/php/conf.d/xdebug.ini && \ 58 | mkdir -p /tmp/blackfire-probe && \ 59 | curl -A "Docker" -o /tmp/blackfire-probe/blackfire-probe.tar.gz -D - -L -s https://blackfire.io/api/v1/releases/probe/php/alpine/${TARGETARCH}/$version && \ 60 | tar zxpf /tmp/blackfire-probe/blackfire-probe.tar.gz -C /tmp/blackfire-probe && \ 61 | mv /tmp/blackfire-probe/blackfire-*.so $(php -r "echo ini_get('extension_dir');")/blackfire.so && \ 62 | printf "extension=blackfire.so\nblackfire.agent_socket=tcp://blackfire:8707\n" > $PHP_INI_DIR/conf.d/blackfire.ini && \ 63 | mkdir -p /tmp/blackfire-client && \ 64 | curl -A "Docker" -L https://blackfire.io/api/v1/releases/cli/linux/${TARGETARCH} | tar zxp -C /tmp/blackfire-client && \ 65 | mv /tmp/blackfire-client/blackfire /usr/bin/blackfire && \ 66 | # Starting AWS 67 | apk add aws-cli && \ 68 | # Adding an up to date mime-types definition file 69 | curl -sSL https://salsa.debian.org/debian/mime-support/raw/master/mime.types -o /etc/mime.types && \ 70 | # Cleaning files 71 | apk del --purge alpine-sdk autoconf && \ 72 | rm -rf /tmp/* /usr/share/doc /var/cache/apk/* 73 | -------------------------------------------------------------------------------- /golang/1.24/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM golang:1.24.11 AS base 2 | LABEL maintainer="opensource@ekino.com" 3 | LABEL org.opencontainers.image.source="https://github.com/ekino/docker-buildbox/" 4 | 5 | ARG GITLEAKS_VERSION 6 | ARG GOLANGCILINT_VERSION 7 | ARG GOMODUPGRADE_VERSION 8 | ARG GOSWAGGER_VERSION 9 | ARG MIGRATE_VERSION 10 | ARG MOCKGEN_VERSION 11 | 12 | FROM base AS base-amd64 13 | ARG AWSCLI_ARCH="linux-x86_64" 14 | ARG GITLEAKS_ARCH="linux_x64" 15 | ARG GOLANGCILINT_ARCH="linux-amd64" 16 | ARG GOMODUPGRADE_ARCH="Linux_amd64" 17 | ARG GOSWAGGER_ARCH="linux_amd64" 18 | ARG GOMIGRATE_ARCH="linux-amd64" 19 | ARG MOCKGEN_ARCH="linux_amd64" 20 | 21 | FROM base AS base-arm64 22 | ARG AWSCLI_ARCH="linux-aarch64" 23 | ARG GITLEAKS_ARCH="linux_arm64" 24 | ARG GOLANGCILINT_ARCH="linux-arm64" 25 | ARG GOMODUPGRADE_ARCH="Linux_arm64" 26 | ARG GOSWAGGER_ARCH="linux_arm64" 27 | ARG GOMIGRATE_ARCH="linux-arm64" 28 | ARG MOCKGEN_ARCH="linux_arm64" 29 | 30 | FROM base-$TARGETARCH 31 | 32 | # Install packages 33 | RUN apt-get update -q && \ 34 | apt-get -qq -y install rsync zip curl unzip wget jq && \ 35 | # Install AWS CLI 36 | curl "https://awscli.amazonaws.com/awscli-exe-${AWSCLI_ARCH}.zip" -o "awscliv2.zip" && \ 37 | unzip -q awscliv2.zip && \ 38 | ./aws/install && \ 39 | rm -f awscliv2.zip && \ 40 | rm -rf aws && \ 41 | # Add an up to date mime-types definition file 42 | curl -sSL https://salsa.debian.org/debian/mime-support/raw/master/mime.types -o /etc/mime.types && \ 43 | # Install gitleaks 44 | GITLEAKS_VERSION=$(curl -s https://api.github.com/repos/gitleaks/gitleaks/releases/latest | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/') && \ 45 | wget -q https://github.com/gitleaks/gitleaks/releases/download/v${GITLEAKS_VERSION}/gitleaks_${GITLEAKS_VERSION}_${GITLEAKS_ARCH}.tar.gz && \ 46 | tar -xzf gitleaks_${GITLEAKS_VERSION}_${GITLEAKS_ARCH}.tar.gz && \ 47 | mv gitleaks /usr/local/bin && \ 48 | # Install golangci-lint 49 | GOLANGCILINT_VERSION=$(curl -s https://api.github.com/repos/golangci/golangci-lint/releases/latest | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/') && \ 50 | wget -q https://github.com/golangci/golangci-lint/releases/download/v${GOLANGCILINT_VERSION}/golangci-lint-${GOLANGCILINT_VERSION}-${GOLANGCILINT_ARCH}.tar.gz && \ 51 | tar -xzf golangci-lint-${GOLANGCILINT_VERSION}-${GOLANGCILINT_ARCH}.tar.gz && \ 52 | mv golangci-lint-${GOLANGCILINT_VERSION}-${GOLANGCILINT_ARCH}/golangci-lint /usr/local/bin && \ 53 | rm -rf golangci-lint* && \ 54 | # Install go-mod-upgrade 55 | GOMODUPGRADE_VERSION=$(curl -s https://api.github.com/repos/oligot/go-mod-upgrade/releases/latest | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/') && \ 56 | wget -q https://github.com/oligot/go-mod-upgrade/releases/download/v${GOMODUPGRADE_VERSION}/go-mod-upgrade_${GOMODUPGRADE_ARCH}.tar.gz && \ 57 | tar -xzf go-mod-upgrade_${GOMODUPGRADE_ARCH}.tar.gz -C /usr/local/bin && rm go-mod-upgrade* && \ 58 | # Install go-swagger 59 | GOSWAGGER_VERSION=$(curl -s https://api.github.com/repos/go-swagger/go-swagger/releases/latest | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/') && \ 60 | wget -q https://github.com/go-swagger/go-swagger/releases/download/v${GOSWAGGER_VERSION}/swagger_${GOSWAGGER_ARCH} && \ 61 | mv swagger_${GOSWAGGER_ARCH} /usr/local/bin/swagger && chmod +x /usr/local/bin/swagger && \ 62 | # Install migrate 63 | MIGRATE_VERSION=$(curl -s https://api.github.com/repos/golang-migrate/migrate/releases/latest | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/') && \ 64 | wget -q https://github.com/golang-migrate/migrate/releases/download/v${MIGRATE_VERSION}/migrate.${GOMIGRATE_ARCH}.tar.gz && \ 65 | tar -xzf migrate.${GOMIGRATE_ARCH}.tar.gz -C /usr/local/bin && \ 66 | rm migrate.${GOMIGRATE_ARCH}.tar.gz && \ 67 | # Install mockgen 68 | MOCKGEN_VERSION=$(curl -s https://api.github.com/repos/golang/mock/releases/latest | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/') && \ 69 | wget -q https://github.com/golang/mock/releases/download/v${MOCKGEN_VERSION}/mock_${MOCKGEN_VERSION}_${MOCKGEN_ARCH}.tar.gz && \ 70 | tar -xzf mock_${MOCKGEN_VERSION}_${MOCKGEN_ARCH}.tar.gz && \ 71 | mv mock_${MOCKGEN_VERSION}_${MOCKGEN_ARCH}/mockgen /usr/local/bin && \ 72 | rm -rf mock* && \ 73 | # Install go tools 74 | go install golang.org/x/tools/cmd/goimports@latest && \ 75 | go install github.com/boumenot/gocover-cobertura@latest 76 | -------------------------------------------------------------------------------- /golang/1.25/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM golang:1.25.5 AS base 2 | LABEL maintainer="opensource@ekino.com" 3 | LABEL org.opencontainers.image.source="https://github.com/ekino/docker-buildbox/" 4 | 5 | ARG GITLEAKS_VERSION 6 | ARG GOLANGCILINT_VERSION 7 | ARG GOMODUPGRADE_VERSION 8 | ARG GOSWAGGER_VERSION 9 | ARG MIGRATE_VERSION 10 | ARG MOCKGEN_VERSION 11 | 12 | FROM base AS base-amd64 13 | ARG AWSCLI_ARCH="linux-x86_64" 14 | ARG GITLEAKS_ARCH="linux_x64" 15 | ARG GOLANGCILINT_ARCH="linux-amd64" 16 | ARG GOMODUPGRADE_ARCH="Linux_amd64" 17 | ARG GOSWAGGER_ARCH="linux_amd64" 18 | ARG GOMIGRATE_ARCH="linux-amd64" 19 | ARG MOCKGEN_ARCH="linux_amd64" 20 | 21 | FROM base AS base-arm64 22 | ARG AWSCLI_ARCH="linux-aarch64" 23 | ARG GITLEAKS_ARCH="linux_arm64" 24 | ARG GOLANGCILINT_ARCH="linux-arm64" 25 | ARG GOMODUPGRADE_ARCH="Linux_arm64" 26 | ARG GOSWAGGER_ARCH="linux_arm64" 27 | ARG GOMIGRATE_ARCH="linux-arm64" 28 | ARG MOCKGEN_ARCH="linux_arm64" 29 | 30 | FROM base-$TARGETARCH 31 | 32 | # Install packages 33 | RUN apt-get update -q && \ 34 | apt-get -qq -y install rsync zip curl unzip wget jq && \ 35 | # Install AWS CLI 36 | curl "https://awscli.amazonaws.com/awscli-exe-${AWSCLI_ARCH}.zip" -o "awscliv2.zip" && \ 37 | unzip -q awscliv2.zip && \ 38 | ./aws/install && \ 39 | rm -f awscliv2.zip && \ 40 | rm -rf aws && \ 41 | # Add an up to date mime-types definition file 42 | curl -sSL https://salsa.debian.org/debian/mime-support/raw/master/mime.types -o /etc/mime.types && \ 43 | # Install gitleaks 44 | GITLEAKS_VERSION=$(curl -s https://api.github.com/repos/gitleaks/gitleaks/releases/latest | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/') && \ 45 | wget -q https://github.com/gitleaks/gitleaks/releases/download/v${GITLEAKS_VERSION}/gitleaks_${GITLEAKS_VERSION}_${GITLEAKS_ARCH}.tar.gz && \ 46 | tar -xzf gitleaks_${GITLEAKS_VERSION}_${GITLEAKS_ARCH}.tar.gz && \ 47 | mv gitleaks /usr/local/bin && \ 48 | # Install golangci-lint 49 | GOLANGCILINT_VERSION=$(curl -s https://api.github.com/repos/golangci/golangci-lint/releases/latest | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/') && \ 50 | wget -q https://github.com/golangci/golangci-lint/releases/download/v${GOLANGCILINT_VERSION}/golangci-lint-${GOLANGCILINT_VERSION}-${GOLANGCILINT_ARCH}.tar.gz && \ 51 | tar -xzf golangci-lint-${GOLANGCILINT_VERSION}-${GOLANGCILINT_ARCH}.tar.gz && \ 52 | mv golangci-lint-${GOLANGCILINT_VERSION}-${GOLANGCILINT_ARCH}/golangci-lint /usr/local/bin && \ 53 | rm -rf golangci-lint* && \ 54 | # Install go-mod-upgrade 55 | GOMODUPGRADE_VERSION=$(curl -s https://api.github.com/repos/oligot/go-mod-upgrade/releases/latest | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/') && \ 56 | wget -q https://github.com/oligot/go-mod-upgrade/releases/download/v${GOMODUPGRADE_VERSION}/go-mod-upgrade_${GOMODUPGRADE_ARCH}.tar.gz && \ 57 | tar -xzf go-mod-upgrade_${GOMODUPGRADE_ARCH}.tar.gz -C /usr/local/bin && rm go-mod-upgrade* && \ 58 | # Install go-swagger 59 | GOSWAGGER_VERSION=$(curl -s https://api.github.com/repos/go-swagger/go-swagger/releases/latest | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/') && \ 60 | wget -q https://github.com/go-swagger/go-swagger/releases/download/v${GOSWAGGER_VERSION}/swagger_${GOSWAGGER_ARCH} && \ 61 | mv swagger_${GOSWAGGER_ARCH} /usr/local/bin/swagger && chmod +x /usr/local/bin/swagger && \ 62 | # Install migrate 63 | MIGRATE_VERSION=$(curl -s https://api.github.com/repos/golang-migrate/migrate/releases/latest | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/') && \ 64 | wget -q https://github.com/golang-migrate/migrate/releases/download/v${MIGRATE_VERSION}/migrate.${GOMIGRATE_ARCH}.tar.gz && \ 65 | tar -xzf migrate.${GOMIGRATE_ARCH}.tar.gz -C /usr/local/bin && \ 66 | rm migrate.${GOMIGRATE_ARCH}.tar.gz && \ 67 | # Install mockgen 68 | MOCKGEN_VERSION=$(curl -s https://api.github.com/repos/golang/mock/releases/latest | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/') && \ 69 | wget -q https://github.com/golang/mock/releases/download/v${MOCKGEN_VERSION}/mock_${MOCKGEN_VERSION}_${MOCKGEN_ARCH}.tar.gz && \ 70 | tar -xzf mock_${MOCKGEN_VERSION}_${MOCKGEN_ARCH}.tar.gz && \ 71 | mv mock_${MOCKGEN_VERSION}_${MOCKGEN_ARCH}/mockgen /usr/local/bin && \ 72 | rm -rf mock* && \ 73 | # Install go tools 74 | go install golang.org/x/tools/cmd/goimports@latest && \ 75 | go install github.com/boumenot/gocover-cobertura@latest 76 | -------------------------------------------------------------------------------- /azure/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:3.14.1-slim-trixie AS base 2 | 3 | LABEL maintainer="opensource@ekino.com" 4 | LABEL org.opencontainers.image.source="https://github.com/ekino/docker-buildbox/" 5 | 6 | FROM base AS base-amd64 7 | ARG AWSCLI_ARCH="x86_64" 8 | ARG HELM_ARCH="linux-amd64" 9 | ARG KUBECTL_ARCH="amd64" 10 | ARG KUSTOMIZE_ARCH="linux_amd64" 11 | ARG TRIVY_ARCH="Linux-64bit" 12 | ARG TERRAGRUNT_ARCH="amd64" 13 | ARG INFRACOST_ARCH="amd64" 14 | ARG JQ_ARCH="amd64" 15 | 16 | FROM base AS base-arm64 17 | ARG AWSCLI_ARCH="aarch64" 18 | ARG HELM_ARCH="linux-arm64" 19 | ARG KUBECTL_ARCH="arm64" 20 | ARG KUSTOMIZE_ARCH="linux_arm64" 21 | ARG TRIVY_ARCH="Linux-ARM64" 22 | ARG TERRAGRUNT_ARCH="arm64" 23 | ARG INFRACOST_ARCH="arm64" 24 | ARG JQ_ARCH="arm64" 25 | 26 | FROM base-$TARGETARCH 27 | 28 | RUN apt-get update -qq && apt-get install -qq -y curl git gcc zip jq wget\ 29 | && pip install -U pip \ 30 | && pip install pipenv azure-cli \ 31 | && apt-get remove -y gcc && apt-get -qq -y autoremove \ 32 | && apt-get -qq -y clean && apt-get -y -qq purge\ 33 | && rm -rf /var/lib/apt/lists/* /var/lib/dpkg/*-old\ 34 | && echo "Adding yq bin" \ 35 | && wget https://github.com/mikefarah/yq/releases/latest/download/yq_linux_${JQ_ARCH} -O /usr/bin/yq \ 36 | && chmod +x /usr/bin/yq && \ 37 | curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/${KUBECTL_ARCH}/kubectl" && \ 38 | chmod +x ./kubectl && \ 39 | mv ./kubectl /usr/bin/kubectl && \ 40 | # Downloading latest kustomize 41 | KUSTOMIZE_VERSION=$(curl -s https://api.github.com/repos/kubernetes-sigs/kustomize/releases/latest | grep '"tag_name":' | sed -E 's/.*"kustomize\/v([^"]+)".*/\1/') && \ 42 | curl -LO https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize%2Fv${KUSTOMIZE_VERSION}/kustomize_v${KUSTOMIZE_VERSION}_${KUSTOMIZE_ARCH}.tar.gz && \ 43 | tar -xf kustomize_v${KUSTOMIZE_VERSION}_${KUSTOMIZE_ARCH}.tar.gz && \ 44 | rm kustomize_v${KUSTOMIZE_VERSION}_${KUSTOMIZE_ARCH}.tar.gz && \ 45 | mv ./kustomize /usr/bin/kustomize && \ 46 | # Downloading latest helm (3.x.x) 47 | HELM_VERSION=$(curl -s https://api.github.com/repos/helm/helm/releases | grep '"tag_name":' | grep -E 'v3\.[0-9]+\.[0-9]+' | head -1 | sed -E 's/.*"v([^"]+)".*/\1/') && \ 48 | curl -LO https://get.helm.sh/helm-v${HELM_VERSION}-${HELM_ARCH}.tar.gz && \ 49 | tar xf helm-v${HELM_VERSION}-${HELM_ARCH}.tar.gz && rm helm-v${HELM_VERSION}-${HELM_ARCH}.tar.gz && \ 50 | mv ${HELM_ARCH}/helm /usr/local/bin/helm && \ 51 | # Downloading latest helm diff plugin 52 | HELM_DIFF_VERSION=$(curl -s https://api.github.com/repos/databus23/helm-diff/releases/latest | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/') && \ 53 | helm plugin install --version $HELM_DIFF_VERSION https://github.com/databus23/helm-diff && \ 54 | # Downloading latest trivy 55 | TRIVY_VERSION=$(curl -s https://api.github.com/repos/aquasecurity/trivy/releases/latest | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/') && \ 56 | curl -LO https://github.com/aquasecurity/trivy/releases/download/v${TRIVY_VERSION}/trivy_${TRIVY_VERSION}_${TRIVY_ARCH}.tar.gz && \ 57 | tar xf trivy_${TRIVY_VERSION}_${TRIVY_ARCH}.tar.gz && \ 58 | rm trivy_${TRIVY_VERSION}_${TRIVY_ARCH}.tar.gz && \ 59 | mv trivy /usr/bin/trivy && \ 60 | # Downloading latest terragrunt 61 | TERRAGRUNT_VERSION=$(curl -s https://api.github.com/repos/gruntwork-io/terragrunt/releases/latest | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/') && \ 62 | curl -LO https://github.com/gruntwork-io/terragrunt/releases/download/v${TERRAGRUNT_VERSION}/terragrunt_linux_${TERRAGRUNT_ARCH} && \ 63 | mv terragrunt_linux_${TERRAGRUNT_ARCH} /usr/bin/terragrunt && \ 64 | chmod +x /usr/bin/terragrunt && \ 65 | # Downloading latest infracost 66 | INFRACOST_VERSION=$(curl -s https://api.github.com/repos/infracost/infracost/releases/latest | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/') && \ 67 | curl -LO https://github.com/infracost/infracost/releases/download/v${INFRACOST_VERSION}/infracost-linux-${INFRACOST_ARCH}.tar.gz && \ 68 | tar xvf infracost-linux-${INFRACOST_ARCH}.tar.gz && \ 69 | mv infracost-linux-${INFRACOST_ARCH} /usr/bin/infracost && \ 70 | curl -LO https://raw.githubusercontent.com/infracost/infracost/v${INFRACOST_VERSION}/scripts/ci/diff.sh && \ 71 | mv diff.sh /opt/diff.sh && \ 72 | chmod +x /opt/diff.sh && \ 73 | git clone --depth=1 https://github.com/tfutils/tfenv.git ~/.tfenv && \ 74 | ln -s ~/.tfenv/bin/* /usr/local/bin 75 | -------------------------------------------------------------------------------- /scaleway/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:3.14.1-slim-trixie AS base 2 | LABEL maintainer="Frank Pavageau " 3 | LABEL org.opencontainers.image.source="https://github.com/ekino/docker-buildbox/" 4 | 5 | FROM base AS base-amd64 6 | ARG AWSCLI_ARCH="x86_64" 7 | ARG HELM_ARCH="linux-amd64" 8 | ARG KUBECTL_ARCH="amd64" 9 | ARG KUSTOMIZE_ARCH="linux_amd64" 10 | ARG TRIVY_ARCH="Linux-64bit" 11 | ARG TERRAGRUNT_ARCH="amd64" 12 | ARG JQ_ARCH="amd64" 13 | ARG SCW_ARCH="amd64" 14 | 15 | FROM base AS base-arm64 16 | ARG AWSCLI_ARCH="aarch64" 17 | ARG HELM_ARCH="linux-arm64" 18 | ARG KUBECTL_ARCH="arm64" 19 | ARG KUSTOMIZE_ARCH="linux_arm64" 20 | ARG TRIVY_ARCH="Linux-ARM64" 21 | ARG TERRAGRUNT_ARCH="arm64" 22 | ARG JQ_ARCH="arm64" 23 | ARG SCW_ARCH="arm64" 24 | 25 | FROM base-$TARGETARCH 26 | ARG AWSCLI_URL="https://awscli.amazonaws.com/awscli-exe-linux-${AWSCLI_ARCH}.zip" 27 | 28 | RUN apt-get update -qq && apt-get install -qq -y curl git zip jq wget && \ 29 | apt-get -qq -y autoremove && \ 30 | apt-get -qq clean && apt-get -qq purge && \ 31 | rm -rf /var/lib/apt/lists/* /var/lib/dpkg/*-old && \ 32 | # Adding an up to date mime-types definition file 33 | curl -sSL https://salsa.debian.org/debian/mime-support/raw/master/mime.types -o /etc/mime.types && \ 34 | # Adding yq bin 35 | wget https://github.com/mikefarah/yq/releases/latest/download/yq_linux_${JQ_ARCH} -O /usr/bin/yq && \ 36 | chmod +x /usr/bin/yq && \ 37 | pip install -U pip && \ 38 | pip install pipenv && \ 39 | # Installing SCW Cli 40 | SCW_VERSION=$(curl -s https://api.github.com/repos/scaleway/scaleway-cli/releases/latest | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/') && \ 41 | curl -LO https://github.com/scaleway/scaleway-cli/releases/download/v${SCW_VERSION}/scaleway-cli_${SCW_VERSION}_linux_${SCW_ARCH} && \ 42 | mv scaleway-cli_${SCW_VERSION}_linux_${SCW_ARCH} /usr/bin/scw && \ 43 | chmod +x /usr/bin/scw && \ 44 | # Installing kubectl 45 | curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/${KUBECTL_ARCH}/kubectl" && \ 46 | chmod +x ./kubectl && \ 47 | mv ./kubectl /usr/bin/kubectl && \ 48 | # Downloading latest kustomize 49 | KUSTOMIZE_VERSION=$(curl -s https://api.github.com/repos/kubernetes-sigs/kustomize/releases/latest | grep '"tag_name":' | sed -E 's/.*"kustomize\/v([^"]+)".*/\1/') && \ 50 | curl -LO https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize%2Fv${KUSTOMIZE_VERSION}/kustomize_v${KUSTOMIZE_VERSION}_${KUSTOMIZE_ARCH}.tar.gz && \ 51 | tar -xf kustomize_v${KUSTOMIZE_VERSION}_${KUSTOMIZE_ARCH}.tar.gz && \ 52 | rm kustomize_v${KUSTOMIZE_VERSION}_${KUSTOMIZE_ARCH}.tar.gz && \ 53 | mv ./kustomize /usr/bin/kustomize && \ 54 | # Downloading latest helm (3.x.x) 55 | HELM_VERSION=$(curl -s https://api.github.com/repos/helm/helm/releases | grep '"tag_name":' | grep -E 'v3\.[0-9]+\.[0-9]+' | head -1 | sed -E 's/.*"v([^"]+)".*/\1/') && \ 56 | curl -LO https://get.helm.sh/helm-v${HELM_VERSION}-${HELM_ARCH}.tar.gz && \ 57 | tar xf helm-v${HELM_VERSION}-${HELM_ARCH}.tar.gz && rm helm-v${HELM_VERSION}-${HELM_ARCH}.tar.gz && \ 58 | mv ${HELM_ARCH}/helm /usr/local/bin/helm && \ 59 | # Downloading latest helm diff plugin 60 | HELM_DIFF_VERSION=$(curl -s https://api.github.com/repos/databus23/helm-diff/releases/latest | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/') && \ 61 | helm plugin install --version $HELM_DIFF_VERSION https://github.com/databus23/helm-diff && \ 62 | # Downloading latest trivy 63 | TRIVY_VERSION=$(curl -s https://api.github.com/repos/aquasecurity/trivy/releases/latest | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/') && \ 64 | curl -LO https://github.com/aquasecurity/trivy/releases/download/v${TRIVY_VERSION}/trivy_${TRIVY_VERSION}_${TRIVY_ARCH}.tar.gz && \ 65 | tar xf trivy_${TRIVY_VERSION}_${TRIVY_ARCH}.tar.gz && \ 66 | rm trivy_${TRIVY_VERSION}_${TRIVY_ARCH}.tar.gz && \ 67 | mv trivy /usr/bin/trivy && \ 68 | # Downloading latest terragrunt 69 | TERRAGRUNT_VERSION=$(curl -s https://api.github.com/repos/gruntwork-io/terragrunt/releases/latest | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/') && \ 70 | curl -LO https://github.com/gruntwork-io/terragrunt/releases/download/v${TERRAGRUNT_VERSION}/terragrunt_linux_${TERRAGRUNT_ARCH} && \ 71 | mv terragrunt_linux_${TERRAGRUNT_ARCH} /usr/bin/terragrunt && \ 72 | chmod +x /usr/bin/terragrunt && \ 73 | git clone --depth=1 https://github.com/tfutils/tfenv.git ~/.tfenv && \ 74 | ln -s ~/.tfenv/bin/* /usr/local/bin 75 | -------------------------------------------------------------------------------- /aws/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:3.14.1-slim-trixie AS base 2 | LABEL maintainer="Frank Pavageau " 3 | LABEL org.opencontainers.image.source="https://github.com/ekino/docker-buildbox/" 4 | 5 | FROM base AS base-amd64 6 | ARG AWSCLI_ARCH="x86_64" 7 | ARG HELM_ARCH="linux-amd64" 8 | ARG KUBECTL_ARCH="amd64" 9 | ARG KUSTOMIZE_ARCH="linux_amd64" 10 | ARG TRIVY_ARCH="Linux-64bit" 11 | ARG TERRAGRUNT_ARCH="amd64" 12 | ARG INFRACOST_ARCH="amd64" 13 | ARG JQ_ARCH="amd64" 14 | 15 | FROM base AS base-arm64 16 | ARG AWSCLI_ARCH="aarch64" 17 | ARG HELM_ARCH="linux-arm64" 18 | ARG KUBECTL_ARCH="arm64" 19 | ARG KUSTOMIZE_ARCH="linux_arm64" 20 | ARG TRIVY_ARCH="Linux-ARM64" 21 | ARG TERRAGRUNT_ARCH="arm64" 22 | ARG INFRACOST_ARCH="arm64" 23 | ARG JQ_ARCH="arm64" 24 | 25 | FROM base-$TARGETARCH 26 | ARG AWSCLI_URL="https://awscli.amazonaws.com/awscli-exe-linux-${AWSCLI_ARCH}.zip" 27 | 28 | RUN apt-get update -qq && apt-get install -qq -y curl git zip jq wget && \ 29 | apt-get -qq -y autoremove && \ 30 | apt-get -qq clean && apt-get -qq purge && \ 31 | rm -rf /var/lib/apt/lists/* /var/lib/dpkg/*-old && \ 32 | # Adding an up to date mime-types definition file 33 | curl -sSL https://salsa.debian.org/debian/mime-support/raw/master/mime.types -o /etc/mime.types && \ 34 | # Adding yq bin 35 | wget https://github.com/mikefarah/yq/releases/latest/download/yq_linux_${JQ_ARCH} -O /usr/bin/yq && \ 36 | chmod +x /usr/bin/yq && \ 37 | pip install -U pip && \ 38 | pip install pipenv && \ 39 | # Installing AWS Cli 40 | curl ${AWSCLI_URL} -o "awscliv2.zip" && \ 41 | unzip -q awscliv2.zip && \ 42 | ./aws/install && \ 43 | rm -f awscliv2.zip && rm -rf aws && \ 44 | curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/${KUBECTL_ARCH}/kubectl" && \ 45 | chmod +x ./kubectl && \ 46 | mv ./kubectl /usr/bin/kubectl && \ 47 | # Downloading latest kustomize 48 | KUSTOMIZE_VERSION=$(curl -s https://api.github.com/repos/kubernetes-sigs/kustomize/releases/latest | grep '"tag_name":' | sed -E 's/.*"kustomize\/v([^"]+)".*/\1/') && \ 49 | curl -LO https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize%2Fv${KUSTOMIZE_VERSION}/kustomize_v${KUSTOMIZE_VERSION}_${KUSTOMIZE_ARCH}.tar.gz && \ 50 | tar -xf kustomize_v${KUSTOMIZE_VERSION}_${KUSTOMIZE_ARCH}.tar.gz && \ 51 | rm kustomize_v${KUSTOMIZE_VERSION}_${KUSTOMIZE_ARCH}.tar.gz && \ 52 | mv ./kustomize /usr/bin/kustomize && \ 53 | # Downloading latest helm (3.x.x) 54 | HELM_VERSION=$(curl -s https://api.github.com/repos/helm/helm/releases | grep '"tag_name":' | grep -E 'v3\.[0-9]+\.[0-9]+' | head -1 | sed -E 's/.*"v([^"]+)".*/\1/') && \ 55 | curl -LO https://get.helm.sh/helm-v${HELM_VERSION}-${HELM_ARCH}.tar.gz && \ 56 | tar xf helm-v${HELM_VERSION}-${HELM_ARCH}.tar.gz && rm helm-v${HELM_VERSION}-${HELM_ARCH}.tar.gz && \ 57 | mv ${HELM_ARCH}/helm /usr/local/bin/helm && \ 58 | # Downloading latest helm diff plugin 59 | HELM_DIFF_VERSION=$(curl -s https://api.github.com/repos/databus23/helm-diff/releases/latest | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/') && \ 60 | helm plugin install --version $HELM_DIFF_VERSION https://github.com/databus23/helm-diff && \ 61 | # Downloading latest trivy 62 | TRIVY_VERSION=$(curl -s https://api.github.com/repos/aquasecurity/trivy/releases/latest | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/') && \ 63 | curl -LO https://github.com/aquasecurity/trivy/releases/download/v${TRIVY_VERSION}/trivy_${TRIVY_VERSION}_${TRIVY_ARCH}.tar.gz && \ 64 | tar xf trivy_${TRIVY_VERSION}_${TRIVY_ARCH}.tar.gz && \ 65 | rm trivy_${TRIVY_VERSION}_${TRIVY_ARCH}.tar.gz && \ 66 | mv trivy /usr/bin/trivy && \ 67 | # Downloading latest terragrunt 68 | TERRAGRUNT_VERSION=$(curl -s https://api.github.com/repos/gruntwork-io/terragrunt/releases/latest | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/') && \ 69 | curl -LO https://github.com/gruntwork-io/terragrunt/releases/download/v${TERRAGRUNT_VERSION}/terragrunt_linux_${TERRAGRUNT_ARCH} && \ 70 | mv terragrunt_linux_${TERRAGRUNT_ARCH} /usr/bin/terragrunt && \ 71 | chmod +x /usr/bin/terragrunt && \ 72 | # Downloading latest infracost 73 | INFRACOST_VERSION=$(curl -s https://api.github.com/repos/infracost/infracost/releases/latest | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/') && \ 74 | curl -LO https://github.com/infracost/infracost/releases/download/v${INFRACOST_VERSION}/infracost-linux-${INFRACOST_ARCH}.tar.gz && \ 75 | tar xvf infracost-linux-${INFRACOST_ARCH}.tar.gz && \ 76 | mv infracost-linux-${INFRACOST_ARCH} /usr/bin/infracost && \ 77 | curl -LO https://raw.githubusercontent.com/infracost/infracost/v${INFRACOST_VERSION}/scripts/ci/diff.sh && \ 78 | mv diff.sh /opt/diff.sh && \ 79 | chmod +x /opt/diff.sh && \ 80 | git clone --depth=1 https://github.com/tfutils/tfenv.git ~/.tfenv && \ 81 | ln -s ~/.tfenv/bin/* /usr/local/bin 82 | -------------------------------------------------------------------------------- /CLAUDE.md: -------------------------------------------------------------------------------- 1 | # CLAUDE.md 2 | 3 | This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. 4 | 5 | ## Project Overview 6 | 7 | Docker BuildBox is a collection of Docker images designed for CI/CD pipelines (primarily GitLab CI). These images provide standardized build environments for various programming languages and cloud tools. **CRITICAL: These images are NOT for production use.** 8 | 9 | ## Common Commands 10 | 11 | ### Local Development Setup 12 | ```bash 13 | # Setup Python environment (requires Python 3.11) 14 | pipenv install 15 | pipenv shell 16 | ``` 17 | 18 | ### Building and Testing Images 19 | ```bash 20 | # Build a specific image/version (must use pipenv shell or pipenv run) 21 | pipenv run python image_builder.py build --image IMAGE_NAME --version VERSION 22 | 23 | # Examples 24 | pipenv run python image_builder.py build --image java --version 17 25 | pipenv run python image_builder.py build --image php --version 8.3 26 | pipenv run python image_builder.py build --image aws --version 1 --debug 27 | 28 | # Generate build matrix (used by CI) 29 | pipenv run python matrix_generator.py 30 | 31 | # Alternative: activate pipenv environment first 32 | pipenv shell 33 | python image_builder.py build --image IMAGE_NAME --version VERSION 34 | ``` 35 | 36 | ### Testing Commands 37 | Tests are defined in each image's `config.yml` under `test_config.cmd` and run automatically during the build process. Each test verifies tool installations and basic functionality. 38 | 39 | ## Architecture Overview 40 | 41 | ### Core Build System 42 | - **`image_builder.py`**: Main build script using Click CLI framework 43 | - **`matrix_generator.py`**: Generates CI build matrix by analyzing Git diffs 44 | - **`src/config.py`**: Configuration management and YAML loading 45 | - **`src/docker_tools.py`**: Docker operations (build, test, push) using python-on-whales 46 | - **`base_config.yml`**: Shared configuration (namespace, platforms, Docker settings) 47 | 48 | ### Image Structure 49 | Each image lives in its own directory with: 50 | - **Single-version images**: `image/Dockerfile` + `image/config.yml` 51 | - **Multi-version images**: `image/VERSION/Dockerfile` + `image/config.yml` 52 | 53 | Build context is always the parent image directory, even for subdirectory Dockerfiles. 54 | 55 | ### Configuration Schema 56 | ```yaml 57 | # image/config.yml 58 | platforms: &platforms # Optional: override base platforms 59 | - linux/amd64 60 | - linux/arm64 61 | test_config: &test_config 62 | volume: "localdir:/container/path" # Optional: mount for tests 63 | cmd: # Test commands to verify installation 64 | - "tool --version" 65 | build_args: &build_args # Optional: Docker build arguments 66 | TOOL_VERSION: "1.2.3" 67 | versions: 68 | "version_name": 69 | platforms: *platforms 70 | build_args: *build_args 71 | test_config: *test_config 72 | ``` 73 | 74 | ### CI/CD Matrix Logic 75 | The build system intelligently determines which images to build: 76 | - **PR**: Only builds images with modified files 77 | - **Master merge**: Builds modified images → pushes as `latest-IMAGE` tags 78 | - **Tag release**: Builds ALL images → pushes with version tags 79 | - **Nightly**: Builds ALL images → pushes as `nightly-IMAGE` tags 80 | 81 | Files in `excluded_files` list don't trigger builds: `.gitignore`, `CHANGELOG.md`, `README.md`, `.github/dependabot.yml`, `.github/copilot-instructions.md` 82 | 83 | ### Available Images 84 | - **aws**: AWS CLI, Terraform, Kubectl, Helm, Python 85 | - **azure**: Azure CLI, Terraform, Kubectl, Helm, Python 86 | - **chrome**: Chromium + Node.js LTS 87 | - **cloudsploit**: Aquasecurity's Cloudsploit Scanner 88 | - **dind**: Docker-in-Docker + AWS/Azure CLI 89 | - **golang**: Go + AWS CLI, Gitleaks, GolangCI-Lint, tools 90 | - **java**: Java 17/21 + AWS CLI, Maven, tools 91 | - **node**: Node.js + AWS CLI 92 | - **php**: PHP 8.1/8.2/8.3/8.4 + Composer, Blackfire, AWS CLI 93 | - **platformsh**: Platform.sh CLI 94 | - **python**: Python 3.10-3.14 + pip, pipenv 95 | - **scaleway**: Scaleway CLI + Terraform, Kubectl, Helm 96 | - **sonar**: SonarQube Scanner 97 | 98 | ### Multi-Architecture Support 99 | - Default: `linux/amd64` 100 | - Many images support: `linux/amd64` + `linux/arm64` 101 | - Uses Docker Buildx with multi-platform builds 102 | 103 | ## Dependencies 104 | - **Python 3.11** with pipenv 105 | - **Key packages**: python-on-whales (Docker API), click (CLI), pyyaml, gitpython, pydantic 106 | 107 | ## Registry Publishing 108 | Images published to: 109 | - **Docker Hub**: `ekino/ci-{IMAGE}:{TAG}` 110 | - **GitHub Packages**: `ghcr.io/ekino/ci-{IMAGE}:{TAG}` 111 | 112 | ## Important Development Notes 113 | - Build context for subdirectory Dockerfiles is always the parent image directory 114 | - Volume mounting in tests only needs directory name (full path built by script) 115 | - CHANGELOG.md follows chronological format with `YYYY-MM-DD` dates 116 | - Commit messages use pattern: `(): ` 117 | - When adding images, update `.github/dependabot.yml` for automatic base image updates 118 | - when testing a docker image we must start rancher-desktop manually. Before running a command using docker, make sure it's running using "docker ps" 119 | -------------------------------------------------------------------------------- /php/test.php: -------------------------------------------------------------------------------- 1 | 7 | */ 8 | class Logger 9 | { 10 | public function __construct(private mixed $stdOut, private mixed $stdErr) {} 11 | 12 | /** 13 | * Closes the opened streams. 14 | */ 15 | public function __destruct() 16 | { 17 | fclose($this->stdOut); 18 | fclose($this->stdErr); 19 | } 20 | 21 | /** 22 | * Logs the given message as info. 23 | */ 24 | public function info(string $message, bool $appendBreakingLine = true): void 25 | { 26 | fwrite($this->stdOut, sprintf("\033[36m%s\033[39m%s", $message, $appendBreakingLine ? "\n" : "")); 27 | } 28 | 29 | /** 30 | * Logs the given message as success. 31 | */ 32 | public function success(string $message, bool $appendBreakingLine = true): void 33 | { 34 | fwrite($this->stdOut, sprintf("\033[32m%s\033[39m%s", $message, $appendBreakingLine ? "\n" : "")); 35 | } 36 | 37 | /** 38 | * Logs the given message as failure. 39 | */ 40 | public function failure(string $message, bool $appendBreakingLine = true): void 41 | { 42 | fwrite($this->stdErr, sprintf("\033[31m%s\033[39m%s", $message, $appendBreakingLine ? "\n" : "")); 43 | } 44 | } 45 | 46 | /** 47 | * Checks the PHP installation. 48 | * 49 | * @author Rémi Marseille 50 | */ 51 | class Checker 52 | { 53 | public function __construct(private Logger $logger, private int $exitStatus = 0) {} 54 | 55 | /** 56 | * Checks the PHP installation. 57 | */ 58 | public function check(): int 59 | { 60 | $this->logger->info(<<<"EOF" 61 | _ _ 62 | ___| | _(_)_ __ ___ 63 | / _ \ |/ / | '_ \ / _ \ 64 | | __/ <| | | | | (_) | 65 | \___|_|\_\_|_| |_|\___/ 66 | ____ _ _ ____ ____ _ _ 67 | | _ \| | | | _ \ / ___| |__ ___ ___| | _____ _ __ 68 | | |_) | |_| | |_) | | | | '_ \ / _ \/ __| |/ / _ \ '__| 69 | | __/| _ | __/ | |___| | | | __/ (__| < __/ | 70 | |_| |_| |_|_| \____|_| |_|\___|\___|_|\_\___|_| 71 | 72 | EOF 73 | ); 74 | 75 | $this->logger->info(sprintf('> PHP version: %s', PHP_VERSION)); 76 | 77 | $this->checkI18n(); 78 | $this->checkExtensions(); 79 | $this->checkIniConfig(); 80 | 81 | $this->logger->info(''); 82 | 83 | if ($this->exitStatus === 0) { 84 | $this->logger->success('Good job, all checks are ok!'); 85 | } else { 86 | $this->logger->failure('Please fix issues ;).'); 87 | } 88 | 89 | return $this->exitStatus; 90 | } 91 | 92 | private function checkI18n(): void 93 | { 94 | $this->logger->info('> Locale functionality: ', false); 95 | 96 | $errors = []; 97 | $testCases = [ 98 | ['expected' => 'Français (France)', 'locale' => 'fr-FR', 'displayLocale' => 'fr'], 99 | ['expected' => 'French (France)', 'locale' => 'fr-FR', 'displayLocale' => 'en'], 100 | ['expected' => 'Französisch (Frankreich)', 'locale' => 'fr-FR', 'displayLocale' => 'de'], 101 | ]; 102 | 103 | foreach ($testCases as $testCase) { 104 | $translation = ucfirst(\Locale::getDisplayName($testCase['locale'], $testCase['displayLocale'])); 105 | 106 | if ($testCase['expected'] === $translation) { 107 | continue; 108 | } 109 | 110 | $errors[] = sprintf('Expected: "%s" => Given: "%s"', $testCase['expected'], $translation); 111 | } 112 | 113 | if ($errors) { 114 | $this->logger->failure(sprintf("\n%s", implode("\n", $errors))); 115 | 116 | ++$this->exitStatus; 117 | } else { 118 | $this->logger->success('Locale functionality validated!'); 119 | } 120 | } 121 | 122 | /** 123 | * Checks PHP extensions. 124 | */ 125 | private function checkExtensions(): void 126 | { 127 | $this->logger->info('> PHP extensions: ', false); 128 | 129 | $errors = []; 130 | $commonExtensionsExpected = [ 131 | 'apcu', 'bcmath', 'blackfire', 'exif', 'gd', 'iconv', 'intl', 'mbstring', 'memcached', 'mysqli', 'pcntl', 132 | 'pcov', 'pdo_mysql', 'pdo_pgsql', 'pgsql', 'redis', 'soap', 'sockets', 'ssh2', 'xdebug', 'xsl', 'Zend OPcache', 133 | 'zip', 134 | ]; 135 | $unreadyNextMajorExtensions = ['ssh2']; 136 | $extensionsExpected = \PHP_VERSION_ID < 80000 ? $commonExtensionsExpected 137 | : array_diff($commonExtensionsExpected, $unreadyNextMajorExtensions); 138 | 139 | $extensionsMissing = array_filter($extensionsExpected, function ($extension) { 140 | return !extension_loaded($extension); 141 | }); 142 | 143 | if ($extensionsMissing) { 144 | $errors[] = sprintf(' >> missing "%s"', implode('", "', $extensionsMissing)); 145 | } 146 | 147 | if (false === iconv("UTF-8", "UTF-8//IGNORE", "This is the Euro symbol '\''€'\''.")) { 148 | $errors[] = ' >> "iconv" seems to be broken'; 149 | } 150 | 151 | if ($errors) { 152 | $this->logger->failure(sprintf("\n%s", implode("\n", $errors))); 153 | 154 | ++$this->exitStatus; 155 | } else { 156 | $this->logger->success(sprintf('ok! ("%s")', implode('", "', $extensionsExpected))); 157 | } 158 | } 159 | 160 | /** 161 | * Checks ini configuration. 162 | */ 163 | private function checkIniConfig(): void 164 | { 165 | $this->logger->info('> PHP configuration: ', false); 166 | 167 | $errors = []; 168 | 169 | if (($value = ini_get('date.timezone')) !== 'UTC') { 170 | $errors[] = sprintf(' >> "date.timezone" should be equal to "UTC", got "%s"', $value); 171 | } 172 | 173 | $value = ini_get('short_open_tag'); 174 | 175 | if (!in_array($value, ['', 'Off', 0])) { 176 | $errors[] = sprintf(' >> "short_open_tag" should be equal to "Off", got "%s"', $value); 177 | } 178 | 179 | if ($errors) { 180 | $this->logger->failure(sprintf("\n%s", implode("\n", $errors))); 181 | 182 | ++$this->exitStatus; 183 | } else { 184 | $this->logger->success('ok!'); 185 | } 186 | } 187 | } 188 | 189 | if (in_array('-s', $argv) || in_array('--silent', $argv)) { 190 | $stdOut = fopen('php://memory', 'w'); 191 | $stdErr = fopen('php://memory', 'w'); 192 | } else { 193 | $stdOut = STDOUT; 194 | $stdErr = STDERR; 195 | } 196 | 197 | $checker = new Checker(new Logger($stdOut, $stdErr)); 198 | 199 | exit($checker->check()); 200 | -------------------------------------------------------------------------------- /.github/copilot-instructions.md: -------------------------------------------------------------------------------- 1 | # Docker BuildBox Project - Copilot Instructions 2 | 3 | ## Project Overview 4 | 5 | This is the **Docker BuildBox** project by Ekino - a comprehensive collection of Docker images designed for CI/CD pipelines, particularly GitLab CI. The project provides standardized build environments for various programming languages and cloud tools. 6 | 7 | **CRITICAL**: These images are **NOT for production use** - they are specifically designed for CI/CD environments. 8 | 9 | ## Project Structure 10 | 11 | ### Core Files 12 | 13 | - `image_builder.py` - Main build script for individual images 14 | - `matrix_generator.py` - Generates build matrix for CI/CD (determines which images to build based on file changes) 15 | - `base_config.yml` - Base configuration shared across all images 16 | - `Pipfile` / `Pipfile.lock` - Python dependencies (pipenv-based) 17 | - `src/` - Core Python modules: 18 | - `config.py` - Configuration loading and management 19 | - `docker_tools.py` - Docker build/test/push utilities 20 | 21 | ### Image Structure 22 | 23 | Each image has its own directory with: 24 | 25 | - `config.yml` - Image-specific configuration 26 | - `Dockerfile` - Single-version images OR 27 | - `{version}/Dockerfile` - Multi-version images (e.g., `java/17/Dockerfile`, `java/21/Dockerfile`) 28 | 29 | ### Available Images 30 | 31 | 1. **AWS** (`aws/`) - AWS CLI, Terraform, Kubectl, Helm, Python 32 | 2. **Azure** (`azure/`) - Azure CLI, Terraform, Kubectl, Helm, Python 33 | 3. **Chrome** (`chrome/`) - Chromium browser + Node.js LTS 34 | 4. **Cloudsploit** (`cloudsploit/`) - Aquasecurity's Cloudsploit Scanner 35 | 5. **DIND** (`dind/`) - Docker-in-Docker with AWS/Azure CLI 36 | 6. **Golang** (`golang/`) - Go + AWS CLI, Gitleaks, GolangCI-Lint, etc. 37 | 7. **Java** (`java/`) - Java 17/21 + AWS CLI, Maven, tools 38 | 8. **Node** (`node/`) - Node.js + AWS CLI 39 | 9. **PHP** (`php/`) - PHP 8.1/8.2/8.3 + Composer, Blackfire, AWS CLI 40 | 10. **Platform.sh** (`platformsh/`) - Platform.sh CLI 41 | 11. **Python** (`python/`) - Python 3.10-3.14 + pip, pipenv 42 | 12. **Scaleway** (`scaleway/`) - Scaleway CLI + Terraform, Kubectl, Helm 43 | 13. **SonarQube** (`sonar/`) - SonarQube Scanner 44 | 45 | ## Configuration Schema 46 | 47 | ### base_config.yml 48 | 49 | ```yaml 50 | namespace: ekino # Docker registry namespace 51 | DOCKER_SOCK_PATH: unix://var/run/docker.sock 52 | DOCKER_TIMEOUT: 600 53 | base_platforms: &base_platforms 54 | - linux/amd64 # Multi-arch support 55 | ``` 56 | 57 | ### Image config.yml 58 | 59 | ```yaml 60 | versions: 61 | "version_name": 62 | platforms: # Optional: override base platforms 63 | - linux/amd64 64 | - linux/arm64 65 | test_config: 66 | volume: "localdir:/container/path" # Optional: mount for tests 67 | cmd: # Test commands to verify installation 68 | - "command --version" 69 | - "another-tool --help" 70 | build_args: # Optional: Docker build arguments 71 | - "ARG_NAME=value" 72 | ``` 73 | 74 | ## Build and Test System 75 | 76 | ### Local Development 77 | 78 | ```bash 79 | # Setup environment 80 | pipenv install 81 | pipenv shell 82 | 83 | # Build specific image/version 84 | python image_builder.py build --image IMAGE_NAME --version VERSION [--debug] 85 | 86 | # Examples 87 | python image_builder.py build --image java --version 17 88 | python image_builder.py build --image aws --version 1 --debug 89 | ``` 90 | 91 | ### CI/CD Workflow (GitHub Actions) 92 | 93 | 1. **PR**: Only builds images with modified files 94 | 2. **Merge to master**: Builds modified images → pushes as `latest-IMAGE` tags 95 | 3. **Tag release**: Builds ALL images → pushes with version tags 96 | 4. **Nightly**: Builds ALL images → pushes as `nightly-IMAGE` tags 97 | 98 | The `matrix_generator.py` determines which images to build by: 99 | 100 | - Analyzing git diff against origin/master 101 | - Filtering excluded files (README.md, CHANGELOG.md, etc.) 102 | - Building affected image directories only 103 | 104 | ### Multi-Architecture Support 105 | 106 | - Default: `linux/amd64` 107 | - Many images support: `linux/amd64` + `linux/arm64` 108 | - Dockerfiles use multi-stage builds with architecture-specific stages 109 | 110 | ## Development Guidelines 111 | 112 | ### Adding New Images 113 | 114 | 1. Create directory: `my-image/` 115 | 2. Create `my-image/config.yml` with version configuration 116 | 3. Create `my-image/Dockerfile` OR `my-image/VERSION/Dockerfile` 117 | 4. Add dependabot entry in `.github/dependabot.yml` 118 | 5. Test locally: `python image_builder.py build --image my-image --version VERSION` 119 | 120 | ### Multi-Version Images 121 | 122 | - Use subdirectories: `image/1.0/Dockerfile`, `image/2.0/Dockerfile` 123 | - Build context remains the main image directory 124 | - Use `COPY/ADD` paths relative to image root directory 125 | 126 | ### Commit Message Format 127 | 128 | Pattern: `(): ` 129 | 130 | - `feat`: New feature 131 | - `fix`: Bug fix 132 | - `chore`: Maintenance/routine task 133 | 134 | ### Managing CHANGELOG.md 135 | 136 | The `CHANGELOG.md` file tracks all changes to the Docker images across releases. It follows a chronological format organized by date. 137 | 138 | **Format Structure**: 139 | 140 | ```markdown 141 | ## YYYY-MM-DD 142 | 143 | - ImageName: description of changes 144 | - AnotherImage: description of changes 145 | ``` 146 | 147 | **Guidelines**: 148 | 149 | - **Date Format**: Use `YYYY-MM-DD` format for release dates with dashes underneath 150 | - **Entry Format**: `* ImageName: description of change` 151 | - **Order**: Most recent entries at the top 152 | - **Sorting**: Within each date section, sort entries alphabetically by image name (AWS, Azure, Chrome, etc.) 153 | - **Scope**: Include all significant changes (version updates, new tools, deprecations) 154 | - **Clarity**: Be specific about what changed (e.g., "updating kubectl from 1.25 to 1.27") 155 | 156 | **Important Notes**: 157 | 158 | - CHANGELOG.md is in the excluded files list - changes to it don't trigger CI builds 159 | - Update the changelog when making changes to any image 160 | - Use past tense for descriptions ("updated", "added", "removed") 161 | - Group related changes under the same date 162 | - Include deprecation notices for images being removed 163 | 164 | **Example Entry**: 165 | 166 | ```markdown 167 | ## 2025-05-31 168 | 169 | - AWS: updating kubectl from 1.27 to 1.28 170 | - Java: deprecating version 11, adding version 22 171 | - Node: removing node 18, now EoL 172 | ``` 173 | 174 | ## Docker Registry 175 | 176 | Images are published to: 177 | 178 | - **Docker Hub**: `https://hub.docker.com/r/ekino/ci-{IMAGE}/tags` 179 | - **GitHub Packages**: `https://github.com/orgs/ekino/packages/container/package/ci-{IMAGE}` 180 | 181 | ## Dependencies 182 | 183 | - **Python 3.11** (pipenv environment) 184 | - **Key packages**: 185 | - `python-on-whales` - Docker Python API 186 | - `click` - CLI framework 187 | - `pyyaml` - YAML parsing 188 | - `gitpython` - Git operations 189 | - `pydantic` - Data validation 190 | 191 | ## Testing 192 | 193 | Each image runs tests defined in `config.yml` → `test_config.cmd` to verify: 194 | 195 | - Tool installations 196 | - Version checks 197 | - Basic functionality 198 | 199 | Tests run in built containers with optional volume mounts for test data. 200 | 201 | ## Important Notes 202 | 203 | - **Build context** for subdirectory Dockerfiles is always the parent image directory 204 | - **Excluded files** don't trigger builds: .gitignore, CHANGELOG.md, README.md, .github/dependabot.yml 205 | - **Volume mounting** in tests only needs directory name (full path built by script) 206 | - **Multi-arch** builds use architecture-specific build arguments and stages 207 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | # Global 4 | - package-ecosystem: "github-actions" 5 | directory: "/" 6 | schedule: 7 | interval: "weekly" 8 | - package-ecosystem: "pip" 9 | directory: "/" 10 | schedule: 11 | interval: "weekly" 12 | # AWS 13 | - package-ecosystem: "docker" 14 | directory: "/aws" 15 | schedule: 16 | interval: "weekly" 17 | labels: 18 | - "dependencies" 19 | - "docker" 20 | - "aws" 21 | ignore: 22 | - dependency-name: "*" 23 | update-types: ["version-update:semver-major"] 24 | # Azure 25 | - package-ecosystem: "docker" 26 | directory: "/azure" 27 | schedule: 28 | interval: "weekly" 29 | labels: 30 | - "dependencies" 31 | - "docker" 32 | - "azure" 33 | ignore: 34 | - dependency-name: "*" 35 | update-types: ["version-update:semver-major"] 36 | # Chrome 37 | - package-ecosystem: "docker" 38 | directory: "/chrome" 39 | schedule: 40 | interval: "weekly" 41 | labels: 42 | - "dependencies" 43 | - "docker" 44 | - "chrome" 45 | ignore: 46 | - dependency-name: "*" 47 | update-types: ["version-update:semver-major"] 48 | # Claude 49 | - package-ecosystem: "docker" 50 | directory: "/claude" 51 | schedule: 52 | interval: "weekly" 53 | labels: 54 | - "dependencies" 55 | - "docker" 56 | - "claude" 57 | ignore: 58 | - dependency-name: "*" 59 | update-types: ["version-update:semver-major"] 60 | # Cloudsploit 61 | - package-ecosystem: "docker" 62 | directory: "/cloudsploit" 63 | schedule: 64 | interval: "weekly" 65 | labels: 66 | - "dependencies" 67 | - "docker" 68 | - "cloudsploit" 69 | ignore: 70 | - dependency-name: "*" 71 | update-types: ["version-update:semver-major"] 72 | - package-ecosystem: "npm" 73 | directory: "/cloudsploit" 74 | schedule: 75 | interval: "weekly" 76 | labels: 77 | - "dependencies" 78 | - "npm" 79 | - "cloudsploit" 80 | ignore: 81 | - dependency-name: "*" 82 | update-types: ["version-update:semver-major"] 83 | # DIND 84 | - package-ecosystem: "docker" 85 | directory: "/dind" 86 | schedule: 87 | interval: "weekly" 88 | labels: 89 | - "dependencies" 90 | - "docker" 91 | - "dind" 92 | ignore: 93 | - dependency-name: "*" 94 | update-types: ["version-update:semver-major"] 95 | - package-ecosystem: "pip" 96 | directory: "/dind" 97 | schedule: 98 | interval: "weekly" 99 | labels: 100 | - "dependencies" 101 | - "pip" 102 | - "dind" 103 | # Golang 104 | - package-ecosystem: "docker" 105 | directory: "/golang/1.24" 106 | schedule: 107 | interval: "weekly" 108 | labels: 109 | - "dependencies" 110 | - "docker" 111 | - "golang" 112 | ignore: 113 | - dependency-name: "*" 114 | update-types: ["version-update:semver-major", "version-update:semver-minor"] 115 | - package-ecosystem: "docker" 116 | directory: "/golang/1.25" 117 | schedule: 118 | interval: "weekly" 119 | labels: 120 | - "dependencies" 121 | - "docker" 122 | - "golang" 123 | ignore: 124 | - dependency-name: "*" 125 | update-types: ["version-update:semver-major", "version-update:semver-minor"] 126 | 127 | # Java 128 | - package-ecosystem: "docker" 129 | directory: "/java/17" 130 | schedule: 131 | interval: "weekly" 132 | labels: 133 | - "dependencies" 134 | - "docker" 135 | - "java" 136 | ignore: 137 | - dependency-name: "*" 138 | update-types: ["version-update:semver-major"] 139 | - package-ecosystem: "docker" 140 | directory: "/java/21" 141 | schedule: 142 | interval: "weekly" 143 | labels: 144 | - "dependencies" 145 | - "docker" 146 | - "java" 147 | ignore: 148 | - dependency-name: "*" 149 | update-types: ["version-update:semver-major"] 150 | # Node 151 | - package-ecosystem: "docker" 152 | directory: "/node" 153 | schedule: 154 | interval: "weekly" 155 | labels: 156 | - "dependencies" 157 | - "docker" 158 | - "node" 159 | ignore: 160 | - dependency-name: "*" 161 | update-types: ["version-update:semver-major"] 162 | # Php 163 | - package-ecosystem: "docker" 164 | directory: "/php/8.1" 165 | schedule: 166 | interval: "weekly" 167 | labels: 168 | - "dependencies" 169 | - "docker" 170 | - "php" 171 | ignore: 172 | - dependency-name: "*" 173 | update-types: ["version-update:semver-major", "version-update:semver-minor"] 174 | - package-ecosystem: "docker" 175 | directory: "/php/8.2" 176 | schedule: 177 | interval: "weekly" 178 | labels: 179 | - "dependencies" 180 | - "docker" 181 | - "php" 182 | ignore: 183 | - dependency-name: "*" 184 | update-types: [ "version-update:semver-major", "version-update:semver-minor" ] 185 | - package-ecosystem: "docker" 186 | directory: "/php/8.3" 187 | schedule: 188 | interval: "weekly" 189 | labels: 190 | - "dependencies" 191 | - "docker" 192 | - "php" 193 | ignore: 194 | - dependency-name: "*" 195 | update-types: [ "version-update:semver-major", "version-update:semver-minor" ] 196 | - package-ecosystem: "docker" 197 | directory: "/php/8.4" 198 | schedule: 199 | interval: "weekly" 200 | labels: 201 | - "dependencies" 202 | - "docker" 203 | - "php" 204 | ignore: 205 | - dependency-name: "*" 206 | update-types: [ "version-update:semver-major", "version-update:semver-minor" ] 207 | # Python 208 | - package-ecosystem: "docker" 209 | directory: "/python/3.10" 210 | schedule: 211 | interval: "weekly" 212 | labels: 213 | - "dependencies" 214 | - "docker" 215 | - "python" 216 | ignore: 217 | - dependency-name: "*" 218 | update-types: ["version-update:semver-major", "version-update:semver-minor"] 219 | - package-ecosystem: "docker" 220 | directory: "/python/3.11" 221 | schedule: 222 | interval: "weekly" 223 | labels: 224 | - "dependencies" 225 | - "docker" 226 | - "python" 227 | ignore: 228 | - dependency-name: "*" 229 | update-types: ["version-update:semver-major", "version-update:semver-minor"] 230 | - package-ecosystem: "docker" 231 | directory: "/python/3.12" 232 | schedule: 233 | interval: "weekly" 234 | labels: 235 | - "dependencies" 236 | - "docker" 237 | - "python" 238 | ignore: 239 | - dependency-name: "*" 240 | update-types: ["version-update:semver-major", "version-update:semver-minor"] 241 | - package-ecosystem: "docker" 242 | directory: "/python/3.13" 243 | schedule: 244 | interval: "weekly" 245 | labels: 246 | - "dependencies" 247 | - "docker" 248 | - "python" 249 | ignore: 250 | - dependency-name: "*" 251 | update-types: ["version-update:semver-major", "version-update:semver-minor"] 252 | - package-ecosystem: "docker" 253 | directory: "/python/3.14" 254 | schedule: 255 | interval: "weekly" 256 | labels: 257 | - "dependencies" 258 | - "docker" 259 | - "python" 260 | ignore: 261 | - dependency-name: "*" 262 | update-types: ["version-update:semver-major", "version-update:semver-minor"] 263 | # Scaleway 264 | - package-ecosystem: "docker" 265 | directory: "/scaleway" 266 | schedule: 267 | interval: "weekly" 268 | labels: 269 | - "dependencies" 270 | - "docker" 271 | - "scaleway" 272 | ignore: 273 | - dependency-name: "*" 274 | update-types: ["version-update:semver-major"] 275 | # Sonar 276 | - package-ecosystem: "docker" 277 | directory: "/sonar" 278 | schedule: 279 | interval: "weekly" 280 | labels: 281 | - "dependencies" 282 | - "docker" 283 | - "sonar" 284 | ignore: 285 | - dependency-name: "*" 286 | update-types: ["version-update:semver-major"] 287 | # Upsun 288 | - package-ecosystem: "docker" 289 | directory: "/upsun" 290 | schedule: 291 | interval: "weekly" 292 | labels: 293 | - "dependencies" 294 | - "docker" 295 | - "upsun" 296 | ignore: 297 | - dependency-name: "*" 298 | update-types: ["version-update:semver-major"] 299 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Build Status](https://github.com/ekino/docker-buildbox/actions/workflows/build.yml/badge.svg?branch=master)](https://github.com/ekino/docker-buildbox/actions?query=branch%3Amaster) 2 | 3 | # BuildBox 4 | 5 | The repository provides a complete set of build tools for web developers. **These 6 | images MUST NOT be used in production**. The targeted usage of those images is GitlabCI. 7 | 8 | ## Versions 9 | 10 | Please review the [CHANGELOG.md](CHANGELOG.md) file for versions per tag. 11 | 12 | ## Release Process 13 | 14 | The project follows a monthly release schedule with releases happening on the last day of each month. All changes are documented in the [CHANGELOG.md](CHANGELOG.md) file. 15 | 16 | ### CHANGELOG.md Format 17 | 18 | The changelog follows a chronological format organized by release date: 19 | 20 | ```markdown 21 | ## YYYY-MM-DD 22 | 23 | - ImageName: description of changes 24 | - AnotherImage: description of changes 25 | ``` 26 | 27 | **Guidelines for updating CHANGELOG.md:** 28 | 29 | - **Date Format**: Use `YYYY-MM-DD` format for release dates (always the last day of the month) 30 | - **Entry Format**: `* ImageName: description of change` 31 | - **Order**: Most recent entries at the top 32 | - **Sorting**: Within each date section, sort entries alphabetically by image name 33 | - **Scope**: Include all significant changes (version updates, new tools, deprecations) 34 | - **Clarity**: Be specific about what changed (e.g., "updating kubectl from 1.25 to 1.27") 35 | 36 | **Important Notes:** 37 | - CHANGELOG.md is in the excluded files list - changes to it don't trigger CI builds 38 | - Update the changelog when making changes to any image 39 | - Use past tense for descriptions ("updated", "added", "removed") 40 | - Group related changes under the same release date 41 | - Include deprecation notices for images being removed 42 | 43 | ## Testing 44 | 45 | Each box is tested and built using GitHub Actions. 46 | 47 | CI workflow: 48 | - PR: only images with modified files are built. 49 | - Merge to master: only images with modified files are built and pushed to the docker registry with the tag `latest-IMAGE` 50 | - TAG: all images are built and pushed to the docker registry 51 | - Nightly: all images are built and pushed to the docker registry with the tag `nightly-IMAGE` 52 | 53 | ### Local testing 54 | 55 | To contribute you will need docker, docker-buildx, python3.6 and pipenv (installed by `pip install pipenv`). 56 | 57 | - Clone the repo 58 | - Create your pipenv environnement 59 | > pipenv install 60 | - Load your pipenv 61 | > pipenv shell 62 | - Run the script 63 | > python image_builder.py build --image image --version version 64 | 65 | ``` bash 66 | $ python image_builder.py build --help 67 | Usage: image_builder.py build [OPTIONS] 68 | 69 | Options: 70 | --image TEXT image to build 71 | --version TEXT image version 72 | -d, --debug debug 73 | --help Show this message and exit. 74 | ``` 75 | 76 | ``` bash 77 | $ python image_builder.py build --image java --version 11 78 | > Building: ekino/ci-java:11-latest 79 | Build succesfull 80 | > Testing ekino/ci-java:11-latest 81 | Tests successful 82 | ``` 83 | 84 | ## Contribution 85 | 86 | ### Commit message 87 | Please follow the following pattern in your commit message `(): `. 88 | `` can be either `chore` (for a routine/maintenance task), `fix` (for a bugfix) or `feat` (for a new feature). 89 | 90 | ### Adding your image to the build box 91 | 92 | Create a directory named after your image and corresponding Dockerfile in it. Then create a `config.yml` in the same directory according to this schema: 93 | 94 | ```yaml 95 | versions: # List all the available versions 96 | "1.0": # The version of your image. This must not change often, so try using major version if possible, or else minor. 97 | test_config: 98 | volume: ... # docker volume if needed, format: localdir:/path/to/mount 99 | cmd: [...] # shell commands run to be sure tools are well installed 100 | build_args: [...] # If ARG are defined in Dockerfile 101 | ``` 102 | 103 | Do not forget to add an entry in `.github/dependabot.yml` too if you want it to update your image. 104 | 105 | **If you want multiple Dockerfiles for one image**, you need to use subdirectories named after the version + create one dependabot rule / subdirectory for dependabot to update your base docker images correctly. 106 | 107 | **When using subdirectories**, keep in mind that the build context still is the main image folder, so COPY/ADD your files from here. 108 | 109 | **Volume mounting** for test configuration only need the directory name as full local path is build by the script. 110 | 111 | ## Available images 112 | 113 | ### AWS 114 | - https://hub.docker.com/r/ekino/ci-aws/tags 115 | - https://github.com/orgs/ekino/packages/container/package/ci-aws 116 | 117 | Contains AWS Cli, Terraform, Kubectl, Helm, Python & misc tools 118 | 119 | ### Azure 120 | - https://hub.docker.com/r/ekino/ci-azure/tags 121 | - https://github.com/orgs/ekino/packages/container/package/ci-azure 122 | 123 | Contains Azure Cli, Terraform, Kubectl, Helm, Python & misc tools 124 | 125 | ### Chrome 126 | - https://hub.docker.com/r/ekino/ci-chrome/tags 127 | - https://github.com/orgs/ekino/packages/container/package/ci-chrome 128 | 129 | Contains Chromium browser and the latest Node LTS. 130 | 131 | ### Claude 132 | - https://hub.docker.com/r/ekino/ci-claude/tags 133 | - https://github.com/orgs/ekino/packages/container/package/ci-claude 134 | 135 | Contains Node.js 24 on Alpine Linux with Anthropic's Claude Code CLI tool installed globally. Runs under a dedicated `claude:claude` user for security. 136 | 137 | ### Cloudsploit 138 | - https://hub.docker.com/r/ekino/ci-cloudsploit/tags 139 | - https://github.com/orgs/ekino/packages/container/package/ci-cloudsploit 140 | 141 | Contains Aquasecurity's Cloudsploit Scanner. 142 | 143 | ### DIND 144 | - https://hub.docker.com/r/ekino/ci-dind/tags 145 | - https://github.com/orgs/ekino/packages/container/package/ci-dind 146 | 147 | Adds AWS Cli & Azure Cli to GitLab's dind image (to run docker in a GitLab runner). 148 | 149 | Use case: 150 | ```yaml 151 | # .gitlab-ci.yml 152 | test: 153 | image: ekino/ci-dind:latest 154 | services: 155 | - ekino/ci-dind:latest 156 | variables: 157 | DOCKER_TLS_CERTDIR: "" 158 | DOCKER_DRIVER: overlay2 159 | DOCKER_HOST: "tcp://ekino__ci-dind:2375" 160 | script: 161 | - docker ... 162 | ``` 163 | 164 | ### Golang 165 | - https://hub.docker.com/r/ekino/ci-golang/tags 166 | - https://github.com/orgs/ekino/packages/container/package/ci-golang 167 | 168 | Based upon official Golang image, contains AWS Cli, Gitleaks, GolangCI-Lint, go-mod-upgrade, go-swagger, go-mock, goimports, migrate, rsync and testfixtures. 169 | 170 | ### Java 171 | - https://hub.docker.com/r/ekino/ci-java/tags 172 | - https://github.com/orgs/ekino/packages/container/package/ci-java 173 | 174 | Contains AWS Cli, Maven, Graphviz, jq, psql and Java. 175 | 176 | ### Node 177 | - https://hub.docker.com/r/ekino/ci-node/tags 178 | - https://github.com/orgs/ekino/packages/container/package/ci-node 179 | 180 | Contains node (installed in the NODE_VERSION env var value) and AWS Cli. 181 | 182 | ### PHP 183 | - https://hub.docker.com/r/ekino/ci-php/tags 184 | - https://github.com/orgs/ekino/packages/container/package/ci-php 185 | 186 | Contains PHP (installed from official alpine in the PHP_VERSION env var value) within Blackfire, Composer, PHP CS Fixer, Security Checker and AWS Cli. 187 | 188 | About Blackfire, please read the official documentation to install the agent https://blackfire.io/docs/integrations/docker, then you should be able to profile a PHP script like this: 189 | 190 | ```bash 191 | docker exec -it -e BLACKFIRE_CLIENT_ID -e BLACKFIRE_CLIENT_TOKEN my-php-container blackfire run bin/console app:foo:bar 192 | ``` 193 | 194 | ### Python 195 | - https://hub.docker.com/r/ekino/ci-python/tags 196 | - https://github.com/orgs/ekino/packages/container/package/ci-python 197 | 198 | Contains Python with PIP and PIPENV. 199 | 200 | ### Scaleway 201 | - https://hub.docker.com/r/ekino/ci-scaleway/tags 202 | - https://github.com/orgs/ekino/packages/container/package/ci-scaleway 203 | 204 | Contains SCW Cli, Terraform, Kubectl, Helm, Python & misc tools 205 | 206 | 207 | ### SonarQube Scanner 208 | - https://hub.docker.com/r/ekino/ci-sonar/tags 209 | - https://github.com/orgs/ekino/packages/container/package/ci-sonar 210 | 211 | Contains SonarQube Scanner. 212 | 213 | ### Upsun 214 | - https://hub.docker.com/r/ekino/ci-upsun/tags 215 | - https://github.com/orgs/ekino/packages/container/package/ci-upsun 216 | 217 | Based on a Python image, contains both Upsun CLI and Platform.sh CLI, git and pipenv. 218 | -------------------------------------------------------------------------------- /Pipfile.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_meta": { 3 | "hash": { 4 | "sha256": "cc54b2b306e9a082763ed665e5d71211a0d7561c91e07f89deb825ffb7091774" 5 | }, 6 | "pipfile-spec": 6, 7 | "requires": { 8 | "python_version": "3.11" 9 | }, 10 | "sources": [ 11 | { 12 | "name": "pypi", 13 | "url": "https://pypi.org/simple", 14 | "verify_ssl": true 15 | } 16 | ] 17 | }, 18 | "default": { 19 | "annotated-types": { 20 | "hashes": [ 21 | "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", 22 | "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89" 23 | ], 24 | "markers": "python_version >= '3.8'", 25 | "version": "==0.7.0" 26 | }, 27 | "certifi": { 28 | "hashes": [ 29 | "sha256:0a816057ea3cdefcef70270d2c515e4506bbc954f417fa5ade2021213bb8f0c6", 30 | "sha256:30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3" 31 | ], 32 | "markers": "python_version >= '3.6'", 33 | "version": "==2025.4.26" 34 | }, 35 | "charset-normalizer": { 36 | "hashes": [ 37 | "sha256:005fa3432484527f9732ebd315da8da8001593e2cf46a3d817669f062c3d9ed4", 38 | "sha256:046595208aae0120559a67693ecc65dd75d46f7bf687f159127046628178dc45", 39 | "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7", 40 | "sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0", 41 | "sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7", 42 | "sha256:18dd2e350387c87dabe711b86f83c9c78af772c748904d372ade190b5c7c9d4d", 43 | "sha256:1b1bde144d98e446b056ef98e59c256e9294f6b74d7af6846bf5ffdafd687a7d", 44 | "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0", 45 | "sha256:1cad5f45b3146325bb38d6855642f6fd609c3f7cad4dbaf75549bf3b904d3184", 46 | "sha256:21b2899062867b0e1fde9b724f8aecb1af14f2778d69aacd1a5a1853a597a5db", 47 | "sha256:24498ba8ed6c2e0b56d4acbf83f2d989720a93b41d712ebd4f4979660db4417b", 48 | "sha256:25a23ea5c7edc53e0f29bae2c44fcb5a1aa10591aae107f2a2b2583a9c5cbc64", 49 | "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b", 50 | "sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8", 51 | "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff", 52 | "sha256:36b31da18b8890a76ec181c3cf44326bf2c48e36d393ca1b72b3f484113ea344", 53 | "sha256:3c21d4fca343c805a52c0c78edc01e3477f6dd1ad7c47653241cf2a206d4fc58", 54 | "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e", 55 | "sha256:43e0933a0eff183ee85833f341ec567c0980dae57c464d8a508e1b2ceb336471", 56 | "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148", 57 | "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a", 58 | "sha256:50bf98d5e563b83cc29471fa114366e6806bc06bc7a25fd59641e41445327836", 59 | "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e", 60 | "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63", 61 | "sha256:5bf4545e3b962767e5c06fe1738f951f77d27967cb2caa64c28be7c4563e162c", 62 | "sha256:6333b3aa5a12c26b2a4d4e7335a28f1475e0e5e17d69d55141ee3cab736f66d1", 63 | "sha256:65c981bdbd3f57670af8b59777cbfae75364b483fa8a9f420f08094531d54a01", 64 | "sha256:68a328e5f55ec37c57f19ebb1fdc56a248db2e3e9ad769919a58672958e8f366", 65 | "sha256:6a0289e4589e8bdfef02a80478f1dfcb14f0ab696b5a00e1f4b8a14a307a3c58", 66 | "sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5", 67 | "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c", 68 | "sha256:6fc1f5b51fa4cecaa18f2bd7a003f3dd039dd615cd69a2afd6d3b19aed6775f2", 69 | "sha256:70f7172939fdf8790425ba31915bfbe8335030f05b9913d7ae00a87d4395620a", 70 | "sha256:721c76e84fe669be19c5791da68232ca2e05ba5185575086e384352e2c309597", 71 | "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b", 72 | "sha256:75d10d37a47afee94919c4fab4c22b9bc2a8bf7d4f46f87363bcf0573f3ff4f5", 73 | "sha256:76af085e67e56c8816c3ccf256ebd136def2ed9654525348cfa744b6802b69eb", 74 | "sha256:770cab594ecf99ae64c236bc9ee3439c3f46be49796e265ce0cc8bc17b10294f", 75 | "sha256:7a6ab32f7210554a96cd9e33abe3ddd86732beeafc7a28e9955cdf22ffadbab0", 76 | "sha256:7c48ed483eb946e6c04ccbe02c6b4d1d48e51944b6db70f697e089c193404941", 77 | "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0", 78 | "sha256:8075c35cd58273fee266c58c0c9b670947c19df5fb98e7b66710e04ad4e9ff86", 79 | "sha256:8272b73e1c5603666618805fe821edba66892e2870058c94c53147602eab29c7", 80 | "sha256:82d8fd25b7f4675d0c47cf95b594d4e7b158aca33b76aa63d07186e13c0e0ab7", 81 | "sha256:844da2b5728b5ce0e32d863af26f32b5ce61bc4273a9c720a9f3aa9df73b1455", 82 | "sha256:8755483f3c00d6c9a77f490c17e6ab0c8729e39e6390328e42521ef175380ae6", 83 | "sha256:915f3849a011c1f593ab99092f3cecfcb4d65d8feb4a64cf1bf2d22074dc0ec4", 84 | "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0", 85 | "sha256:982bb1e8b4ffda883b3d0a521e23abcd6fd17418f6d2c4118d257a10199c0ce3", 86 | "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1", 87 | "sha256:9cbfacf36cb0ec2897ce0ebc5d08ca44213af24265bd56eca54bee7923c48fd6", 88 | "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981", 89 | "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c", 90 | "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980", 91 | "sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645", 92 | "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7", 93 | "sha256:aaf27faa992bfee0264dc1f03f4c75e9fcdda66a519db6b957a3f826e285cf12", 94 | "sha256:b2680962a4848b3c4f155dc2ee64505a9c57186d0d56b43123b17ca3de18f0fa", 95 | "sha256:b2d318c11350e10662026ad0eb71bb51c7812fc8590825304ae0bdd4ac283acd", 96 | "sha256:b33de11b92e9f75a2b545d6e9b6f37e398d86c3e9e9653c4864eb7e89c5773ef", 97 | "sha256:b3daeac64d5b371dea99714f08ffc2c208522ec6b06fbc7866a450dd446f5c0f", 98 | "sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2", 99 | "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d", 100 | "sha256:c72fbbe68c6f32f251bdc08b8611c7b3060612236e960ef848e0a517ddbe76c5", 101 | "sha256:c9e36a97bee9b86ef9a1cf7bb96747eb7a15c2f22bdb5b516434b00f2a599f02", 102 | "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3", 103 | "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd", 104 | "sha256:d11b54acf878eef558599658b0ffca78138c8c3655cf4f3a4a673c437e67732e", 105 | "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214", 106 | "sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd", 107 | "sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a", 108 | "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c", 109 | "sha256:dc7039885fa1baf9be153a0626e337aa7ec8bf96b0128605fb0d77788ddc1681", 110 | "sha256:dccab8d5fa1ef9bfba0590ecf4d46df048d18ffe3eec01eeb73a42e0d9e7a8ba", 111 | "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f", 112 | "sha256:e45ba65510e2647721e35323d6ef54c7974959f6081b58d4ef5d87c60c84919a", 113 | "sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28", 114 | "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691", 115 | "sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82", 116 | "sha256:e8082b26888e2f8b36a042a58307d5b917ef2b1cacab921ad3323ef91901c71a", 117 | "sha256:e8323a9b031aa0393768b87f04b4164a40037fb2a3c11ac06a03ffecd3618027", 118 | "sha256:e92fca20c46e9f5e1bb485887d074918b13543b1c2a1185e69bb8d17ab6236a7", 119 | "sha256:eb30abc20df9ab0814b5a2524f23d75dcf83cde762c161917a2b4b7b55b1e518", 120 | "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf", 121 | "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b", 122 | "sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9", 123 | "sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544", 124 | "sha256:f4074c5a429281bf056ddd4c5d3b740ebca4d43ffffe2ef4bf4d2d05114299da", 125 | "sha256:f69a27e45c43520f5487f27627059b64aaf160415589230992cec34c5e18a509", 126 | "sha256:fb707f3e15060adf5b7ada797624a6c6e0138e2a26baa089df64c68ee98e040f", 127 | "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a", 128 | "sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f" 129 | ], 130 | "markers": "python_version >= '3.7'", 131 | "version": "==3.4.2" 132 | }, 133 | "click": { 134 | "hashes": [ 135 | "sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a", 136 | "sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6" 137 | ], 138 | "index": "pypi", 139 | "markers": "python_version >= '3.10'", 140 | "version": "==8.3.1" 141 | }, 142 | "gitdb": { 143 | "hashes": [ 144 | "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571", 145 | "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf" 146 | ], 147 | "markers": "python_version >= '3.7'", 148 | "version": "==4.0.12" 149 | }, 150 | "gitpython": { 151 | "hashes": [ 152 | "sha256:85b0ee964ceddf211c41b9f27a49086010a190fd8132a24e21f362a4b36a791c", 153 | "sha256:8908cb2e02fb3b93b7eb0f2827125cb699869470432cc885f019b8fd0fccff77" 154 | ], 155 | "index": "pypi", 156 | "markers": "python_version >= '3.7'", 157 | "version": "==3.1.45" 158 | }, 159 | "idna": { 160 | "hashes": [ 161 | "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", 162 | "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3" 163 | ], 164 | "markers": "python_version >= '3.6'", 165 | "version": "==3.10" 166 | }, 167 | "markdown-it-py": { 168 | "hashes": [ 169 | "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", 170 | "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb" 171 | ], 172 | "markers": "python_version >= '3.8'", 173 | "version": "==3.0.0" 174 | }, 175 | "mdurl": { 176 | "hashes": [ 177 | "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", 178 | "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba" 179 | ], 180 | "markers": "python_version >= '3.7'", 181 | "version": "==0.1.2" 182 | }, 183 | "pydantic": { 184 | "hashes": [ 185 | "sha256:4d351024c75c0f085a9febbb665ce8c0c6ec5d30e903bdb6394b7ede26aebb49", 186 | "sha256:e561593fccf61e8a20fc46dfc2dfe075b8be7d0188df33f221ad1f0139180f9d" 187 | ], 188 | "index": "pypi", 189 | "markers": "python_version >= '3.9'", 190 | "version": "==2.12.5" 191 | }, 192 | "pydantic-core": { 193 | "hashes": [ 194 | "sha256:0177272f88ab8312479336e1d777f6b124537d47f2123f89cb37e0accea97f90", 195 | "sha256:01a3d0ab748ee531f4ea6c3e48ad9dac84ddba4b0d82291f87248f2f9de8d740", 196 | "sha256:0384e2e1021894b1ff5a786dbf94771e2986ebe2869533874d7e43bc79c6f504", 197 | "sha256:03b77d184b9eb40240ae9fd676ca364ce1085f203e1b1256f8ab9984dca80a84", 198 | "sha256:03ca43e12fab6023fc79d28ca6b39b05f794ad08ec2feccc59a339b02f2b3d33", 199 | "sha256:05a2c8852530ad2812cb7914dc61a1125dc4e06252ee98e5638a12da6cc6fb6c", 200 | "sha256:070259a8818988b9a84a449a2a7337c7f430a22acc0859c6b110aa7212a6d9c0", 201 | "sha256:08daa51ea16ad373ffd5e7606252cc32f07bc72b28284b6bc9c6df804816476e", 202 | "sha256:0cbaad15cb0c90aa221d43c00e77bb33c93e8d36e0bf74760cd00e732d10a6a0", 203 | "sha256:100baa204bb412b74fe285fb0f3a385256dad1d1879f0a5cb1499ed2e83d132a", 204 | "sha256:112e305c3314f40c93998e567879e887a3160bb8689ef3d2c04b6cc62c33ac34", 205 | "sha256:16f80f7abe3351f8ea6858914ddc8c77e02578544a0ebc15b4c2e1a0e813b0b2", 206 | "sha256:1746d4a3d9a794cacae06a5eaaccb4b8643a131d45fbc9af23e353dc0a5ba5c3", 207 | "sha256:1962293292865bca8e54702b08a4f26da73adc83dd1fcf26fbc875b35d81c815", 208 | "sha256:1d1d9764366c73f996edd17abb6d9d7649a7eb690006ab6adbda117717099b14", 209 | "sha256:1f8d33a7f4d5a7889e60dc39856d76d09333d8a6ed0f5f1190635cbec70ec4ba", 210 | "sha256:22f0fb8c1c583a3b6f24df2470833b40207e907b90c928cc8d3594b76f874375", 211 | "sha256:239edca560d05757817c13dc17c50766136d21f7cd0fac50295499ae24f90fdf", 212 | "sha256:242a206cd0318f95cd21bdacff3fcc3aab23e79bba5cac3db5a841c9ef9c6963", 213 | "sha256:25e1c2af0fce638d5f1988b686f3b3ea8cd7de5f244ca147c777769e798a9cd1", 214 | "sha256:266fb4cbf5e3cbd0b53669a6d1b039c45e3ce651fd5442eff4d07c2cc8d66808", 215 | "sha256:2782c870e99878c634505236d81e5443092fba820f0373997ff75f90f68cd553", 216 | "sha256:287dad91cfb551c363dc62899a80e9e14da1f0e2b6ebde82c806612ca2a13ef1", 217 | "sha256:29452c56df2ed968d18d7e21f4ab0ac55e71dc59524872f6fc57dcf4a3249ed2", 218 | "sha256:299e0a22e7ae2b85c1a57f104538b2656e8ab1873511fd718a1c1c6f149b77b5", 219 | "sha256:2a5e06546e19f24c6a96a129142a75cee553cc018ffee48a460059b1185f4470", 220 | "sha256:2b761d210c9ea91feda40d25b4efe82a1707da2ef62901466a42492c028553a2", 221 | "sha256:2c010c6ded393148374c0f6f0bf89d206bf3217f201faa0635dcd56bd1520f6b", 222 | "sha256:2ff4321e56e879ee8d2a879501c8e469414d948f4aba74a2d4593184eb326660", 223 | "sha256:3006c3dd9ba34b0c094c544c6006cc79e87d8612999f1a5d43b769b89181f23c", 224 | "sha256:33cb885e759a705b426baada1fe68cbb0a2e68e34c5d0d0289a364cf01709093", 225 | "sha256:346285d28e4c8017da95144c7f3acd42740d637ff41946af5ce6e5e420502dd5", 226 | "sha256:34a64bc3441dc1213096a20fe27e8e128bd3ff89921706e83c0b1ac971276594", 227 | "sha256:35b44f37a3199f771c3eaa53051bc8a70cd7b54f333531c59e29fd4db5d15008", 228 | "sha256:378bec5c66998815d224c9ca994f1e14c0c21cb95d2f52b6021cc0b2a58f2a5a", 229 | "sha256:3f37a19d7ebcdd20b96485056ba9e8b304e27d9904d233d7b1015db320e51f0a", 230 | "sha256:3f84d5c1b4ab906093bdc1ff10484838aca54ef08de4afa9de0f5f14d69639cd", 231 | "sha256:4009935984bd36bd2c774e13f9a09563ce8de4abaa7226f5108262fa3e637284", 232 | "sha256:406bf18d345822d6c21366031003612b9c77b3e29ffdb0f612367352aab7d586", 233 | "sha256:4819fa52133c9aa3c387b3328f25c1facc356491e6135b459f1de698ff64d869", 234 | "sha256:482c982f814460eabe1d3bb0adfdc583387bd4691ef00b90575ca0d2b6fe2294", 235 | "sha256:4bc36bbc0b7584de96561184ad7f012478987882ebf9f9c389b23f432ea3d90f", 236 | "sha256:506d766a8727beef16b7adaeb8ee6217c64fc813646b424d0804d67c16eddb66", 237 | "sha256:56121965f7a4dc965bff783d70b907ddf3d57f6eba29b6d2e5dabfaf07799c51", 238 | "sha256:58133647260ea01e4d0500089a8c4f07bd7aa6ce109682b1426394988d8aaacc", 239 | "sha256:5921a4d3ca3aee735d9fd163808f5e8dd6c6972101e4adbda9a4667908849b97", 240 | "sha256:5a4e67afbc95fa5c34cf27d9089bca7fcab4e51e57278d710320a70b956d1b9a", 241 | "sha256:5cb1b2f9742240e4bb26b652a5aeb840aa4b417c7748b6f8387927bc6e45e40d", 242 | "sha256:62de39db01b8d593e45871af2af9e497295db8d73b085f6bfd0b18c83c70a8f9", 243 | "sha256:634e8609e89ceecea15e2d61bc9ac3718caaaa71963717bf3c8f38bfde64242c", 244 | "sha256:63510af5e38f8955b8ee5687740d6ebf7c2a0886d15a6d65c32814613681bc07", 245 | "sha256:650ae77860b45cfa6e2cdafc42618ceafab3a2d9a3811fcfbd3bbf8ac3c40d36", 246 | "sha256:6561e94ba9dacc9c61bce40e2d6bdc3bfaa0259d3ff36ace3b1e6901936d2e3e", 247 | "sha256:65840751b72fbfd82c3c640cff9284545342a4f1eb1586ad0636955b261b0b05", 248 | "sha256:6cb58b9c66f7e4179a2d5e0f849c48eff5c1fca560994d6eb6543abf955a149e", 249 | "sha256:6f52298fbd394f9ed112d56f3d11aabd0d5bd27beb3084cc3d8ad069483b8941", 250 | "sha256:707625ef0983fcfb461acfaf14de2067c5942c6bb0f3b4c99158bed6fedd3cf3", 251 | "sha256:72f6c8b11857a856bcfa48c86f5368439f74453563f951e473514579d44aa612", 252 | "sha256:753e230374206729bf0a807954bcc6c150d3743928a73faffee51ac6557a03c3", 253 | "sha256:76d0819de158cd855d1cbb8fcafdf6f5cf1eb8e470abe056d5d161106e38062b", 254 | "sha256:76ee27c6e9c7f16f47db7a94157112a2f3a00e958bc626e2f4ee8bec5c328fbe", 255 | "sha256:77b63866ca88d804225eaa4af3e664c5faf3568cea95360d21f4725ab6e07146", 256 | "sha256:79ec52ec461e99e13791ec6508c722742ad745571f234ea6255bed38c6480f11", 257 | "sha256:7b93a4d08587e2b7e7882de461e82b6ed76d9026ce91ca7915e740ecc7855f60", 258 | "sha256:7da7087d756b19037bc2c06edc6c170eeef3c3bafcb8f532ff17d64dc427adfd", 259 | "sha256:7f3bf998340c6d4b0c9a2f02d6a400e51f123b59565d74dc60d252ce888c260b", 260 | "sha256:80aa89cad80b32a912a65332f64a4450ed00966111b6615ca6816153d3585a8c", 261 | "sha256:8566def80554c3faa0e65ac30ab0932b9e3a5cd7f8323764303d468e5c37595a", 262 | "sha256:873e0d5b4fb9b89ef7c2d2a963ea7d02879d9da0da8d9d4933dee8ee86a8b460", 263 | "sha256:88942d3a3dff3afc8288c21e565e476fc278902ae4d6d134f1eeda118cc830b1", 264 | "sha256:8bfeaf8735be79f225f3fefab7f941c712aaca36f1128c9d7e2352ee1aa87bdf", 265 | "sha256:8e7c86f27c585ef37c35e56a96363ab8de4e549a95512445b85c96d3e2f7c1bf", 266 | "sha256:915c3d10f81bec3a74fbd4faebe8391013ba61e5a1a8d48c4455b923bdda7858", 267 | "sha256:93e8740d7503eb008aa2df04d3b9735f845d43ae845e6dcd2be0b55a2da43cd2", 268 | "sha256:941103c9be18ac8daf7b7adca8228f8ed6bb7a1849020f643b3a14d15b1924d9", 269 | "sha256:97aeba56665b4c3235a0e52b2c2f5ae9cd071b8a8310ad27bddb3f7fb30e9aa2", 270 | "sha256:a39455728aabd58ceabb03c90e12f71fd30fa69615760a075b9fec596456ccc3", 271 | "sha256:a3a52f6156e73e7ccb0f8cced536adccb7042be67cb45f9562e12b319c119da6", 272 | "sha256:a668ce24de96165bb239160b3d854943128f4334822900534f2fe947930e5770", 273 | "sha256:a75dafbf87d6276ddc5b2bf6fae5254e3d0876b626eb24969a574fff9149ee5d", 274 | "sha256:aabf5777b5c8ca26f7824cb4a120a740c9588ed58df9b2d196ce92fba42ff8dc", 275 | "sha256:aec5cf2fd867b4ff45b9959f8b20ea3993fc93e63c7363fe6851424c8a7e7c23", 276 | "sha256:b2379fa7ed44ddecb5bfe4e48577d752db9fc10be00a6b7446e9663ba143de26", 277 | "sha256:b4ececa40ac28afa90871c2cc2b9ffd2ff0bf749380fbdf57d165fd23da353aa", 278 | "sha256:b5819cd790dbf0c5eb9f82c73c16b39a65dd6dd4d1439dcdea7816ec9adddab8", 279 | "sha256:b74557b16e390ec12dca509bce9264c3bbd128f8a2c376eaa68003d7f327276d", 280 | "sha256:b80aa5095cd3109962a298ce14110ae16b8c1aece8b72f9dafe81cf597ad80b3", 281 | "sha256:b93590ae81f7010dbe380cdeab6f515902ebcbefe0b9327cc4804d74e93ae69d", 282 | "sha256:b96d5f26b05d03cc60f11a7761a5ded1741da411e7fe0909e27a5e6a0cb7b034", 283 | "sha256:bd3d54f38609ff308209bd43acea66061494157703364ae40c951f83ba99a1a9", 284 | "sha256:bfea2a5f0b4d8d43adf9d7b8bf019fb46fdd10a2e5cde477fbcb9d1fa08c68e1", 285 | "sha256:c007fe8a43d43b3969e8469004e9845944f1a80e6acd47c150856bb87f230c56", 286 | "sha256:c1df3d34aced70add6f867a8cf413e299177e0c22660cc767218373d0779487b", 287 | "sha256:c23e27686783f60290e36827f9c626e63154b82b116d7fe9adba1fda36da706c", 288 | "sha256:c8d8b4eb992936023be7dee581270af5c6e0697a8559895f527f5b7105ecd36a", 289 | "sha256:c9e19dd6e28fdcaa5a1de679aec4141f691023916427ef9bae8584f9c2fb3b0e", 290 | "sha256:d0d2568a8c11bf8225044aa94409e21da0cb09dcdafe9ecd10250b2baad531a9", 291 | "sha256:d38548150c39b74aeeb0ce8ee1d8e82696f4a4e16ddc6de7b1d8823f7de4b9b5", 292 | "sha256:d3a978c4f57a597908b7e697229d996d77a6d3c94901e9edee593adada95ce1a", 293 | "sha256:d5160812ea7a8a2ffbe233d8da666880cad0cbaf5d4de74ae15c313213d62556", 294 | "sha256:dc799088c08fa04e43144b164feb0c13f9a0bc40503f8df3e9fde58a3c0c101e", 295 | "sha256:df3959765b553b9440adfd3c795617c352154e497a4eaf3752555cfb5da8fc49", 296 | "sha256:dfa8a0c812ac681395907e71e1274819dec685fec28273a28905df579ef137e2", 297 | "sha256:e25c479382d26a2a41b7ebea1043564a937db462816ea07afa8a44c0866d52f9", 298 | "sha256:e4f4a984405e91527a0d62649ee21138f8e3d0ef103be488c1dc11a80d7f184b", 299 | "sha256:e536c98a7626a98feb2d3eaf75944ef6f3dbee447e1f841eae16f2f0a72d8ddc", 300 | "sha256:e56ba91f47764cc14f1daacd723e3e82d1a89d783f0f5afe9c364b8bb491ccdb", 301 | "sha256:e672ba74fbc2dc8eea59fb6d4aed6845e6905fc2a8afe93175d94a83ba2a01a0", 302 | "sha256:e7b576130c69225432866fe2f4a469a85a54ade141d96fd396dffcf607b558f8", 303 | "sha256:e8465ab91a4bd96d36dde3263f06caa6a8a6019e4113f24dc753d79a8b3a3f82", 304 | "sha256:e96cea19e34778f8d59fe40775a7a574d95816eb150850a85a7a4c8f4b94ac69", 305 | "sha256:ece5c59f0ce7d001e017643d8d24da587ea1f74f6993467d85ae8a5ef9d4f42b", 306 | "sha256:eceb81a8d74f9267ef4081e246ffd6d129da5d87e37a77c9bde550cb04870c1c", 307 | "sha256:ed2e99c456e3fadd05c991f8f437ef902e00eedf34320ba2b0842bd1c3ca3a75", 308 | "sha256:f0cd744688278965817fd0839c4a4116add48d23890d468bc436f78beb28abf5", 309 | "sha256:f14f8f046c14563f8eb3f45f499cc658ab8d10072961e07225e507adb700e93f", 310 | "sha256:f15489ba13d61f670dcc96772e733aad1a6f9c429cc27574c6cdaed82d0146ad", 311 | "sha256:f31d95a179f8d64d90f6831d71fa93290893a33148d890ba15de25642c5d075b", 312 | "sha256:f41a7489d32336dbf2199c8c0a215390a751c5b014c2c1c5366e817202e9cdf7", 313 | "sha256:f41eb9797986d6ebac5e8edff36d5cef9de40def462311b3eb3eeded1431e425", 314 | "sha256:f547144f2966e1e16ae626d8ce72b4cfa0caedc7fa28052001c94fb2fcaa1c52" 315 | ], 316 | "markers": "python_version >= '3.9'", 317 | "version": "==2.41.5" 318 | }, 319 | "pygments": { 320 | "hashes": [ 321 | "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199", 322 | "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a" 323 | ], 324 | "markers": "python_version >= '3.8'", 325 | "version": "==2.18.0" 326 | }, 327 | "python-on-whales": { 328 | "hashes": [ 329 | "sha256:4a39ab107a4e740e4302c853c0efc5ced4b4048f55acbb959a2faf53b7003c27", 330 | "sha256:919bba304cc04db4b75cdd7fb14c0a8fea6ebeafacf7989f6956641cb58210e0" 331 | ], 332 | "index": "pypi", 333 | "markers": "python_version >= '3.8' and python_version < '4'", 334 | "version": "==0.79.0" 335 | }, 336 | "pyyaml": { 337 | "hashes": [ 338 | "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", 339 | "sha256:0150219816b6a1fa26fb4699fb7daa9caf09eb1999f3b70fb6e786805e80375a", 340 | "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", 341 | "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956", 342 | "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", 343 | "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c", 344 | "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", 345 | "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a", 346 | "sha256:1ebe39cb5fc479422b83de611d14e2c0d3bb2a18bbcb01f229ab3cfbd8fee7a0", 347 | "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b", 348 | "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", 349 | "sha256:27c0abcb4a5dac13684a37f76e701e054692a9b2d3064b70f5e4eb54810553d7", 350 | "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e", 351 | "sha256:2e71d11abed7344e42a8849600193d15b6def118602c4c176f748e4583246007", 352 | "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", 353 | "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4", 354 | "sha256:3c5677e12444c15717b902a5798264fa7909e41153cdf9ef7ad571b704a63dd9", 355 | "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", 356 | "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0", 357 | "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e", 358 | "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", 359 | "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", 360 | "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", 361 | "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", 362 | "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", 363 | "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69", 364 | "sha256:5ed875a24292240029e4483f9d4a4b8a1ae08843b9c54f43fcc11e404532a8a5", 365 | "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", 366 | "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", 367 | "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", 368 | "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824", 369 | "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198", 370 | "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", 371 | "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", 372 | "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", 373 | "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", 374 | "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", 375 | "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b", 376 | "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00", 377 | "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", 378 | "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", 379 | "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", 380 | "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", 381 | "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", 382 | "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", 383 | "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b", 384 | "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf", 385 | "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", 386 | "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", 387 | "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8", 388 | "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", 389 | "sha256:b865addae83924361678b652338317d1bd7e79b1f4596f96b96c77a5a34b34da", 390 | "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d", 391 | "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", 392 | "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c", 393 | "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", 394 | "sha256:c3355370a2c156cffb25e876646f149d5d68f5e0a3ce86a5084dd0b64a994917", 395 | "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", 396 | "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", 397 | "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", 398 | "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", 399 | "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", 400 | "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", 401 | "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", 402 | "sha256:fa160448684b4e94d80416c0fa4aac48967a969efe22931448d853ada8baf926", 403 | "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0" 404 | ], 405 | "index": "pypi", 406 | "markers": "python_version >= '3.8'", 407 | "version": "==6.0.3" 408 | }, 409 | "requests": { 410 | "hashes": [ 411 | "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c", 412 | "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422" 413 | ], 414 | "index": "pypi", 415 | "markers": "python_version >= '3.8'", 416 | "version": "==2.32.4" 417 | }, 418 | "rich": { 419 | "hashes": [ 420 | "sha256:2e85306a063b9492dffc86278197a60cbece75bcb766022f3436f567cae11bdc", 421 | "sha256:a5ac1f1cd448ade0d59cc3356f7db7a7ccda2c8cbae9c7a90c28ff463d3e91f4" 422 | ], 423 | "markers": "python_full_version >= '3.7.0'", 424 | "version": "==13.8.0" 425 | }, 426 | "shellingham": { 427 | "hashes": [ 428 | "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", 429 | "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de" 430 | ], 431 | "markers": "python_version >= '3.7'", 432 | "version": "==1.5.4" 433 | }, 434 | "smmap": { 435 | "hashes": [ 436 | "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5", 437 | "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e" 438 | ], 439 | "markers": "python_version >= '3.7'", 440 | "version": "==5.0.2" 441 | }, 442 | "tqdm": { 443 | "hashes": [ 444 | "sha256:90279a3770753eafc9194a0364852159802111925aa30eb3f9d85b0e805ac7cd", 445 | "sha256:e1020aef2e5096702d8a025ac7d16b1577279c9d63f8375b63083e9a5f0fcbad" 446 | ], 447 | "markers": "python_version >= '3.7'", 448 | "version": "==4.66.5" 449 | }, 450 | "typer": { 451 | "hashes": [ 452 | "sha256:62fe4e471711b147e3365034133904df3e235698399bc4de2b36c8579298d52b", 453 | "sha256:f592f089bedcc8ec1b974125d64851029c3b1af145f04aca64d69410f0c9b722" 454 | ], 455 | "markers": "python_version >= '3.7'", 456 | "version": "==0.12.5" 457 | }, 458 | "typing-extensions": { 459 | "hashes": [ 460 | "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", 461 | "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548" 462 | ], 463 | "markers": "python_version >= '3.9'", 464 | "version": "==4.15.0" 465 | }, 466 | "typing-inspection": { 467 | "hashes": [ 468 | "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", 469 | "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464" 470 | ], 471 | "markers": "python_version >= '3.9'", 472 | "version": "==0.4.2" 473 | }, 474 | "urllib3": { 475 | "hashes": [ 476 | "sha256:c90f7a39f716c572c4e3e58509581ebd83f9b59cced005b7db7ad2d22b0db99f", 477 | "sha256:cb9bcef5a4b345d5da5d145dc3e30834f58e8018828cbc724d30b4cb7d4d49f1" 478 | ], 479 | "index": "pypi", 480 | "markers": "python_version >= '3.9'", 481 | "version": "==2.6.0" 482 | } 483 | }, 484 | "develop": {} 485 | } 486 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | Versions 2 | ======== 3 | 4 | 2025-11-30 5 | ---------- 6 | * AWS: Updating to Debian Trixie 7 | * Azure: Updating to Debian Trixie 8 | * Claude: Updating to Alpine 3.22 9 | * Cloudsploit: Updating to Debian Trixie 10 | * DIND: Updating Docker from 20.10.24 to 29.0.2 11 | * Java: Updating Java 17 and 21 to Ubuntu Noble 12 | * Node: Updating to Debian Trixie 13 | * PHP: Updating PHP 8.4 to Alpine 3.22 14 | * Python: adding Python 3.14 15 | * Python: removing Python 3.9, now EoL 16 | * Python: Updating Python 3.10, 3.11, 3.12, and 3.13 to Debian Trixie 17 | * Scaleway: Updating to Debian Trixie 18 | * Upsun: Updating to Debian Trixie 19 | 20 | 2025-10-31 21 | ---------- 22 | * Claude: added new image with Node.js 24 on Alpine Linux and Anthropic's Claude Code CLI tool 23 | * Java: added support for Java 25 LTS 24 | 25 | 2025-09-30 26 | ---------- 27 | * Platform: removed image, replaced by Upsun image which includes both Platform.sh and Upsun CLIs 28 | * Upsun: added new image with both Upsun CLI and Platform.sh CLI, automatically updated to latest versions 29 | 30 | 2025-08-31 31 | ---------- 32 | * Golang: adding support for 1.25, removing 1.23 33 | * Node: adding support for 24, updating Node 20 to 20.19.4, Node 22 to 22.18.0, and NPM to 11.5.2 34 | * PHP: updating APCu to 5.1.26, PHP-CS-Fixer to 3.86.0 35 | * Platform: updating CLI to 5.2.0 36 | * Sonar: updating to 7.2.0.5079 37 | 38 | 2025-07-31 39 | ---------- 40 | * PHP: adding PHP 8.4. Updating associated tools & libraries for all PHP versions. 41 | * Python: Adding postgresql-client to 3.13 image 42 | 43 | 2025-05-31 44 | ---------- 45 | * Node: removing node 18, now EoL 46 | 47 | 2025-04-30 48 | ---------- 49 | * Java: deprecating version 11 50 | * Node: updating to the latest runtimes 51 | * Percy: removing this image 52 | * Platform: updating to the latest CLI version 53 | * Scaleway: adding this new image 54 | * Sonar: updating to 7.1.x 55 | 56 | 2025-03-31 57 | ---------- 58 | * Golang: Removing 1.22 (EoL) 59 | 60 | 2025-02-28 61 | ---------- 62 | * All images are now available on GitHub Container Registry in addition to Docker Hub 63 | * Golang: add jq 64 | * Golang: adding support for 1.24. Removing 1.21 (EoL) 65 | * Platform: removing unused packages 66 | 67 | 2025-01-31 68 | ---------- 69 | * Golang: removing modd 70 | * Node: removing modd 71 | * PHP: removing modd 72 | 73 | 2024-12-31 74 | ---------- 75 | * AWS: automatically use the latest version of included tools. 76 | * Azure: automatically use the latest version of included tools. 77 | * Chrome: using the latest versions of Taskfile and Modd 78 | * DIND: automatically use the latest version of included tools. 79 | * Golang: automatically use the latest version of included tools. 80 | * Node: using the latest versions of Taskfile and Modd. Upgrading to Debian 12. 81 | * PHP: using the latest versions of Taskfile and Modd 82 | 83 | 2024-11-30 84 | ---------- 85 | * AWS: fixing download path for kubectl, and adding a check. We'll now use the latest version automatically 86 | * Azure: fixing download path for kubectl, and adding a check. We'll now use the latest version automatically 87 | * Azure: installing zip to use tfenv 88 | * Node : adding 22.x.x image. Updating tooling 89 | 90 | 2024-10-31 91 | ---------- 92 | * AWS: updating kubectl and associated infra tools 93 | * Azure: updating kubectl and associated infra tools 94 | * Bitcoind: deprecating this image 95 | * DIND: updating kubectl and associated infra tools 96 | * Python : 3.8 is now deprecated. Adding version 3.13. 97 | * Sonar: updating to 6.2.x 98 | 99 | 2024-09-30 100 | ---------- 101 | * Golang: adding version 1.23 102 | * PHP: remove local-php-security-checker on all images (abandoned, now use composer audit) 103 | 104 | 2024-09-02 105 | ---------- 106 | * Sonar: fix analysis for amd64 107 | 108 | 2024-08-31 109 | ---------- 110 | * AWS : bumping python version from 3.11.x to 3.12.x 111 | * Cloudsploit : bumping python version from 3.10.x to 3.12.x 112 | * Sonar: bumping Sonar CLI from 5.0.1.3006 to 6.1.0.4477 113 | * Platform : adding git. Bumping platform-cli version. Bumping python version from 3.11.x to 3.12.x 114 | 115 | 2024-07-31 116 | ---------- 117 | * AWS : updating tooling (kubectl, kustomize, helm, helm-diff, terragrunt, trivy, infracost) 118 | * Azure : updating tooling (kubectl, kustomize, helm, helm-diff, terragrunt, trivy, infracost) 119 | * Cloudsploit : updating to 3.5.x 120 | * DIND : updating trivy 121 | * PHP : updating base images from alpine 3.18 to 3.20 122 | 123 | 2024-06-30 124 | ---------- 125 | * Python : updating Poetry version to the latest for all Python images 126 | * Tezosqa : deprecating this image 127 | 128 | 2024-05-31 129 | ---------- 130 | * PHP : adding **icu-data-full** package for PHP 8.1|8.2|8.3 image 131 | 132 | 2024-04-30 133 | ---------- 134 | * DIND : updating trivy 135 | * AWS : updating tooling (kubectl, kustomize, helm, helm-diff, terragrunt, trivy, infracost) 136 | * Azure : updating tooling (kubectl, kustomize, helm, helm-diff, terragrunt, trivy, infracost) 137 | 138 | 2024-02-29 139 | ---------- 140 | * Golang : adding 1.22, dropping 1.20 141 | 142 | 2024-01-31 143 | ---------- 144 | * Golang : removing go-bindata. Bumping misc tools' versions. 145 | * Node : bumping minor versions 146 | * Platform: bumping CLI to 5.x.x 147 | 148 | 2023-12-31 149 | ---------- 150 | * Node : dropping EoL Node 16 support 151 | * PHP : adding 8.3 image, dropping 8.0 152 | 153 | 2023-11-30 154 | ---------- 155 | * AWS : bumping Kubectl version 156 | * Azure : bumping Kubectl version 157 | * Tezosqa : fix pytezos installation error 158 | 159 | 2023-10-31 160 | ---------- 161 | * AWS : bumping Trivy version. Bumping kubernetes tooling versions. 162 | * AWSLinux-systemd : dropping support of this image 163 | * Azure : bumping Trivy version. Bumping kubernetes tooling versions. 164 | * Cloudsploit : bumping to 3.1.0. Also bumping node to 20 165 | * Dind : bumping Trivy version 166 | * Golang : adding 1.21 support 167 | * Java : adding Java 21 support 168 | * Python : adding 3.12 support 169 | * Sonar : bumping CLI from 4.7 to 5.0 170 | 171 | 2023-09-30 172 | ---------- 173 | * Node: dropping support for 14.x (EOL), adding 20.x. Bumping minor versions 174 | * Python : build arm64 docker image 175 | * Python : adding poetry 176 | 177 | 2023-08-31 178 | ---------- 179 | * Cloudsploit : bumping to 3.0.0 180 | * Pynode : removing this image, use python instead 181 | * Python : dropping support for 3.7 (now EOL) 182 | 183 | 2023-07-31 184 | ---------- 185 | * Dind : build arm64 docker image 186 | 187 | 2023-06-30 188 | ---------- 189 | * PHP : update tools version (composer, PHP CS Fixer, Xdebug) 190 | * PHP : bump Alpine, Iconv and Musl for PHP 8.1 and 8.2 191 | * PHP : type hint update 192 | 193 | 2023-05-31 194 | ---------- 195 | * PHP: bump musl-dev version 196 | * Tezosqa : version 2.0 : Update smartpy and ligo installation process, switch base image from python:3.8-slim-bullseye to docker:20.10.24-dind, add compatibility with arm64 197 | 198 | 2023-04-30 199 | ---------- 200 | * Ansible : dropping this image. 201 | * AWS : adding yq, terraform, tfenv and associated tools. Removing boto3. Bumping misc tools' versions 202 | * Azure : adding yq, terraform, tfenv and associated tools. Bumping misc tools' versions 203 | * Terraform : dropping this image. Terraform tooling is now included directly in AWS & Azure images 204 | * Golang : Bump Golang-ci-lint version 205 | 206 | 2023-03-31 207 | ---------- 208 | * Golang : Creating golang version 1.20 209 | * PHP: update some packages versions 210 | 211 | 2023-02-28 212 | ---------- 213 | * AWS: switching from python 3.10 to 3.11 214 | * Azure: switching from python 3.10 to 3.11 215 | * Java: upgrade Java images 216 | * Platform: switching from python 3.8 to 3.11 217 | 218 | 2023-01-31 219 | ---------- 220 | * Ansible: bumping from 5.x.x to 7.x.x 221 | * Ansible: switching base image from debian buster to bullseye 222 | * AWS: bumping kubectl, kustomize, helm, trivy versions 223 | * AWS: switching base image from debian buster to bullseye 224 | * Azure: bumping kubectl, kustomize, helm, trivy versions 225 | * Azure: switching base image from debian buster to bullseye 226 | * Cloudsploit: switching base image from debian buster to bullseye 227 | * Dind: bumping kubectl, kustomize, helm, trivy versions 228 | * PHP: adding support for php 8.2 and removing for 7.4. Php-cs-fixer isn't officially supported in 8.2 as of now, use it with care. 229 | * Platform: switching to the new 4.x.x Golang CLI 230 | * Platform: build arm64 docker image 231 | * Pynode: switching base image from debian buster to bullseye 232 | * Python: switching base image from debian buster to bullseye 233 | * Terraform: switching base image from debian buster to bullseye 234 | * Terraform: bumping to TF 1.3.x. Updating terragrunt & infracost 235 | * Tezosqa: switching base image from debian buster to bullseye 236 | 237 | 2022-12-31 238 | ---------- 239 | * Node: Adding jq command 240 | * Python : adding support for python 3.11 241 | 242 | 2022-11-30 243 | ---------- 244 | * AWS : Adding kubectl & associated tools 245 | * AWS : removing taskfile, kube-no-trouble and kube-score 246 | * Azure : Adding kubectl & associated tools 247 | * Azure : always install the latest CLI 248 | * Azure : removing taskfile, kube-no-trouble and kube-score 249 | * Kubectl : removing this image, the tools are now included in AWS & Azure images 250 | * PHP : build arm64 docker image 251 | * Ruby : dropping support for this flavor 252 | 253 | 2022-10-31 254 | ---------- 255 | * Golang : Updating golangci-lint to 1.49.0 to handle go1.19 & go1.18 256 | 257 | 2022-09-30 258 | ---------- 259 | * Ansible : Build arm64 docker image 260 | * Azure : build arm64 azure docker image 261 | * Chrome : build arm64 docker image 262 | * Cloudsploit : build arm64 docker image 263 | * Golang : build arm64 docker image 264 | * Golang : Remove testfixtures test. Binary does not exist for arch arm64 265 | * Golang : Remove version 1.17. Image does not exist for arch arm64 266 | * Golang : Updating Gitleaks to 8.11.2 267 | * Golang : Updating Go-testfixtures to 3.8.0 268 | * Golang : Updating Mockgen to 1.6 269 | * Java : build arm64 docker image 270 | * Node : build arm64 docker image 271 | * Percy : build arm64 docker image 272 | 273 | 2022-08-31 274 | ---------- 275 | 276 | * AWS : Build arm64 docker image 277 | * AWS : Fix tagging issue preventing the push of multiple architectures to docker hub 278 | * Bitcoind : Build arm64 image 279 | * Bitcoind : Updating to bitcoind to 23.0 280 | * Golang: adding new 1.19 flavor 281 | * Java: upgrade Java 11 to 11.0.16 and 17 to 17.0.4 282 | * Platformsh: updating base image, and CLI to the latest 3.81.x 283 | 284 | 2022-07-31 285 | ---------- 286 | 287 | * PHP: updating tools 288 | * Terraform: bump terraform to 1.2.5, along with associated tools 289 | * Python SRC : Change python docker module from docker to python-on-whales 290 | * Python SRC : Build amd64 images with docker buildx 291 | * Python SRC Config : Add linux/amd64 and linux/arm64 as values for the new config property base_platforms 292 | * CI : use docker/setup-qemu-action@v2 and docker/setup-buildx-action@v2 as gitflows step actions 293 | * Images : Only [OCI images](https://github.com/opencontainers/image-spec/blob/main/spec.md) for amd64 architecture are built 294 | 295 | 296 | 2022-06-30 297 | ---------- 298 | 299 | No specific change this month, just standard dependencies updates. Happy summer ! 300 | 301 | 2022-05-31 302 | ---------- 303 | 304 | * Chrome: removing ci-helper binary 305 | * Dind: removing ci-helper binary 306 | * Dind: changing docker-compose installation method to apk. 307 | * Dind: bumping Trivy's version 308 | * Golang: removing ci-helper binary 309 | * Golang: golang 1.16 is now EOL, removing this image's flavor 310 | * Java: removing ci-helper binary 311 | * Node: removing ci-helper binary 312 | * Node: adding new 18.x flavor 313 | * PHP: removing ci-helper binary 314 | * Ruby: removing ci-helper binary 315 | * Sonar: removing ci-helper binary 316 | * Sonar: updating to sonar-scanner-cli 4.7.x 317 | * Kubectl: updating to 1.24, along with associated tools 318 | * Kubectl: adding Trivy, which now supports scanning kubernetes resources 319 | * Platformsh: updating to the latest 3.79.x CLI 320 | * Terraform: bump terraform to 1.2.1, along with associated tools 321 | * Terraform: adding Google Cloud CLI 322 | 323 | 2022-04-30 324 | ---------- 325 | 326 | * Tezosqa: Version 1.0 that use version 0.9.0 of smartpy 327 | * expose docker variables in image building workflow 328 | * Java: upgrade Java 11 to 11.0.15 and 17 to 17.0.3 329 | 330 | 2022-03-31 331 | ---------- 332 | 333 | * Ansible: switch from AWScli v1 to v2 334 | * Ansible: dropping support for 4.x.x 335 | * AWS: switch from AWScli v1 to v2 336 | * Dind: switch from AWScli v1 to v2 337 | * Node: dropping support for NodeJs 12 338 | * Node: switch from AWScli v1 to v2 339 | * Golang: switch from AWScli v1 to v2 340 | * Golang: adding new 1.18 flavor 341 | * Cloudsploit: switch from AWScli v1 to v2 342 | * Python: dropping support for 3.6, adding support for 3.10 343 | * Python: switch from AWScli v1 to v2 344 | * Kubectl: Bumping kubectl to 1.23.x. Updating Helm & misc tools. Removing kubectx & kubens 345 | * Kubectl: switch from AWScli v1 to v2 346 | * PyNode: switching from node 12.x to 14.x 347 | * PyNode: switch from AWScli v1 to v2 348 | * Terraform: switch from AWScli v1 to v2 349 | * Java: switch from AWScli v1 to v2 350 | 351 | 2022-02-28 352 | ---------- 353 | 354 | * PHP: installing xsl extension 355 | * PHP: workaround for installing sockets and zip extensions 356 | * Ansible: dropping support for 2.x & 3.x, adding a new 5.x.X image 357 | * Terraform: updating TF to 1.1.x, along with associated tools 358 | * PHP: bump to PHP 7.4.28, PHP 8.0.16 and PHP 8.1.3 (security update) 359 | * Java: upgrade Java 11 to 11.0.14 and 17 to 17.0.2 360 | 361 | 2022-01-31 362 | ---------- 363 | 364 | * Golang: add gocover-cobertura 365 | 366 | 2021-12-31 367 | ---------- 368 | 369 | * React-native: dropping support 370 | * PHP: remove support for PHP 7.3, update 7.4 and 8.0, create 8.1 371 | 372 | 2021-11-30 373 | ---------- 374 | 375 | * Percy: Switch to percy-cli instead of percy-agent 376 | * Scoutsuite: removing this image, as we're now using cloudsploit instead. 377 | * Kubectl: updating kubectl & associated tools. Removing eksctl & helmfile. Adding Kubent 378 | * Platformsh: bumping client to 3.71.0 379 | * Terraform: bumping to 1.0.11, along with associated tools 380 | * Dind: updating docker-compose to 2.1.1, trivy to 0.21.0 381 | 382 | 2021-10-31 383 | ---------- 384 | 385 | * Java: remove Java 8 image 386 | * Nodejs: add nodejs 16 image 387 | * Nodejs: remove nodejs 10 image 388 | * Nodejs: upgrade images to Debian 11 389 | * AWS: updating base image to python 3.10.x 390 | * Scoutsuite: updating base image to python 3.10.x 391 | * Terraform: updating base image to python 3.10.x 392 | * Terraform: updating to TF 1.0.x, terragrunt & infracost latest versions. Also dropping support for TF 0.13, 0.14, 0.15 393 | * Nodejs: upgrade images to Debian 11.1 394 | * PHP: remove support for PHP 7.2 395 | * PHP: bump to 7.3.31, 7.4.24 and 8.0.11 and use Alpine 3.13 as base image 396 | * PHP: update tools 397 | * Ansible: adding new ansible 2.10.x, 3.x.x & 4.x.x flavors 398 | 399 | 2021-09-30 400 | ---------- 401 | 402 | * Kubectl : bumping client to 1.22.x, along with associated tools updates 403 | * azure : bumping azure-cli version to 2.28.1 404 | * nodejs: update version to use the latest from 10, 12, and 14 series. 405 | * Removing jinja from build dependencies 406 | * Removing Dockerfile templating to enforce single version Dockerfile for dependabot 407 | * Pynode: adding python 3.9 image, dropping version 3.7 408 | * Java: remove Modd, Maven and http call to mime types 409 | * Java: add new Java 17 image 410 | * Java: migrate to temurin images 411 | 412 | 2021-08-31 413 | ---------- 414 | 415 | * Adding a new container flavour for Aquasecurity's Cloudsploit 416 | * Dind : removing libc6-compat to avoid name clashing, updating glibc version. 417 | * Golang : adding a 1.17.x image version 418 | * Golang : switching from python-pip to python3-pip 419 | 420 | 2021-07-31 421 | ---------- 422 | 423 | * bumping image version for bitcoind to 0.21.1 424 | * adding postgresql-client to PHP images 425 | * platformSh : bumping client to 3.67.x 426 | * ansible : bumping to latest 2.9.x release 427 | * azure : bumping azure-cli version 428 | * kubectl : bumping kubectl, kuztomize & other tools' versions 429 | * python : bumping base images minor versions 430 | * terraform : bumping terraform minor versions, along with terragrunt & associated tools 431 | * bumping base images for php, platformsh, ruby, azure, awslnx-systemd, scoutsuite, terraform, ansible, aws, golang 432 | 433 | 2021-06-30 434 | ---------- 435 | 436 | * bumping base image versions for Ruby, Ansible, AWS, Scoutsuite, Awslnx-systemd, Azure, Golang, Terraform, dind, sonar, kubectl, node 437 | * Dropping terraform 12 support 438 | * Python : misc dependencies updates 439 | * Upgrade PHP musl-dev version to 1.2.2-r1 (not for PHP 7.2) 440 | * Creating terraform 1.0.1 image 441 | 442 | 2021-05-31 443 | ---------- 444 | 445 | * Updating azure-cli to 2.24.0 446 | * Bumping sonar to 4.6.2 447 | * Bumping python base images to their latest versions 448 | * Updating kubectl to 1.21, along with all associated tools 449 | * Adding terraform 15.x image. Bumping other minor versions to the latest tag 450 | * Adding infracost CI script 451 | 452 | 2021-04-30 453 | ---------- 454 | 455 | * Upgrade Composer version to 2.0.12 (not for PHP 7.2) 456 | * Upgrade php-cs-fixer version to 2.18.5 (not for PHP 7.2) 457 | * Added a new Percy image 458 | 459 | 2021-03-31 460 | ---------- 461 | 462 | * add pcov in PHP images 463 | * add helmfile and helm diff plugin to kubectl images 464 | * Upgrade Golang version: 1.16.1 465 | * Upgrade Golang gitleaks version: 7.3.0 466 | * Upgrade Golang go-mod-upgrade version: 0.4.0 467 | * Upgrade Golang goswagger version: 0.26.1 468 | * Upgrade Golang ci-lint version: 1.38.0 469 | * Upgrade Golang migrate version: 4.14.1 470 | * Upgrade Golang testfixtures version: 3.5.0 471 | * Removing terraform from the azure image. Adding azure cli to the terraform image 472 | * Bumping Scoutsuite to 5.10.2 473 | * Bumping trivy to 0.16.0 474 | * Upgrade Infracost to 0.8.2 475 | * Add jq and bc to terraform image 476 | * Bumping kubectl to 1.20.5 along with misc kubernetes tools 477 | * Updating terraform 0.14.x image to 0.14.9 478 | 479 | 2021-02-28 480 | ---------- 481 | 482 | * Upgrade PHP versions to 7.3.27, 7.4.15 and 8.0.2 483 | * Upgrade Composer version to 2.0.10 (not for PHP 7.2) 484 | * Upgrade Iconv version to 1.15-r3 (not for PHP 7.2) 485 | * Upgrade musl-dev version to 1.2.2-r0 (not for PHP 7.2) 486 | * Upgrade php-cs-fixer version to 2.18.2 (not for PHP 7.2) 487 | * Upgrade Xdebug version to version 3.0.3 (not for PHP 7.2) 488 | 489 | 2021-01-29 490 | ---------- 491 | 492 | * Update node base image to debian:10.7-slim 493 | * Update kubectl base image to alpine:3.13 494 | * Update dind base image to docker:20.10.2-dind 495 | * Adding trivy to the dind image 496 | * Upgrade Java 8 to 8u282 and 11 to 11.0.10 497 | * Update platformsh base image to php:7.4-cli-alpine3.13 498 | * Update platformsh client to 3.64.x 499 | * Python : update base image versions 500 | * Chrome : update puppeteer to 1.13 to fix CVE 501 | * React-native : update base image to openjdk:8u282-jdk-slim (CVE fix) 502 | * BREAKING CHANGE: Upgrade Taskfile to v3.2.2 (drop compatibility with v1.x.x definition files) 503 | 504 | 2021-01-25 505 | ---------- 506 | 507 | * Add PHP image version 8.0.0 and bump composer, php_cs_fixer, xdebug & redis versions 508 | * Switch from [sensiolabs/security-checker](https://github.com/sensiolabs/security-checker) to [Local PHP Security Checker](https://github.com/fabpot/local-php-security-checker) (keep compatibility with existing binary name) 509 | * Removed IBM image & associated tools 510 | * Remove python 2.7 image (now EOL) 511 | * Add a terraform 0.14.x image, remove multiple 13.x versions, updated associated tools 512 | * Upgrade Kubectl to 1.20, along with associated k8s tools 513 | * Update Sonar client to 4.6.x 514 | 515 | 2020-12-31 516 | ---------- 517 | 518 | * Add a python 3.9 image 519 | * Add Infracost to the Terraform images 520 | 521 | 2020-11-30 522 | ---------- 523 | 524 | * Upgrade PHP versions to 7.2.34, 7.3.24 and 7.4.12 525 | * Upgrade Composer version to 2.0.4 526 | * Upgrade APCU version to 5.1.19 527 | * Upgrade php-cs-fixer version to 2.16.7 528 | * Upgrade Xdebug version to version 2.9.8 529 | * Upgrade musl-dev version to 1.1.24-r10 to fix php image build 530 | * Delete Composer plugin hirak/prestissimo 531 | * Fix missing awscli missing from Node and React Native 532 | * Upgrade Java 8 to 8u272 and 11 to 11.0.9 533 | * Update SmartPy version in tezosqa image 534 | 535 | 2020-10-31 536 | ---------- 537 | 538 | * Upgrade terraform to 0.13.4 and terragrunt to 0.25.3 and add jq to image 539 | * fix aws image dependencies with new pip resolver feature `--use-feature=2020-resolver` 540 | * fix smartpy version in tezosqa image 541 | * Upgrade Kubectl to 1.18.10 542 | * Upgrade Eksctl to 0.30.0 543 | * Upgrade Kubescore to 1.9.0 544 | * Upgrade Kustomize to 3.8.5 545 | * Upgrade Helm to 3.3.4 546 | * Upgrading Scoutsuite to 5.10.1 547 | 548 | 2020-09-30 549 | ---------- 550 | 551 | * Upgrade Golang version: 1.15.2 552 | * Upgrade Golang gitleaks version: 6.1.2 553 | * Upgrade Golang ci-lint version: 1.31.0 554 | * Upgrade Golang go-mod-upgrade version: 0.2.1 555 | * Upgrade Golang migrate version: 4.12.2 556 | * Upgrade Golang testfixtures version: 3.4.0 557 | * Add rsync to Golang image 558 | 559 | 2020-08-31 560 | ---------- 561 | 562 | * Add terraform version 0.13.1 563 | * Add rsync to aws image 564 | * Upgrade PHP composer version to 1.10.10 565 | * Upgrade PHP versions to 7.2.32, 7.3.20 and 7.4.8 566 | * Add musl-dev==1.1.24-r9 to fix php image build 567 | * Add jq in PHP image 568 | * Add terraform-compliance v1.2.11 to terraform image 569 | * Upgrade terraform to 0.12.29 in terraform and ibm images 570 | * Change terraform versionning to add patch version value 571 | * Upgrade IBM Cloud terraform provider to 1.10.0 572 | * Upgrade Golang version: 1.14.7 573 | * Update Kubectl to 1.18.6 + associated tools 574 | * Update Scoutsuite to 5.9.1 575 | * Add a new Terraform 0.13 image 576 | - Update Ansible to 2.9.10 577 | - Update Azure CLI to 2.10.1 578 | - Update Terraform complaince CLI to 1.3.2 579 | - Install awscli in kubectl image 580 | 581 | 2020-07-31 582 | ---------- 583 | 584 | * Add terragrunt v0.23.31 and git to terraform image 585 | * Add zip and make to the AWS image 586 | * Upgrade IBM Terraform provider to v1.8.1 587 | * Upgrade Golang version: 1.14.6 588 | * Upgrade Golang ci-lint version: 1.28.3 589 | * Upgrade Golang goswagger version: 0.25.0 590 | * Upgrade Golang go-mod-upgrade version: 0.2.0 591 | * Upgrade Golang testfixtures version: 3.3.0 592 | * Add go-bindata to golang image 593 | * Upgrade Java 8 to 8u262 and 11 to 11.0.8 594 | * Add [Taskfile](https://taskfile.dev) to the Node.js, Chrome, AWS and DinD images 595 | 596 | 2020-06-30 597 | ---------- 598 | 599 | * Upgrade bitcoind image to 0.20.0 600 | * Add PHP COMPOSER_MEMORY_LIMIT env var 601 | * Upgrade Java 8 to 8u252 and 11 to 11.0.7 602 | * Install IBM CLI plugin for IBM Functions 603 | * Upgrade Node 10 to 10.21.0 and 12 to 12.18.1 604 | * Add Node 14 image 605 | * Upgrade npm to 6.14.5 and nvm to 0.35.3 in Node images 606 | * Upgrade Golang version: 1.14.4 607 | * Upgrade Golang gitleaks version: 4.3.1 608 | * Upgrade Golang goswagger version: 0.24.0 609 | * Upgrade PHP composer version: 1.10.7 610 | * Upgrade PHP xdebug version: 2.9.6 611 | * Add tezosqa image with ligo, SmartPy and Pytezos 612 | 613 | 2020-05-28 614 | ---------- 615 | 616 | * Install helm on IBM image 617 | * Upgrade PHP version: 7.2.31, 7.3.18 and 7.4.6 618 | * Upgrade PHP composer version: 1.10.6 619 | * Upgrade PHP memcached extension version: 3.1.5 620 | * Upgrade PHP php-cs-fixer version: 2.16.3 621 | * Upgrade PHP redis extension version: 5.2.2 622 | * Upgrade PHP xdebug extension version: 2.9.5 623 | * Restore ssh2 extension in PHP images 624 | * Upgrade Golang version: 1.14.3 625 | * Add Gitleaks, GolangCI-Lint, go-mod-upgrade, go-swagger, go-mock, goimports, migrate, modd and testfixtures to Golang image 626 | * Add bitcoind image, version: 0.19.1 627 | * Add the following libraries into the php image: libcrypto1.1, libssl1.1 628 | * Add kubeval and kustomize to IBM image 629 | * Add AWS Terraform provider in IBM image 630 | * Add ibmcloud CLI cloud-databases plugin in IBM image 631 | * Upgrade IBM Terraform Provider to 1.5.3 632 | * Upgrade terraform to 0.12.26 in IBM Image 633 | 634 | 2020-04-30 635 | ---------- 636 | 637 | * Removing ansible 2.8 image 638 | * Upgrade Node images to debian 10.3 639 | * Move ibm image to Golang base image and build Null provider 640 | * Upgrade ibm provider to 1.2.4 641 | * Upgrade eksctl to 0.14.0 642 | * Migrate the CI to GitHub Actions 643 | * Increase DockerClient's timeout to 10 minutes 644 | * Rename dind-aws to dind and add all provider cli (aws, ibm, azure) 645 | * Add Helm cli to kubectl image 646 | * Add a workflow dedicated to checking PR mergeability 647 | * Install kubectl and kubernetes provider in IBM image 648 | * Upgrade IBM cli to 1.0.0 649 | * Upgrade IBM provider to 1.4.0 650 | * Upgrade scoutsuite to 5.8.1 651 | * Upgrade Azure cli to 2.4.0 652 | * Removing Arachni image 653 | * Upgrade misc Kubectl image components 654 | * Upgrade Terraform to 0.12.24 655 | 656 | 2020-02-28 657 | ---------- 658 | 659 | * Add mysql-client in PHP images 660 | * Add postgresql-client in java image 661 | * Upgrade Golang version: 1.14 662 | * Remove Glide, Gin and Modd from the golang image 663 | * Upgrade Java 8 to 8u242 and 11 to 11.0.6 664 | * Remove support for Node 8 665 | * Switch every python related images to debian buster slim base 666 | * Rename variable use for base image version in templated Dockerfile to `BASE_IMAGE_VERSION` 667 | * Upgrade Node 10 to 10.19.0, Node 12 to 12.16.1 and NPM to 6.13.7 668 | * Update Kubectl version (and associated tools) : 1.17 669 | * Upgrade ScoutSuite: 5.7 670 | * Adding Ansible to 2.9 in addition to 2.8 671 | * Upgrade Azure CLI to 2.1.0 and Terraform to 0.12.21 672 | * Create IBM image with terraform, ibm provider and ibmcloud cli 673 | * Rename serverless image into pynode to manage serverless and cdk use cases 674 | 675 | 2019-12-26 676 | ---------- 677 | 678 | * Upgrade the React Native image to Node 12.13 and NPM to 6.12.0 679 | * Remove Watchman, some exposed ports and the custom user from the React Native image 680 | * Fix a typo in the `nightly` tag name 681 | * Upgrade Java 8 to 8u232 and 11 to 11.0.5 682 | * Upgrade Serverless base image to use node:10-alpine3.10 (python 3.7 support) 683 | * Add PHP image version 7.4.0 684 | * Upgrade PHP version: 7.2.25 and 7.3.12 685 | * Upgrade APCu version: 5.1.18 686 | * Upgrade Composer version: 1.9.1 687 | * Upgrade php-cs-fixer version: 2.16.1 688 | * Upgrade Redis version: 5.1.1 689 | * Upgrade Security Checker version: 6.0.3 690 | * Upgrade XDEBUG version: 2.8.0 691 | * Add mysqli in PHP images 692 | * Upgrade Golang version: 1.13.5 693 | * Remove Subversion and Mercurial from the Java images 694 | * Upgrade Docker Compose: 1.25.0 695 | * Upgrade platform.sh CLI: 3.50.1 696 | * Upgrade Terraform: 0.12.18 697 | * Upgrade ScoutSuite: 5.5 698 | * Upgrade Serverless: 1.59.3 699 | * Add eksctl to the kubectl image 700 | * Update Kubectl version (and associated tools) : 1.16 701 | 702 | 2019-11-18 703 | ---------- 704 | 705 | * Fix Chrome image build 706 | * Upgrade Golang version: 1.13.4 707 | * Upgrade Serverless version: 1.57 708 | * Upgrade PHP version: 7.2.23 / 7.3.10 709 | * Upgrade memcached version: 3.1.4 710 | * Upgrade ssh2 version: 1.2 711 | * Upgrade Debian to 10.1 for Node images 712 | * Upgrade Node 12 image to 12.13 and NPM to 6.12.0 713 | * Upgrade Scoutsuite version: 5.4.0 714 | * Add Node & Npm to AWS image, in order to build & deploy AWS CDK 715 | 716 | 2019-09-19 717 | ---------- 718 | 719 | * CI: lock Python version to 2.7 720 | * Add gettext in dind-aws and PHP images 721 | * Fix build error in Chrome 722 | * Upgrade Java versions: 8u222, 11.0.4 723 | * Lock scss_lint version to fix issue with Ruby version 724 | * Upgrade Node version: 6.17.1, 8.16.0 725 | * Upgrade NVM version: 0.34.0 726 | * Add a new image PHP version 7.3 727 | * Add patch in PHP images 728 | * Upgrade PHP version: 7.2.22 729 | * Upgrade redis version extension: 5.0.2 730 | * Upgrade security checker version: 6.0.2 731 | * Upgrade PHP CS Fixer: 2.15.3 732 | * Upgrade Composer version: 1.9.0 733 | * Upgrade Xdebug version: 2.7.2 734 | * Upgrade Ruby version: 2.6.3 735 | * Remove support for PHP 7.1 736 | * Fix Java 8/11 image issues from debian:stretch-slim 737 | * Drop JDK 10 support 738 | * Migrate Java buildboxes to adoptopenjdk 739 | * AWS image now uses python3 740 | * Add new dockerfile "terraform" version 0.12.0 741 | * Fix Golang version for accurate image tag 742 | * Add a new image integrating NCC Scoutsuite 743 | * Change Ansible base image for python:2.7-alpine3.8 744 | * Refacto travis.py script, setup image definitions within a single configuration file 745 | * Upgrade Jinja to 2.10.1 746 | * Add a new image integrating node Serverless and python3 747 | * Add AmazonLinux image with Systemd 748 | * Add a new image with kubectl & other k8s tools 749 | * Add Platform.sh CLI image 750 | * Upgrade Python: 2.7.16, 3.7.4 751 | * Use only major Node version to name node images 752 | * Add Node 12 753 | * Upgrade ScoutSuite to 5.3.3 754 | * Create image with azure CLI and terraform 755 | * Upgrade Golang version: 1.13 756 | * Upgrade Serverless version: 1.51 757 | * Add aws-cli in serverless image 758 | * Core: change config file structure to allow volume mounting for local test scripts 759 | * Core: fix docker login & push in debug mode 760 | * Core: upgrade docker-py lib from 3.5.0 to 4.0.2 761 | * Remove support for Node 6 762 | * Add Kubeval to Kubectl images 763 | * Remove support for JDK 6 764 | 765 | 2019-04-05 766 | ---------- 767 | 768 | * Force PyYAML version to 3.13 in aws image 769 | * Added jq in aws image 770 | 771 | 2019-03-29 772 | ---------- 773 | 774 | * Lock rb-inotify version to fix issue with Ruby version 775 | * Upgrade Java versions: 8u181, 10.0.2, 11.0.1 776 | * Downgrade Maven version to 3.2.1 for Java 6 buildbox (Maven 3.2.3+ uses HTTPS by default) 777 | * Upgrade Golang version: 1.11 778 | * Added awsebcli to AWS buildbox 779 | * Remove support for PHP 5.6 780 | * Upgrade PHP version: 7.1.27, 7.2.16 781 | * Upgrade APCu version: 5.1.17 782 | * Upgrade Composer version: 1.8.4 783 | * Upgrade memcached version: 3.1.3 784 | * Upgrade Redis version: 4.3.0 785 | * Upgrade Sensiolabs' security-checker version: 5.0.3 786 | * Upgrade Xdebug version: 2.7.0 787 | * Fix repository of gnu-libiconv for PHP images 788 | * Remove php7-intl 789 | * Added graphviz and jq to Java buildbox 790 | * Fix debian sources list for Node buildbox 791 | * Upgrade Docker version to 18.06.3 and Docker Compose to 1.24.0 in dind-aws image 792 | * Upgrade Node version: 6.17.0, 8.15.1, 10.15.3 793 | * Upgrade Python version: 3.7.3 794 | * Upgrade Sonar version: 3.3.0.1492 795 | 796 | 2018-10-29 797 | ---------- 798 | 799 | * Add anchorecli in Python 2 800 | * Remove support for PHP 5.3 801 | * Add Java version 11 802 | * Add Arachni image version 1.5.1 803 | * Update Sonar download URL 804 | * Upgrade ci-helper: 0.0.6 805 | * Add Blackfire probe & client in PHP images 806 | * Use openjdk slim as base Java image 807 | * Add Java version 10.0.1 808 | * Add Java version 6 (with only JDK and Maven 3.2.1) 809 | * Use openjdk slim as base React Native image 810 | * Remove Maven and Gradle from React Native image 811 | * Add bash to Python images 812 | * Add an up to date mime types definition file for the images that use AWS CLI 813 | * Install PEAR in the PHP 5.3 image 814 | * Update Alpine Version for ansible, aws and sonar image: 3.8 815 | * Add `build-base`, `libffi-dev` and `openldap-dev` packages in Python images 816 | * Upgrade Pip version in Python images 817 | * Update dind-aws to use 18.06.1-ce-dind 818 | * Fix ansible build (move from python 2.7.14-r0 to 2.7.15-r1) 819 | * Java image : fix aws failed when removing pip 820 | * Upgrade Maven version : 3.2.5 821 | * Upgrade APCu version for PHP 7.1 and 7.2: 5.1.12 822 | * Upgrade Composer version for PHP 7.1 and 7.2: 1.7.2 823 | * Upgrade PHP version: 5.6.38, 7.1.23, 7.2.11 824 | * Upgrade Redis version for PHP 7.1 and 7.2: 4.1.1 825 | * Upgrade Xdebug version for PHP 7.1 and 7.2: 2.6.1 826 | * Fix install of intl extension in PHP images 827 | * Upgrade Node version: 8.12, 10.12 828 | * Upgrade NPM version for Node 8.12 and 10.10: 6.4.1 829 | * Upgrade NVM version: 0.33.11 830 | * Upgrade Python version: 3.7 831 | * Add a Chrome image (based on Alpine Node, with NPM, Yarn and Puppeteer) 832 | * Fix pip version to 18 and pipenv to 2018.7.1 to avoid recent conflict between these tools 833 | * Add dependencies for cpython libs in dind-aws image 834 | * Add `memcached`, `pgsql` and `ssh2` extensions in PHP images 835 | 836 | 2018-06-14 837 | ---------- 838 | 839 | * Add rsync in PHP images 840 | * Add exif extension in PHP images 841 | * Add PHP 7.2.6 842 | * Upgrade PHP version: 7.1.18 843 | * Upgrade Node version: 6.14.3, 8.11.3, 10.4.1 844 | * Upgrade Sonar Scanner: 3.2.0.1227 845 | * Upgrade ci-helper: 0.0.5 846 | 847 | 2018-05-18 848 | ---------- 849 | 850 | * Upgrade Docker version to 18.05.0 and Docker Compose to 1.21.2 in dind-aws image 851 | * Upgrade Node version: 6.14.2, 8.11.2, 9.11.1 852 | * Upgrade PHP version: 5.6.36, 7.1.17 853 | * Upgrade Composer version: 1.6.5 854 | * Upgrade PHP Redis version: 4.0.2 855 | * Upgrade Ruby version: 2.5.1 856 | * Add Python images: versions 2.7 and 3.6 857 | * Add tests on PHP images 858 | * Add React Native image 859 | * Upgrade Java version: 8u171-1\~webupd8\~0 860 | * Fix intl in PHP images 861 | 862 | 2018-04-05 863 | ---------- 864 | 865 | * Upgrade Python version in Ansible image: 2.7.14-r0 866 | * Upgrade Docker version to 18.03.0 and Docker Compose to 1.20.1 in dind-aws image 867 | * Upgrade Node version: 6.14.1, 8.11.1, 9.10.1 868 | * Upgrade PHP version: 5.6.35, 7.1.16 869 | * Upgrade APCu version for PHP 7.1: 5.1.11 870 | * Upgrade Composer version: 1.6.3 871 | * Upgrade PHP Redis version: 4.0.0 872 | * Upgrade Sensiolabs' security-checker version for PHP 7: 4.1.8 873 | * Upgrade Xdebug version for PHP 7: 2.6.0 874 | * Use Alpine binary of ci-helper for Ansible, AWS, DIND-AWS, PHP >= 5.6, Ruby and Sonar images 875 | * Fix deprecated MAINTAINER instruction 876 | * BC break: PHP image is now based on Alpine 877 | - intl for PHP 7.2 is not released yet, so image 7.2 is not available anymore 878 | * Upgrade modd version: 0.5 879 | 880 | 2018-01-25 881 | ---------- 882 | 883 | * Upgrade NPM version in Node image (fix node@9 incompatibility): 884 | - node v8.9.4 -> npm v5.6.0 885 | - node v9.4.0 -> npm v5.6.0 886 | * Upgrade ci-helper version: 0.0.4 887 | * Upgrade Docker version to 18.01.0 and Docker Compose to 1.18.0 in dind-aws image 888 | * Upgrade Java version: 8u161-1\~webupd8\~0 889 | * Upgrade Node version: 6.12.3, 8.9.4, 9.4.0 890 | * Upgrade APCu version: 5.1.9 891 | * Upgrade Composer version: 1.6.2 892 | * Upgrade PHP Redis version: 3.1.6 893 | * Upgrade Sensiolabs' security-checker version for PHP 7: 4.1.7 894 | * Upgrade PHP version: 5.6.33, 7.2.1 895 | * Upgrade Ruby version: 2.5.0 896 | * Add rsync to aws image 897 | * Add zip to aws image 898 | * Add postgresql-client to PHP image 899 | 900 | 2017-12-12 901 | ---------- 902 | 903 | * Add tzdata into sonar image 904 | * Upgrade Ruby version: 2.4.2 905 | * Upgrade Glide version: 0.13.1 906 | * Upgrade Docker Compose version: 1.17.1 907 | * Upgrade Composer version: 1.5.5 908 | * Upgrade PHP version: 5.6.32, 7.1.12 909 | * Upgrade Node version: 6.12.2, 8.9.3, 9.2.1 910 | * Allow specifying NPM version in Node image : 911 | - node v6.11.3 -> npm v3.10.10 912 | - node v8.9.1 -> npm v5.5.1 913 | - node v9.2.0 -> npm v5.5.1 914 | * Add rsync and tzdata into dind-aws image 915 | * Add Sensiolabs' security-checker to PHP images 916 | * Add make to aws image 917 | 918 | 2017-11-01 919 | ---------- 920 | 921 | * BC break: dind-aws image is now based on Alpine 922 | * Upgrade Docker version to 17.09 and Docker Compose to 1.16.1 in dind-aws image 923 | * Upgrade Java version: 8u151-1\~webupd8\~0 924 | * Upgrade PHP version: 5.6.31, 7.1.9 925 | * Upgrade PHP Redis: 3.1.4 926 | * Add Node 8.6 927 | * Upgrade node 6.11.3 928 | * Remove Node 4.8 929 | * Upgrade golang: 1.9 (edit: wrong information, still version 1.8) 930 | * Upgrade Glide: 0.13.0 931 | * Add Ansible: 2.2.3.0 932 | * Add Sonar Scanner: 3.0.3.778 933 | 934 | 2017-07-17 935 | ---------- 936 | 937 | * Upgrade PhpRedis: 3.1.3 938 | * Add a "new" PHP image (5.3) for legacy support 939 | * Upgrade Node version: 4.8.4, 6.11.1, 7.10.1 940 | * Upgrade PHP version: 7.1.7 941 | * Upgrade composer version: 1.4.2 942 | * Upgrade the base Debian image: 8.7 943 | * Upgrade Java version: 8u131 944 | * Add imagemagick, gcc and g++ into Node image 945 | * Add a new Ruby image 946 | * Add composer hirak/prestissimo plugin 947 | * Upgrade go version: 1.8 948 | 949 | 2017-03-30 950 | ---------- 951 | 952 | * Upgrade Java version: 8u121-1\~webupd8\~2 953 | * Add PHP extension: intl 954 | * Add bzip2 into Node, Java and PHP images 955 | * Upgrade ci-helper to version 0.0.3 to support gitlab 9.x 956 | * Update PHP version: 7.1.3 957 | * Update Node version: 4.8.1, 6.10.1, 7.8.0 958 | 959 | 2017-02-07 960 | ---------- 961 | 962 | * Add PHP extension for Redis 963 | * Add PHP version: 7.1.1 964 | * Remove PHP version: 7.0.14 965 | * Upgrade PHP version: 5.6.30 966 | * Upgrade APCu version: 5.1.8 967 | * Upgrade composer version: 1.3.2 968 | * Upgrade Java version: 8u121 969 | * Upgrade Maven version: 3.3.9 970 | * Upgrade Node version: 4.7.3, 6.9.5, 7.5.0 971 | * Add a new Golang image 972 | 973 | 2017-01-06 974 | ---------- 975 | 976 | * Add a new AWS image with awscli and python libs 977 | * Add CI-Helper 0.0.2 into base image 978 | * Add a new DIND AWS image with AWS Cli 979 | * Add Modd 0.0.4 into base image 980 | * Upgrade Node version: 4.7.2, 6.9.4, 7.4.0 981 | * Upgrade PHP version: 5.6.29, 7.0.14 982 | * Upgrade composer version: 1.3.0 983 | 984 | 2016.12-19 985 | ---------- 986 | 987 | * Slightly reduce the size of the Java image 988 | * Add the AWS CLI to all images 989 | * Add packages ocaml & libelf-dev for FlowType (Node) checking 990 | * Upgrade Node versions: 4.7.0, 7.2.1 991 | * Upgrade PHP: 7.0.14 992 | * Fix Java Version to 8u111+8u111arm-1~webupd8~0 993 | * Fix composer version to 1.2.4 994 | * Migrate builds and tests to TravisCI, add support for nightly build 995 | * Tweak PHP build configuration 996 | 997 | 2016.12.05 998 | ---------- 999 | 1000 | * Fix maven install on Java 1001 | * Fix clean commands 1002 | * Update Yarn 0.18 1003 | 1004 | 2016.11.25 1005 | ---------- 1006 | 1007 | * Use Debian 8.6 as base image 1008 | * Upgrade PHP versions: 5.6.28, 7.0.13 1009 | * Add driver pdo_pgsql in PHP images 1010 | * Add cache APCu in PHP images 1011 | * Upgrade Node versions: 4.6.2, 6.9.1 (LTS) 1012 | * Add Node 7.0.0 1013 | * Add maven to java8 1014 | * Remove global packages install from node: gulp, bower, grunt-cli, webpack, browserify, babel, eslint, eslint-plugin-react, eslint-plugin-angular, eslint-config-standard, eslint-plugin-promise, eslint-plugin-standard. 1015 | * Add Yarn to node 1016 | * Update nvm to 0.32.1 1017 | 1018 | 2016.09.16 1019 | ---------- 1020 | 1021 | * Use Debian 8.5 as base image 1022 | * Upgrade PHP versions: 5.6.22, 7.0.10 1023 | * Remove node versions: 4.3, 6.0, 5.7 1024 | * Add node version: 6.5 1025 | * Upgrade node version: 4.5.0 1026 | * Updrade node tools: grunt-cli@1.2, webpack@1.13, estlint@2.13, eslint-plugin-react@5.2, eslint-plugin-angular@1.1, eslint-config-standard@5.3, eslint-plugin-promise@1.3 and eslint-plugin-standard@1.3. 1027 | 1028 | 2016.05.03 1029 | ---------- 1030 | 1031 | * Bump versions 2016.05.03 1032 | * Node: 4.3.2, 4.4.3, 5.7.1, 6.0.0 1033 | * PHP: 5.6.20, 7.0.5 1034 | 1035 | 2016.05-DEV 1036 | ----------- 1037 | 1038 | * Add NodeJS 4.4 and 6.0.0, remove 0.12 image. 1039 | * Upgrade NodeJS versions: 4.3.2. 4.4.3, 5.7.1, 6.0.0 1040 | * Upgrade PHP versions: 5.6.20, 7.0.5 1041 | * Remove bashrc sourcing for NodeJS and PHP images. 1042 | * Use Debian 8.4 as base image 1043 | 1044 | 2016.03-DEV 1045 | ----------- 1046 | 1047 | * PHP 1048 | - 7.0.3 1049 | - 5.6.18 1050 | - composer / php-cs-fixer 1051 | 1052 | * NodeJs 1053 | - 0.12.10 1054 | - npm@2 1055 | - gulp@3.9 1056 | - bower@1.7 1057 | - grunt-cli@0.1 1058 | - webpack@1.12 1059 | - browserify@13.0 1060 | - babel@6.5 1061 | - eslint@2.0 1062 | - eslint-plugin-react@3.16 1063 | - eslint-plugin-angular@0.15 1064 | - eslint-config-standard@5.1 1065 | - eslint-plugin-promise@1.0 1066 | - eslint-plugin-standard@1.3 1067 | 1068 | - 4.3.0 1069 | - npm@3 1070 | - gulp@3.9 1071 | - bower@1.7 1072 | - grunt-cli@0.1 1073 | - webpack@1.12 1074 | - browserify@13.0 1075 | - babel@6.5 1076 | - eslint@2.0 1077 | - eslint-plugin-react@3.16 1078 | - eslint-plugin-angular@0.15 1079 | - eslint-config-standard@5.1 1080 | - eslint-plugin-promise@1.0 1081 | - eslint-plugin-standard@1.3 1082 | 1083 | - 5.7.0 1084 | - npm@3 1085 | - gulp@3.9 1086 | - bower@1.7 1087 | - grunt-cli@0.1 1088 | - webpack@1.12 1089 | - browserify@13.0 1090 | - babel@6.5 1091 | - eslint@2.0 1092 | - eslint-plugin-react@3.16 1093 | - eslint-plugin-angular@0.15 1094 | - eslint-config-standard@5.1 1095 | - eslint-plugin-promise@1.0 1096 | - eslint-plugin-standard@1.3 1097 | 1098 | 2014.15-DEV 1099 | ----------- 1100 | 1101 | GitlabCi can handle an image per job. So there is no need to have an all-in-one image. 1102 | 1103 | PHP Images: 1104 | 1105 | - php5.6 1106 | - php7.0 1107 | 1108 | NodeJs Images: 1109 | 1110 | - node0.12 1111 | - node4.3 1112 | - node5.7 1113 | --------------------------------------------------------------------------------