diff --git a/Makefile b/Makefile index 7042fd7d..8ba88d24 100644 --- a/Makefile +++ b/Makefile @@ -24,6 +24,9 @@ CI_IMAGE_TAG ?= latest REPO_URL ?= https://github.com/openshift-online/rosa-regional-platform-api GIT_REF ?= main +# Container engine: prefer podman, fall back to docker +CONTAINER_ENGINE ?= $(shell command -v podman 2>/dev/null || command -v docker 2>/dev/null) + # Detect host platform for native builds HOST_OS := $(shell uname -s | tr '[:upper:]' '[:lower:]') HOST_ARCH := $(shell uname -m) @@ -69,8 +72,8 @@ help: @echo " verify - Verify go.mod is tidy" @echo "" @echo "Docker:" - @echo " image - Build Docker image" - @echo " image-push - Push Docker image" + @echo " image - Build container image" + @echo " image-push - Push container image" @echo " image-e2e - Build E2E test container (single platform)" @echo " image-e2e-multiarch - Build E2E test container (multiarch)" @echo " image-e2e-push-multiarch - Build and push E2E test container (multiarch)" @@ -186,9 +189,9 @@ lint: # Run linter in CI container with fresh clone (reproduces Prow CI exactly) lint-ci-container: @echo "Building CI container image..." - docker build -f ci/Containerfile -t $(CI_IMAGE_REPO):$(CI_IMAGE_TAG) . + $(CONTAINER_ENGINE) build -f ci/Containerfile -t $(CI_IMAGE_REPO):$(CI_IMAGE_TAG) . @echo "Running linter in CI container with fresh clone from $(REPO_URL)@$(GIT_REF)..." - docker run --rm \ + $(CONTAINER_ENGINE) run --rm \ $(CI_IMAGE_REPO):$(CI_IMAGE_TAG) \ bash -c "git clone $(REPO_URL) /tmp/repo && cd /tmp/repo && git checkout $(GIT_REF) && ./ci/lint.sh" @@ -197,21 +200,21 @@ clean: rm -f $(BINARY_NAME) rm -f coverage.out coverage.html -# Build Docker image +# Build container image image: - docker build --platform $(GOOS)/$(GOARCH) -t $(IMAGE_REPO):$(IMAGE_TAG) . - docker tag $(IMAGE_REPO):$(IMAGE_TAG) $(IMAGE_REPO):$(GIT_SHA) + $(CONTAINER_ENGINE) build --platform $(GOOS)/$(GOARCH) -t $(IMAGE_REPO):$(IMAGE_TAG) . + $(CONTAINER_ENGINE) tag $(IMAGE_REPO):$(IMAGE_TAG) $(IMAGE_REPO):$(GIT_SHA) # Build E2E test container (single platform) image-e2e: - docker build -f Containerfile.e2e \ + $(CONTAINER_ENGINE) build -f Containerfile.e2e \ --platform $(GOOS)/$(GOARCH) \ -t $(IMAGE_REPO)-e2e:$(IMAGE_TAG) . - docker tag $(IMAGE_REPO)-e2e:$(IMAGE_TAG) $(IMAGE_REPO)-e2e:$(GIT_SHA) + $(CONTAINER_ENGINE) tag $(IMAGE_REPO)-e2e:$(IMAGE_TAG) $(IMAGE_REPO)-e2e:$(GIT_SHA) # Build E2E test container for multiple architectures image-e2e-multiarch: - docker buildx build -f Containerfile.e2e \ + $(CONTAINER_ENGINE) buildx build -f Containerfile.e2e \ --platform $(PLATFORMS) \ -t $(IMAGE_REPO)-e2e:$(IMAGE_TAG) \ -t $(IMAGE_REPO)-e2e:$(GIT_SHA) \ @@ -219,7 +222,7 @@ image-e2e-multiarch: # Build and push E2E test container for multiple architectures image-e2e-push-multiarch: - docker buildx build -f Containerfile.e2e \ + $(CONTAINER_ENGINE) buildx build -f Containerfile.e2e \ --platform $(PLATFORMS) \ -t $(IMAGE_REPO)-e2e:$(IMAGE_TAG) \ -t $(IMAGE_REPO)-e2e:$(GIT_SHA) \ @@ -240,7 +243,7 @@ GINKGO_CMD += --junit-report=junit.xml --output-dir=/app/test-results ./test/e2e test-e2e-container: image-e2e-multiarch @echo "✅ Exporting static credentials from profile $(AWS_PROFILE)..." @eval "$$(aws configure export-credentials --profile $(AWS_PROFILE) --format env-no-export)" && \ - docker run --rm \ + $(CONTAINER_ENGINE) run --rm \ -e E2E_BASE_URL="$(BASE_URL)" \ -e E2E_ACCOUNT_ID="$(E2E_ACCOUNT_ID)" \ -e AWS_ACCESS_KEY_ID="$$AWS_ACCESS_KEY_ID" \ @@ -251,10 +254,10 @@ test-e2e-container: image-e2e-multiarch $(IMAGE_REPO)-e2e:$(IMAGE_TAG) \ $(GINKGO_CMD) -# Push Docker image +# Push container image image-push: image - docker push $(IMAGE_REPO):$(IMAGE_TAG) - docker push $(IMAGE_REPO):$(GIT_SHA) + $(CONTAINER_ENGINE) push $(IMAGE_REPO):$(IMAGE_TAG) + $(CONTAINER_ENGINE) push $(IMAGE_REPO):$(GIT_SHA) # Run locally run: build diff --git a/README.md b/README.md index 1102104e..9670c7dc 100644 --- a/README.md +++ b/README.md @@ -195,11 +195,11 @@ make test-e2e-container \ - Set `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` directly, OR - Ensure your credentials file contains all necessary settings -**Or use Docker/Podman directly**: +**Or use Podman/Docker directly**: Standard approach (mounts entire `~/.aws` directory): ```bash -docker run --rm \ +podman run --rm \ -e E2E_BASE_URL="https://xxxxx.execute-api.us-east-2.amazonaws.com/prod" \ -e E2E_ACCOUNT_ID="123456789012" \ -e AWS_PROFILE="my-aws-profile" \ @@ -212,7 +212,7 @@ docker run --rm \ With a custom credentials directory: ```bash -docker run --rm \ +podman run --rm \ -e E2E_BASE_URL="https://xxxxx.execute-api.us-east-2.amazonaws.com/prod" \ -e AWS_PROFILE="my-profile" \ -e AWS_REGION="us-east-2" \ @@ -261,16 +261,9 @@ make test-e2e-container \ make test-e2e-container BASE_URL="${API_URL}" ``` -**Using Podman instead of Docker**: +**Using Docker instead of Podman**: ```bash -# Replace 'docker' with 'podman' in any command -podman run --rm \ - -e E2E_BASE_URL="https://xxxxx.execute-api.us-east-2.amazonaws.com/prod" \ - -e AWS_PROFILE="my-profile" \ - -e AWS_SDK_LOAD_CONFIG=1 \ - -v $(pwd)/test-results:/app/test-results \ - -v ~/.aws:/root/.aws:ro \ - quay.io/openshift-online/rosa-regional-platform-api-e2e:latest +# Replace 'podman' with 'docker' in any command, or set CONTAINER_ENGINE=docker for make targets ``` #### Troubleshooting AWS Credentials @@ -341,7 +334,7 @@ Or, get temporary credentials from your credential process locally and pass them aws configure export-credentials --profile rrp-chris-regional_cluster --format env # Then use the output to set env vars and run without mounting credentials -docker run --rm \ +podman run --rm \ -e E2E_BASE_URL="https://xxxxx.execute-api.us-east-2.amazonaws.com/prod" \ -e AWS_ACCESS_KEY_ID="..." \ -e AWS_SECRET_ACCESS_KEY="..." \ diff --git a/ci/build-push-image.sh b/ci/build-push-image.sh index 28aec55d..64cf5cb6 100755 --- a/ci/build-push-image.sh +++ b/ci/build-push-image.sh @@ -20,13 +20,13 @@ SHORT_SHA="${GIT_SHA:0:7}" echo "Building image: ${IMAGE_REPO}:${SHORT_SHA}" -# Detect container runtime -if command -v docker &>/dev/null; then - RUNTIME=docker -elif command -v podman &>/dev/null; then +# Detect container runtime (prefer podman) +if command -v podman &>/dev/null; then RUNTIME=podman +elif command -v docker &>/dev/null; then + RUNTIME=docker else - echo "ERROR: neither docker nor podman found" >&2 + echo "ERROR: neither podman nor docker found" >&2 exit 1 fi