Skip to content

Commit c6995c6

Browse files
authored
Add arm64 support (datastax#19)
1. Moves docker build out of gradle and directly into the workflows 2. Replace standard docker build with docker buildx build 3. Adds support to build arm64 image of the config builder 4. Adds a separate *-arm64 image to GitHub packages 5. Adds a release workflow that produces a multiarch build for DockerHub
1 parent ac981be commit c6995c6

11 files changed

+277
-155
lines changed

.dockerignore

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
.github

.github/workflows/buildAndDeploy.yml

+16-10
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,19 @@ jobs:
1818
if: github.event_name != 'pull_request'
1919
with:
2020
submodules: true
21-
- name: Set up java 1.8
22-
uses: actions/setup-java@v1
21+
- name: Login to GitHub Package Registry
22+
run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login docker.pkg.github.com -u "${{ github.actor }}" --password-stdin
23+
- name: Setup Buildx
24+
id: buildx
25+
uses: crazy-max/ghaction-docker-buildx@v3
26+
- name: Cache Docker layers
27+
uses: actions/cache@v2
28+
id: cache
2329
with:
30+
path: /tmp/.buildx-cache
31+
key: ${{ runner.os }}-buildx-${{ github.sha }}
32+
restore-keys: |
33+
${{ runner.os }}-buildx-
2434
java-version: 1.8
2535
- name: Run tests
2636
if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == 'datastax/cass-config-builder'
@@ -33,12 +43,8 @@ jobs:
3343
gradle-version: 6.0.1
3444
arguments: test
3545
- name: Build docker image
36-
if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == 'datastax/cass-config-builder'
3746
env:
38-
ORG_GRADLE_PROJECT_dockerRegistry: docker.pkg.github.com
39-
ORG_GRADLE_PROJECT_dockerRegistryUsername: ${{ github.actor }}
40-
ORG_GRADLE_PROJECT_dockerRegistryPassword: ${{ secrets.GITHUB_TOKEN }}
41-
uses: eskatos/gradle-command-action@v1
42-
with:
43-
gradle-version: 6.0.1
44-
arguments: pushDockerImages
47+
GITHUB_REPO_OWNER: ${{ github.repository_owner }}
48+
run: |
49+
export GITHUB_REPO_URL="https://github.com/${{ github.repository }}"
50+
./scripts/build-push-images.sh

.github/workflows/release.yml

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
name: Docker Release
2+
3+
on:
4+
push:
5+
tags:
6+
- 'v*.*.*'
7+
8+
jobs:
9+
release_config_builder:
10+
name: Release Cass Config Builder
11+
runs-on: ubuntu-latest
12+
steps:
13+
- uses: actions/checkout@v2
14+
with:
15+
submodules: true
16+
- name: Login to DockerHub
17+
run: echo "${{ secrets.DOCKERHUB_PASS }}" | docker login -u "${{ secrets.DOCKERHUB_USER }}" --password-stdin
18+
- name: Setup Buildx
19+
id: buildx
20+
uses: crazy-max/ghaction-docker-buildx@v3
21+
- name: Cache Docker layers
22+
uses: actions/cache@v2
23+
id: cache
24+
with:
25+
path: /tmp/.buildx-cache
26+
key: ${{ runner.os }}-buildx-${{ github.sha }}
27+
restore-keys: |
28+
${{ runner.os }}-buildx-
29+
- name: Publish to Dockerhub
30+
run: |
31+
export GITHUB_REPO_URL="https://github.com/${{ github.repository }}"
32+
./scripts/push-release.sh

README.md

+1-13
Original file line numberDiff line numberDiff line change
@@ -36,19 +36,7 @@ mavenRepositoryPassword| Password for publishing
3636

3737
# Build the Docker image
3838

39-
./gradlew dockerImage
40-
41-
# Publish the Docker image to a remote docker repository
42-
43-
./gradlew pushDockerImage
44-
45-
This task uses the following gradle settings:
46-
47-
Setting|Description
48-
---|---
49-
dockerRegistry| Docker registry to publish to
50-
dockerRegistryUsername| Username for publishing
51-
dockerRegistryPassword| Password for publishing
39+
Docker images are built automatically and pushed to GitHub packages for pushes to master and PRs against master. When creating a release tag (e.g. v1.2.0) an image is produced and pushed to DockerHub.
5240

5341
# Using the cass-config-builder docker image
5442

build.gradle

+2-59
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
* limitations under the License.
1717
*/
1818
plugins {
19-
id 'com.bmuschko.docker-remote-api' version '6.4.0'
2019
id 'dev.clojurephant.clojure' version '0.5.0'
2120
id 'com.github.johnrengelman.shadow' version '5.2.0'
2221
id 'maven-publish'
@@ -27,13 +26,14 @@ import java.text.SimpleDateFormat
2726

2827
def getDate() {
2928
DateFormat df = new SimpleDateFormat("yyyyMMdd");
29+
df.timeZone = TimeZone.getTimeZone('UTC')
3030

3131
return df.format(new Date());
3232
}
3333

3434
description = "Cassandra/DSE Configuration Builder Library"
3535
group = 'datastax'
36-
version = '1.0.3-' + getDate()
36+
version = "${new File('version.txt').text.trim()}-${getDate()}"
3737

3838
repositories {
3939
mavenCentral()
@@ -75,32 +75,6 @@ sourceSets {
7575
}
7676
}
7777

78-
// Docker publishing
79-
80-
81-
if (project.hasProperty('dockerRegistry')) {
82-
ext.set('imagePrefix', ("$dockerRegistry/" - 'http://' - 'https://') + 'datastax' + '/cass-config-builder')
83-
} else {
84-
ext.set('imagePrefix', 'datastax' + '/cass-config-builder')
85-
}
86-
87-
docker {
88-
registryCredentials {
89-
if (project.hasProperty('dockerRegistry')) {
90-
url = project.dockerRegistry
91-
}
92-
if (project.hasProperty('dockerRegistryUsername'))
93-
{
94-
username = project.dockerRegistryUsername
95-
}
96-
97-
if (project.hasProperty('dockerRegistryPassword'))
98-
{
99-
password = project.dockerRegistryPassword
100-
}
101-
}
102-
}
103-
10478
configurations {
10579
compile {
10680
exclude group: 'org.clojure', module: 'tools.trace'
@@ -176,8 +150,6 @@ publishing {
176150

177151
assemble.dependsOn shadowJar
178152

179-
import com.bmuschko.gradle.docker.tasks.image.*
180-
181153
task copyDockerBuildCtx(type: Sync) {
182154
into "$buildDir/docker"
183155
from ("cass-config-definitions/resources") {
@@ -187,34 +159,6 @@ task copyDockerBuildCtx(type: Sync) {
187159
from shadowJar
188160
}
189161

190-
task dockerDebianImage(type: DockerBuildImage, group: 'Docker', description: 'Build cass-config-builder based on Debian') {
191-
dependsOn copyDockerBuildCtx
192-
inputDir = copyDockerBuildCtx.destinationDir
193-
dockerFile = new File(inputDir.get().asFile, "debian.Dockerfile")
194-
labels.put("release", "${version}")
195-
images.add("${imagePrefix}/cass-config-builder:${version}")
196-
}
197-
198-
task dockerRedHatImage(type: DockerBuildImage, group: 'Docker', description: 'Build cass-config-builder based on Red Hat') {
199-
dependsOn copyDockerBuildCtx
200-
inputDir = copyDockerBuildCtx.destinationDir
201-
dockerFile = new File(inputDir.get().asFile, "redhat.Dockerfile")
202-
labels.put("release", "${version}")
203-
images.add("${imagePrefix}/cass-config-builder:${version}-ubi7")
204-
}
205-
206-
task dockerImages(group: 'Docker', description: 'Build cass-config-builder docker images') {
207-
dependsOn dockerDebianImage
208-
dependsOn dockerRedHatImage
209-
}
210-
211-
task pushDockerImages(type: DockerPushImage, group: 'Docker', description: "Push Docker image to registry specified with 'dockerRegistry' property") {
212-
dependsOn dockerDebianImage, dockerRedHatImage
213-
214-
images.addAll(dockerDebianImage.images.getOrNull().asList())
215-
images.addAll(dockerRedHatImage.images.getOrNull().asList())
216-
}
217-
218162
clojureRepl {
219163
port = 7888
220164
// add extracted server functions to the classpath
@@ -224,5 +168,4 @@ clojureRepl {
224168
}
225169
}
226170

227-
assemble.dependsOn dockerImages
228171
check.dependsOn assemble

docker/Dockerfile

+85
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
# Copyright DataStax, Inc.
2+
# Please see the included license file for details.
3+
FROM --platform=${BUILDPLATFORM} maven:3.6.3-adoptopenjdk-8 as builder
4+
5+
COPY . .
6+
7+
RUN ./gradlew copyDockerBuildCtx
8+
9+
# The datastax base image is not multiarch presently, so we use the openjdk
10+
# image as our base for arm builds instead.
11+
FROM --platform=linux/arm64 openjdk:8u171-jdk-slim-stretch as base-arm64
12+
13+
FROM --platform=linux/amd64 datastax/ds-base-debian-openjdk-8:8u252-jdk-slim-buster-20200602 as base-amd64
14+
15+
FROM base-${TARGETARCH} as cass-config-builder
16+
17+
ENV USER_UID=1001 \
18+
USER_NAME=cass-operator \
19+
HOME=/home/cass-operator
20+
21+
# Install the uber jar
22+
COPY --from=builder build/docker/*.jar /usr/local/bin/
23+
24+
# Install definition files
25+
COPY --from=builder build/docker/definitions /definitions
26+
27+
COPY --from=builder build/docker/bin/* /usr/local/bin/
28+
29+
RUN /usr/local/bin/user_setup
30+
31+
ENV PATH=$PATH:/usr/local/bin
32+
33+
ENTRYPOINT ["/usr/local/bin/entrypoint"]
34+
35+
USER ${USER_UID}
36+
37+
FROM registry.access.redhat.com/ubi7/ubi-minimal:7.8 AS builder-ubi
38+
39+
# Update the builder packages and create user
40+
RUN microdnf update && rm -rf /var/cache/yum && \
41+
microdnf install shadow-utils && microdnf clean all && \
42+
useradd -r -s /bin/false -U -G root cassandra
43+
44+
#############################################################
45+
46+
FROM registry.access.redhat.com/ubi7/ubi-minimal:7.8 as cass-config-builder-ubi
47+
48+
LABEL maintainer="DataStax, Inc <[email protected]>"
49+
LABEL name="cass-config-builder"
50+
LABEL vendor="DataStax, Inc"
51+
LABEL release="1.0.0"
52+
LABEL summary="Configuration templating engine for Apache Cassandra®."
53+
LABEL description="Configuration templating engine for Apache Cassandra®. Powers the configuration of containers deployed via the DataStax Kubernetes Operator for Apache Cassandra."
54+
55+
# Update base packages
56+
RUN microdnf update && \
57+
rm -rf /var/cache/yum && \
58+
microdnf install java-1.8.0-openjdk-headless && \
59+
microdnf clean all
60+
61+
# Copy user accounts information
62+
COPY --from=builder-ubi /etc/passwd /etc/passwd
63+
COPY --from=builder-ubi /etc/shadow /etc/shadow
64+
COPY --from=builder-ubi /etc/group /etc/group
65+
COPY --from=builder-ubi /etc/gshadow /etc/gshadow
66+
67+
# Install the uber jar
68+
COPY --from=builder build/docker/*.jar /usr/local/bin/
69+
70+
# Install definition files
71+
COPY --from=builder build/docker/definitions /definitions
72+
73+
COPY --from=builder build/docker/bin/* /usr/local/bin/
74+
75+
COPY --from=builder build/docker/LICENSE /licenses/
76+
77+
# Fix permissions
78+
RUN chown cassandra:root -Rv /usr/local/bin/* && \
79+
chmod -Rv g+x /usr/local/bin
80+
81+
USER cassandra:root
82+
83+
ENV PATH=$PATH:/usr/local/bin
84+
85+
ENTRYPOINT ["/usr/local/bin/entrypoint"]

docker/debian.Dockerfile

-24
This file was deleted.

docker/redhat.Dockerfile

-49
This file was deleted.

0 commit comments

Comments
 (0)