Skip to content
Merged

capi #182

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
78 changes: 78 additions & 0 deletions .github/workflows/capi.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
name: capi
permissions:
contents: read

on:
push:
branches: [ capi ]
workflow_dispatch:

env:
REGISTRY_NAME: "${{ secrets.MY_HUB_NAME }}"
REGISTRY_USER: "${{ secrets.MY_HUB_USER }}"
REGISTRY_PASS: "${{ secrets.MY_HUB_PASSWORD }}"
BUILDX_NO_DEFAULT_ATTESTATIONS: 1
REPO_EKS_PREFIX: ${{ secrets.REPO_EKS_PREFIX }}
REPO_EKS_USER: ${{ secrets.REPO_EKS_USER }}
REPO_EKS_TOKEN: ${{ secrets.REPO_EKS_TOKEN }}

jobs:
build:
name: Build
runs-on: ubuntu-latest
steps:

- name: Get image tag
id: tag
run: |
echo "tag=$(date +'%Y%m%d%H%M')" >> $GITHUB_ENV

- uses: actions/checkout@v7

- name: Login to Registry
uses: docker/login-action@v4
with:
registry: ${{ env.REGISTRY_NAME }}
username: ${{ env.REGISTRY_USER }}
password: ${{ env.REGISTRY_PASS }}

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v4

- name: Clone eks-kubean
run: |
git clone --depth 1 \
https://${{ env.REPO_EKS_USER }}:${{ env.REPO_EKS_TOKEN }}@${{ env.REPO_EKS_PREFIX }}/eks-kubean.git eks-kubean
env:
GIT_SSL_NO_VERIFY: 1

- name: Clone eks-cluster-api
run: |
git clone --depth 1 \
https://${{ env.REPO_EKS_USER }}:${{ env.REPO_EKS_TOKEN }}@${{ env.REPO_EKS_PREFIX }}/eks-cluster-api.git eks-cluster-api
env:
GIT_SSL_NO_VERIFY: 1

- name: Clone eks-cluster-api-provider
run: |
git clone --depth 1 \
https://${{ env.REPO_EKS_USER }}:${{ env.REPO_EKS_TOKEN }}@${{ env.REPO_EKS_PREFIX }}/eks-cluster-api-provider.git eks-cluster-api-provider
env:
GIT_SSL_NO_VERIFY: 1

- name: Clone captain
run: |
git clone --depth 1 \
https://${{ env.REPO_EKS_USER }}:${{ env.REPO_EKS_TOKEN }}@${{ env.REPO_EKS_PREFIX }}/captain.git captain
env:
GIT_SSL_NO_VERIFY: 1

- name: Docker Buildx (multi-arch)
run: |
docker buildx build \
--no-cache \
--provenance false --sbom false \
--platform linux/amd64,linux/arm64 \
--output "type=image,push=true" \
--tag ${{ env.REGISTRY_NAME }}/multiarch/capi:${{ env.tag }} \
--file ./Dockerfile-capi .
83 changes: 83 additions & 0 deletions Dockerfile-capi
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
# syntax=docker/dockerfile:1.4

FROM --platform=$BUILDPLATFORM golang:1.26-bookworm AS build

ARG TARGETOS
ARG TARGETARCH
ARG TARGETPLATFORM
ARG BUILDPLATFORM

ENV GO111MODULE=on

WORKDIR /build

# ============================================================
# 1. eks-kubean: CRD + 2 binaries
# ============================================================
COPY eks-kubean /build/eks-kubean

WORKDIR /build/eks-kubean
RUN curl -fsSLo /usr/local/bin/kubectl "https://dl.k8s.io/release/$(curl -Ls https://dl.k8s.io/release/stable.txt)/bin/${BUILDPLATFORM}/kubectl" \
&& chmod +x /usr/local/bin/kubectl

RUN mkdir -p /crds/kubean \
&& cp api/charts/crds/*.yaml /crds/kubean/ \
&& CGO_ENABLED=0 GOOS=linux GOARCH=${TARGETARCH} go mod vendor \
&& CGO_ENABLED=0 GOOS=linux GOARCH=${TARGETARCH} go build -mod vendor -o /bins/kubean-operator ./cmd/kubean-operator/main.go \
&& CGO_ENABLED=0 GOOS=linux GOARCH=${TARGETARCH} go build -mod vendor -o /bins/kubean-admission ./cmd/kubean-admission/main.go

# ============================================================
# 2. eks-cluster-api: CRD + 1 binary (manager)
# ============================================================
COPY eks-cluster-api /build/eks-cluster-api

WORKDIR /build/eks-cluster-api
RUN kubectl kustomize config/crd > /crds/cluster-api.yaml \
&& CGO_ENABLED=0 GOOS=linux GOARCH=${TARGETARCH} go build -o /bins/cluster-api-manager .

# ============================================================
# 3. eks-cluster-api-provider: CRD + 2 binaries (manager + ansible-controller)
# ============================================================
COPY eks-cluster-api-provider /build/eks-cluster-api-provider

WORKDIR /build/eks-cluster-api-provider
RUN kubectl kustomize config/crd > /crds/capo.yaml \
&& CGO_ENABLED=0 GOOS=linux GOARCH=${TARGETARCH} go build -ldflags "-extldflags '-static'" -o /bins/capo-manager . \
&& CGO_ENABLED=0 GOOS=linux GOARCH=${TARGETARCH} go build -ldflags "-extldflags '-static'" -o /bins/ansible-controller ./cmd/ansible-controller

# ============================================================
# Runtime image
# ============================================================
COPY captain /opt/captain

FROM python:3.10-slim

ARG TARGETOS
ARG TARGETARCH
ARG TARGETPLATFORM

RUN apt-get update && apt-get install -y --no-install-recommends \
ca-certificates \
curl \
&& rm -rf /var/lib/apt/lists/* \
&& curl -fsSLo /usr/local/bin/kubectl "https://dl.k8s.io/release/$(curl -Ls https://dl.k8s.io/release/stable.txt)/bin/linux/${TARGETARCH}/kubectl" \
&& chmod +x /usr/local/bin/kubectl

RUN curl -LsSf https://astral.sh/uv/install.sh | sh \
&& /root/.local/bin/uv venv /opt/venv \
&& /root/.local/bin/uv pip install --python /opt/venv/bin/python \
pbr>=1.6 \
"ansible==2.10.6" \
netaddr \
"jinja2>=2.9.6" \
&& rm -rf /root/.local/bin/uv /root/.local/share/uv /root/.cache/uv \
&& find /opt/venv -type d -name __pycache__ -exec rm -rf {} + 2>/dev/null || true \
&& find /opt/venv -name '*.pyc' -delete

ENV PATH="/opt/venv/bin:/root/.local/bin:${PATH}"

COPY --from=build /crds /crds
COPY --from=build /bins /bins
COPY --from=build /opt/captain /opt/captain

CMD ["/bin/bash"]
57 changes: 57 additions & 0 deletions capi-examples/crd-install-job.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
apiVersion: batch/v1
kind: Job
metadata:
name: install-crds
namespace: capi
spec:
ttlSecondsAfterFinished: 0
template:
spec:
restartPolicy: OnFailure
serviceAccountName: crd-installer
containers:
- name: installer
image: your-registry/capi-controller:latest
command:
- /bin/bash
- -c
- |
set -e
for f in /crds/kubean/*.yaml; do
kubectl apply -f "$f"
done
for f in /crds/cluster-api/*.yaml; do
kubectl apply -f "$f"
done
for f in /crds/capo/*.yaml; do
kubectl apply -f "$f"
done
echo "All CRDs installed successfully."
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: crd-installer
namespace: capi
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: crd-installer
rules:
- apiGroups: ["apiextensions.k8s.io"]
resources: ["customresourcedefinitions"]
verbs: ["get", "list", "create", "update", "patch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: crd-installer
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: crd-installer
subjects:
- kind: ServiceAccount
name: crd-installer
namespace: capi
Loading