Skip to content

Commit 5e722f0

Browse files
authored
Merge pull request #103 from kbst/buildimages
Distribute images to speed up automation II
2 parents 51b49bf + da2ba23 commit 5e722f0

File tree

6 files changed

+257
-207
lines changed

6 files changed

+257
-207
lines changed

.github/actions/build_artifacts/dist.py

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,29 @@
99
SRCDIR = 'quickstart/src'
1010
DISTDIR = 'quickstart/_dist'
1111

12+
13+
def replace_version(dist_path, file_name, context):
14+
# Replace templated variable with version in clusters.tf
15+
jinja = Environment(loader=FileSystemLoader(dist_path))
16+
template = jinja.get_template(file_name)
17+
data = template.render(context)
18+
19+
with open(f'{dist_path}/{file_name}', 'w') as f:
20+
f.write(data)
21+
# always include newline at end of file
22+
f.write('\n')
23+
24+
1225
# Use tag as version, fallback to commit sha
1326
version = environ.get('GITHUB_SHA')
27+
# Non tagged images go to a different image repository
28+
image_name = 'kubestack/framework-dev'
29+
1430
gitref = environ.get('GITHUB_REF')
1531
if gitref.startswith('refs/tags/'):
1632
version = gitref.replace('refs/tags/', '')
33+
# Tagged releases go to main image repository
34+
image_name = 'kubestack/framework'
1735

1836
# Clean DISTDIR
1937
if isdir(DISTDIR):
@@ -38,14 +56,12 @@
3856
copytree(manifests_src, manifests_dist)
3957
copytree(cicd_src, cicd_dist)
4058

41-
# Replace templated variable with version in clusters.tf
42-
jinja = Environment(loader=FileSystemLoader(configuration_dist))
43-
template = jinja.get_template('clusters.tf')
44-
data = template.render(version=version)
59+
# Replace templated version variable in clusters.tf
60+
replace_version(configuration_dist, 'clusters.tf', {'version': version})
4561

46-
with open(f'{configuration_dist}/clusters.tf', 'w') as f:
47-
f.write(data)
48-
# always include newline at end of file
49-
f.write('\n')
62+
# Replace templated variables in Dockerfile
63+
replace_version(cicd_dist,
64+
'Dockerfile',
65+
{'image_name': image_name, 'image_tag': version})
5066

5167
make_archive(archive_name, 'zip', f'{DISTDIR}', configuration_name)

.github/workflows/main.yml

Lines changed: 84 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ on:
88
- "*" # run for tags
99

1010
jobs:
11-
build:
11+
build-artifacts:
1212
runs-on: ubuntu-latest
1313

1414
steps:
@@ -18,15 +18,50 @@ jobs:
1818
- name: Build artifacts
1919
uses: ./.github/actions/build_artifacts
2020

21+
# Docker actions run as root, fix ownership of _dist
22+
- name: Fix owner
23+
run: |
24+
sudo chown -R `id -u`:`id -g` ./quickstart/_dist
25+
2126
- name: 'Upload artifacts'
2227
uses: actions/upload-artifact@v1
2328
with:
2429
name: quickstart-artifacts
2530
path: ./quickstart/_dist
2631

32+
build-image:
33+
runs-on: ubuntu-latest
34+
35+
steps:
36+
- name: 'Checkout'
37+
uses: actions/checkout@v1
38+
39+
- name: 'Docker login'
40+
run: |
41+
echo ${{ secrets.DOCKER_AUTH }} | docker login --username kbstci --password-stdin
42+
43+
- name: Build image
44+
env:
45+
DOCKER_BUILDKIT: 1
46+
run: |
47+
docker run \
48+
--rm \
49+
--privileged \
50+
-v `pwd`/oci:/tmp/work \
51+
-v $HOME/.docker:/root/.docker \
52+
--entrypoint buildctl-daemonless.sh \
53+
moby/buildkit:master \
54+
build \
55+
--frontend dockerfile.v0 \
56+
--local context=/tmp/work \
57+
--local dockerfile=/tmp/work \
58+
--output type=image,name=kubestack/framework-dev:test-${{ github.sha }},push=true \
59+
--export-cache type=registry,ref=kubestack/framework-dev:buildcache,push=true \
60+
--import-cache type=registry,ref=kubestack/framework-dev:buildcache
61+
2762
test:
2863
runs-on: ubuntu-latest
29-
needs: [build]
64+
needs: [build-artifacts, build-image]
3065
strategy:
3166
matrix:
3267
test-for: ["aks", "eks", "gke"]
@@ -41,6 +76,13 @@ jobs:
4176
run: |
4277
unzip quickstart-artifacts/infra-quickstart-${{ matrix.test-for }}-*.zip
4378
79+
# Align image test tag and tag in artifact's Dockerfile
80+
- name: 'Docker retag'
81+
run: |
82+
FROM_IMAGE=$(cat ./infra-quickstart-${{ matrix.test-for }}/ci-cd/Dockerfile | sed 's/FROM //')
83+
docker pull kubestack/framework-dev:test-${{ github.sha }}
84+
docker tag kubestack/framework-dev:test-${{ github.sha }} $FROM_IMAGE
85+
4486
- name: 'Docker build'
4587
env:
4688
DOCKER_BUILDKIT: 1
@@ -84,9 +126,38 @@ jobs:
84126
kbst-infra-automation:test \
85127
terraform validate
86128
87-
publish:
129+
publish-image:
88130
runs-on: ubuntu-latest
89-
needs: [build, test]
131+
needs: [test]
132+
133+
steps:
134+
- name: 'Download artifacts'
135+
uses: actions/download-artifact@v1
136+
with:
137+
name: quickstart-artifacts
138+
139+
- name: 'Docker retag'
140+
run: |
141+
FROM_IMAGE=$(cat quickstart-artifacts/infra-quickstart-gke/ci-cd/Dockerfile | sed 's/FROM //')
142+
docker pull kubestack/framework-dev:test-${{ github.sha }}
143+
docker tag kubestack/framework-dev:test-${{ github.sha }} $FROM_IMAGE
144+
145+
- name: 'Docker login'
146+
run: |
147+
echo ${{ secrets.DOCKER_AUTH }} | docker login --username kbstci --password-stdin
148+
149+
- name: 'Docker push'
150+
run: |
151+
IMAGE=$(cat quickstart-artifacts/infra-quickstart-gke/ci-cd/Dockerfile | sed 's/FROM //')
152+
docker push $IMAGE
153+
154+
publish-artifacts:
155+
runs-on: ubuntu-latest
156+
needs: [test]
157+
158+
strategy:
159+
matrix:
160+
test-for: ["aks", "eks", "gke"]
90161

91162
steps:
92163
- name: 'Download artifacts'
@@ -99,5 +170,13 @@ jobs:
99170
with:
100171
service_account_key: ${{ secrets.GCLOUD_AUTH }}
101172

173+
- name: 'Publish dev archives'
174+
if: startsWith(github.ref, 'refs/tags/v') == false
175+
run: |
176+
gsutil -m cp quickstart-artifacts/infra-quickstart-${{ matrix.test-for }}-${{ github.sha }}.zip gs://dev.quickstart.kubestack.com
177+
102178
- name: 'Publish archives'
103-
run: gsutil -m cp quickstart-artifacts/*.zip gs://dev.quickstart.kubestack.com
179+
if: startsWith(github.ref, 'refs/tags/v')
180+
run: |
181+
VERSION=$(echo $GITHUB_REF | sed -e "s#^refs/tags/##")
182+
gsutil -m cp quickstart-artifacts/infra-quickstart-${{ matrix.test-for }}-${VERSION}.zip gs://quickstart.kubestack.com

.github/workflows/promote.yml

Lines changed: 0 additions & 46 deletions
This file was deleted.

oci/Dockerfile

Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
#
2+
#
3+
# Image versions
4+
ARG BASE_BUILDER=python:3.8
5+
ARG BASE_IMAGE=python:3.8-slim
6+
7+
8+
#
9+
#
10+
# Base builder
11+
FROM ${BASE_BUILDER} AS builder
12+
13+
RUN apt-get update && apt-get install -y \
14+
curl \
15+
gcc \
16+
unzip
17+
18+
RUN mkdir -p /opt/bin
19+
20+
21+
#
22+
#
23+
# Common builder
24+
FROM builder AS common
25+
26+
ARG KUBECTL_VERSION=v1.18.1
27+
ARG KUSTOMIZE_VERSION=v3.5.4
28+
ARG TERRAFORM_VERSION=0.12.24
29+
ARG TERRAFORM_PROVIDER_KUSTOMIZE_VERSION=v0.1.0-beta.3
30+
31+
RUN echo "KUBECTL_VERSION: ${KUBECTL_VERSION}" \
32+
&& curl -Lo /opt/bin/kubectl https://storage.googleapis.com/kubernetes-release/release/${KUBECTL_VERSION}/bin/linux/amd64/kubectl \
33+
&& chmod +x /opt/bin/kubectl \
34+
&& /opt/bin/kubectl version --client=true
35+
36+
RUN echo "KUSTOMIZE_VERSION: ${KUSTOMIZE_VERSION}" \
37+
&& curl -LO https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize%2F${KUSTOMIZE_VERSION}/kustomize_${KUSTOMIZE_VERSION}_linux_amd64.tar.gz \
38+
&& tar -xf kustomize_${KUSTOMIZE_VERSION}_linux_amd64.tar.gz \
39+
&& mv kustomize /opt/bin/kustomize \
40+
&& /opt/bin/kustomize version
41+
42+
RUN echo "TERRAFORM_VERSION: ${TERRAFORM_VERSION}" \
43+
&& curl -LO https://releases.hashicorp.com/terraform/${TERRAFORM_VERSION}/terraform_${TERRAFORM_VERSION}_linux_amd64.zip \
44+
&& unzip terraform_${TERRAFORM_VERSION}_linux_amd64.zip -d /opt/bin \
45+
&& chmod +x /opt/bin/terraform \
46+
&& /opt/bin/terraform version
47+
48+
RUN echo "TERRAFORM_PROVIDER_KUSTOMIZE_VERSION: ${TERRAFORM_PROVIDER_KUSTOMIZE_VERSION}" \
49+
&& curl -LO https://github.com/kbst/terraform-provider-kustomize/releases/download/${TERRAFORM_PROVIDER_KUSTOMIZE_VERSION}/terraform-provider-kustomization-${TERRAFORM_PROVIDER_KUSTOMIZE_VERSION}-linux-amd64 \
50+
&& mv terraform-provider-kustomization-${TERRAFORM_PROVIDER_KUSTOMIZE_VERSION}-linux-amd64 /opt/bin/terraform-provider-kustomization \
51+
&& chmod +x /opt/bin/terraform-provider-kustomization
52+
53+
COPY entrypoint /opt/bin/entrypoint
54+
55+
56+
#
57+
#
58+
# AWS builder
59+
FROM builder AS aws
60+
61+
ARG AWS_IAM_AUTHENTICATOR_VERSION=0.5.0
62+
63+
RUN mkdir -p /opt/aws/bin
64+
65+
RUN echo "AWS_IAM_AUTHENTICATOR_VERSION: ${AWS_IAM_AUTHENTICATOR_VERSION}" \
66+
&& curl -Lo /opt/aws/bin/aws-iam-authenticator https://github.com/kubernetes-sigs/aws-iam-authenticator/releases/download/v${AWS_IAM_AUTHENTICATOR_VERSION}/aws-iam-authenticator_${AWS_IAM_AUTHENTICATOR_VERSION}_linux_amd64 \
67+
&& chmod +x /opt/aws/bin/aws-iam-authenticator \
68+
&& /opt/aws/bin/aws-iam-authenticator
69+
70+
RUN echo "AWS_CLI_VERSION: N/A" \
71+
&& curl "https://s3.amazonaws.com/aws-cli/awscli-bundle.zip" -o "awscli-bundle.zip" \
72+
&& unzip awscli-bundle.zip \
73+
&& ./awscli-bundle/install -i /opt/aws \
74+
&& /opt/aws/bin/aws --version
75+
76+
77+
#
78+
#
79+
# Google builder
80+
FROM builder AS google
81+
82+
ARG GOOGLE_CLOUD_SDK_VERSION=289.0.0
83+
84+
RUN echo "GOOGLE_CLOUD_SDK_VERSION: ${GOOGLE_CLOUD_SDK_VERSION}" \
85+
&& curl -O https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-${GOOGLE_CLOUD_SDK_VERSION}-linux-x86_64.tar.gz \
86+
&& tar zxvf google-cloud-sdk-${GOOGLE_CLOUD_SDK_VERSION}-linux-x86_64.tar.gz google-cloud-sdk \
87+
&& mv google-cloud-sdk /opt/google \
88+
&& /opt/google/bin/gcloud --version
89+
90+
91+
#
92+
#
93+
# Azure builder
94+
FROM builder AS azure
95+
96+
ARG AZURE_CLI_VERSION=2.3.1
97+
98+
RUN apt-get update && apt-get install -y \
99+
libffi-dev
100+
101+
RUN echo "AZURE_CLI_VERSION: ${AZURE_CLI_VERSION}" \
102+
&& python -m venv /opt/azure/ \
103+
&& /opt/azure/bin/pip install --no-cache-dir \
104+
azure-cli==${AZURE_CLI_VERSION} \
105+
&& echo '#!/usr/bin/env bash\n/opt/azure/bin/python -m azure.cli "$@"' \
106+
> /opt/bin/az \
107+
&& chmod +x /opt/bin/az \
108+
&& /opt/bin/az --version
109+
110+
111+
#
112+
#
113+
# Final
114+
FROM ${BASE_IMAGE} AS final
115+
116+
RUN apt-get update && apt-get install -y \
117+
ca-certificates \
118+
git \
119+
jq \
120+
wget \
121+
openssh-client \
122+
dnsutils \
123+
libnss-wrapper \
124+
unzip \
125+
&& rm -rf /var/lib/apt/lists/*
126+
127+
ENV HOME=/infra/.user
128+
129+
# Common
130+
COPY --from=common /opt/bin /opt/bin
131+
ENV PATH=/opt/bin:$PATH
132+
133+
# AWS
134+
COPY --from=aws /opt/aws /opt/aws
135+
ENV PATH=$PATH:/opt/aws/bin
136+
137+
# Google
138+
COPY --from=google /opt/google /opt/google
139+
ENV PATH=$PATH:/opt/google/bin
140+
141+
# Azure
142+
COPY --from=azure /opt/azure /opt/azure
143+
ENV PATH=$PATH:/opt/azure/bin
144+
145+
WORKDIR /infra
146+
147+
ENTRYPOINT ["/opt/bin/entrypoint"]
148+
CMD bash
File renamed without changes.

0 commit comments

Comments
 (0)