diff --git a/.github/actions/setup-docker/action.yml b/.github/actions/setup-docker/action.yml new file mode 100644 index 000000000..5dc61c418 --- /dev/null +++ b/.github/actions/setup-docker/action.yml @@ -0,0 +1,128 @@ +name: "Setup Docker" +description: "Install Docker from static binaries" + +inputs: + version: + description: "Docker version to install" + required: false + default: "29.0.0" + architecture: + description: "Architecture to install (x86_64 or aarch64)" + required: false + default: "x86_64" + +runs: + using: "composite" + steps: + - name: Stop existing Docker daemon + shell: bash + run: | + set -euo pipefail + + echo "Stopping existing Docker daemon..." + sudo systemctl stop docker.socket || true + sudo systemctl stop docker.service || true + sudo systemctl stop containerd.service || true + + # Kill any remaining processes + sudo pkill -9 dockerd || true + sudo pkill -9 containerd || true + + # Clean up pid files + sudo rm -f /var/run/docker.pid || true + sudo rm -f /run/docker.pid || true + sudo rm -f /var/run/containerd/containerd.pid || true + + # Wait a moment for cleanup + sleep 2 + + echo "Existing Docker daemon stopped" + + - name: Download and install Docker + shell: bash + run: | + set -euo pipefail + + DOCKER_VERSION="${{ inputs.version }}" + DOCKER_ARCH="${{ inputs.architecture }}" + DOCKER_URL="https://download.docker.com/linux/static/stable/${DOCKER_ARCH}/docker-${DOCKER_VERSION}.tgz" + + echo "Downloading Docker ${DOCKER_VERSION} for ${DOCKER_ARCH}..." + curl -fsSL "${DOCKER_URL}" -o /tmp/docker.tgz + + echo "Extracting Docker binaries..." + tar -xzf /tmp/docker.tgz -C /tmp + + echo "Installing Docker binaries to /usr/local/bin..." + sudo cp /tmp/docker/* /usr/local/bin/ + sudo chmod +x /usr/local/bin/docker* + sudo chmod +x /usr/local/bin/containerd* + sudo chmod +x /usr/local/bin/ctr + sudo chmod +x /usr/local/bin/runc + + echo "Cleaning up..." + rm -rf /tmp/docker /tmp/docker.tgz + + echo "Docker binaries installed successfully" + docker --version + + - name: Configure and start Docker daemon + shell: bash + run: | + set -euo pipefail + + # Create containerd config directory + sudo mkdir -p /etc/containerd + + # Generate default containerd config + sudo containerd config default | sudo tee /etc/containerd/config.toml + + # Create Docker daemon config + sudo mkdir -p /etc/docker + cat </dev/null 2>&1; then + echo "ERROR: containerd failed to start" + ps aux | grep containerd || true + exit 1 + fi + echo "containerd is ready" + + echo "Starting dockerd..." + sudo dockerd --host=unix:///var/run/docker.sock & + + # Wait for Docker daemon to be ready + echo "Waiting for Docker daemon to be ready..." + timeout=60 + elapsed=0 + while ! docker info >/dev/null 2>&1; do + if [ $elapsed -ge $timeout ]; then + echo "ERROR: Docker daemon failed to start within ${timeout} seconds" + echo "--- dockerd logs ---" + sudo journalctl -u docker --no-pager -n 50 || true + echo "--- containerd logs ---" + sudo journalctl -u containerd --no-pager -n 50 || true + echo "--- processes ---" + ps aux | grep -E 'docker|containerd' || true + exit 1 + fi + sleep 1 + elapsed=$((elapsed + 1)) + done + + echo "Docker daemon is ready" + docker info diff --git a/.github/workflows/_integration_tests.yml b/.github/workflows/_integration_tests.yml index 66e8ca141..447964a00 100644 --- a/.github/workflows/_integration_tests.yml +++ b/.github/workflows/_integration_tests.yml @@ -153,8 +153,7 @@ jobs: MIN_VERSION="${{ matrix.test.min_gateway_version }}" [ "$(printf '%s\n' "$MIN_VERSION" "$ACTUAL_VERSION" | sort --version-sort | head -n1)" == "$MIN_VERSION" ] - # We need at least Docker v28.1 which is not yet available on GitHub actions runners - - uses: docker/setup-docker-action@b60f85385d03ac8acfca6d9996982511d8620a19 # v4.3.0 + - uses: ./.github/actions/setup-docker - name: Seed database run: docker compose run elixir /bin/sh -c 'cd apps/domain && mix ecto.migrate --migrations-path priv/repo/migrations --migrations-path priv/repo/manual_migrations && mix ecto.seed' - name: Start docker compose in the background diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 45aee63aa..acc1f41cc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -286,8 +286,7 @@ jobs: - uses: ./.github/actions/ghcr-docker-login with: github_token: ${{ secrets.GITHUB_TOKEN }} - # We need at least Docker v28.1 which is not yet available on GitHub actions runners - - uses: docker/setup-docker-action@b60f85385d03ac8acfca6d9996982511d8620a19 # v4.3.0 + - uses: ./.github/actions/setup-docker - name: Seed database run: docker compose run elixir /bin/sh -c 'cd apps/domain && mix ecto.migrate --migrations-path priv/repo/migrations --migrations-path priv/repo/manual_migrations && mix ecto.seed' - name: Increase max UDP buffer sizes