Skip to content

Commit 4fc2c78

Browse files
author
Justin Boswell
authored
Use cross-compile + qemu instead of buildx docker images (#12)
* Use dockcross for cross compiling * Removed pushd/popd shenanigans, all commands take paths relative to launch dir/--build-dir now * Added script to produce cross-compiled libcrypto * Added imports to builder * Added cross compile to sanity tests * Re-enabled cached docker builds since we don't need buildx * Added support for debian * Allow build/test steps to contain action names * Fixed bug where local builds would be unable to find their installed deps * Added the ability for targets to export variables to other projects' configs with late binding * Made dependencies and consumers also late binding
1 parent aa2d4c6 commit 4fc2c78

27 files changed

+1206
-513
lines changed

.github/docker-images/build_cmake.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ CMAKE_VERSION=3.13.5
1616
[ ! -z "$AWS_ACCESS_KEY_ID" ] && [ ! -z "$AWS_SECRET_ACCESS_KEY" ]
1717

1818
if [ ! -e /tmp/aws-crt-${variant}-${arch}-${version}.tar.gz ]; then
19-
aws s3 cp s3://aws-crt-builder/_docker/aws-crt-${variant}-${arch}-${version}.tar.gz /tmp
19+
aws s3 cp s3://aws-crt-builder/${version}/aws-crt-${variant}-${arch}-${version}.tar.gz /tmp
2020
docker load < /tmp/aws-crt-${variant}-${arch}-${version}.tar.gz
2121
fi
2222

.github/docker-images/build_libcrypto_1.0.2.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ libcrypto_version=1.0.2
1414
[ ! -z "$AWS_ACCESS_KEY_ID" ] && [ ! -z "$AWS_SECRET_ACCESS_KEY" ]
1515

1616
if [ ! -e /tmp/aws-crt-${variant}-${arch}-${version}.tar.gz ]; then
17-
aws s3 cp s3://aws-crt-builder/_docker/aws-crt-${variant}-${arch}-${version}.tar.gz /tmp
17+
aws s3 cp s3://aws-crt-builder/${version}/aws-crt-${variant}-${arch}-${version}.tar.gz /tmp
1818
docker load < /tmp/aws-crt-${variant}-${arch}-${version}.tar.gz
1919
fi
2020

.github/docker-images/build_libcrypto_1.1.1.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ libcrypto_version=1.1.1
1414
[ ! -z "$AWS_ACCESS_KEY_ID" ] && [ ! -z "$AWS_SECRET_ACCESS_KEY" ]
1515

1616
if [ ! -e /tmp/aws-crt-${variant}-${arch}-${version}.tar.gz ]; then
17-
aws s3 cp s3://aws-crt-builder/_docker/aws-crt-${variant}-${arch}-${version}.tar.gz /tmp
17+
aws s3 cp s3://aws-crt-builder/${version}/aws-crt-${variant}-${arch}-${version}.tar.gz /tmp
1818
docker load < /tmp/aws-crt-${variant}-${arch}-${version}.tar.gz
1919
fi
2020

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
#!/usr/bin/env bash
2+
3+
# This builds libcrypto in the specified container, and uploads the result to S3 for use in building future containers
4+
5+
set -ex
6+
7+
[ $# -eq 3 ]
8+
os=$1
9+
arch=$2
10+
# See ./Configure LIST in openssl
11+
config_platform=$3
12+
libcrypto_version=1.1.1
13+
14+
# AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY must be in env vars to pass to container
15+
[ ! -z "$AWS_ACCESS_KEY_ID" ] && [ ! -z "$AWS_SECRET_ACCESS_KEY" ]
16+
17+
rm -rf /tmp/openssl-${os}-${arch} || true
18+
mkdir -p /tmp/openssl-${os}-${arch}
19+
pushd /tmp/openssl-${os}-${arch}
20+
git clone --single-branch --branch OpenSSL_1_1_1-stable https://github.com/openssl/openssl.git
21+
docker run --rm dockcross/${os}-${arch} > dockcross-${os}-${arch} && chmod a+x dockcross-${os}-${arch}
22+
cd openssl
23+
24+
# Note that commands going into dockcross need to be quoted based on which shell you want the expansion done by. If the
25+
# expansion should be done in the container, make sure the command is single quoted
26+
27+
# Configure OpenSSL
28+
cmd='./Configure '
29+
cmd+=${config_platform}
30+
cmd+=' -fPIC no-md2 no-rc5 no-rfc3779 no-sctp no-ssl-trace no-zlib no-hw no-mdc2 no-seed no-idea no-camellia no-bf no-dsa no-ssl3 no-capieng no-unit-test no-tests -DSSL_FORBID_ENULL -DOPENSSL_NO_DTLS1 -DOPENSSL_NO_HEARTBEATS --prefix=/opt/openssl --openssldir=/opt/openssl'
31+
../dockcross-${os}-${arch} bash -c "$cmd"
32+
33+
# Build, install, tarball install into working directory
34+
cmd='PATH=$PATH:`dirname $CC` make CC=`basename $CC` AR=`basename $AR` -j && sudo make install_sw && rm -rf install/man'
35+
cmd+=" && tar cvzf /work/libcrypto-${libcrypto_version}-${os}-${arch}.tar.gz -C /opt/openssl ."
36+
# PATH, AR, and CC have to be carefully managed because openssl's configure/make is a little fragile during cross compiles
37+
../dockcross-${os}-${arch} bash -c "$cmd"
38+
39+
# Upload to S3
40+
aws s3 cp libcrypto-${libcrypto_version}-${os}-${arch}.tar.gz s3://aws-crt-builder/_binaries/libcrypto/libcrypto-${libcrypto_version}-${os}-${arch}.tar.gz
41+
popd

.github/workflows/docker-images.yml

Lines changed: 29 additions & 182 deletions
Original file line numberDiff line numberDiff line change
@@ -136,102 +136,24 @@ jobs:
136136
run: cat .github/docker-images/entrypoint.sh | sed s/version=LATEST/version=$IMAGE_TAG/ > .github/docker-images/${{ matrix.variant }}/entrypoint.sh
137137

138138
- name: Build ${{ matrix.variant }} image
139-
run: .github/workflows/docker_buildx.sh \
140-
docker.pkg.github.com \
141-
awslabs \
142-
${{ secrets.DOCKER_TOKEN }} \
143-
awslabs/aws-crt-builder/aws-crt-${{ matrix.variant }} \
144-
${{ env.IMAGE_TAG }} \
145-
.github/docker-images/${{ matrix.variant }} \
146-
--compress=true
147-
148-
- name: Export ${{ matrix.variant }} image
149-
run: |
150-
docker save docker.pkg.github.com/awslabs/aws-crt-builder/aws-crt-${{ matrix.variant }}:${{ env.IMAGE_TAG }} | gzip > /tmp/aws-crt-${{ matrix.variant }}-${{ env.IMAGE_TAG }}.tar.gz
151-
aws s3 cp --no-progress /tmp/aws-crt-${{ matrix.variant }}-${{ env.IMAGE_TAG }}.tar.gz s3://${{env.AWS_S3_BUCKET}}/_docker/aws-crt-${{ matrix.variant }}-${{ env.IMAGE_TAG }}.tar.gz
152-
153-
linux-arm64:
154-
name: ${{ matrix.variant }}-${{ matrix.arch }}
155-
runs-on: 'ubuntu-latest'
156-
needs: [tag, package]
157-
strategy:
158-
matrix:
159-
variant: [al2]
160-
arch: [arm64]
161-
steps:
162-
- name: Checkout Sources
163-
uses: actions/checkout@v1
164-
165-
- name: Fetch release_tag
166-
uses: actions/download-artifact@v1
167-
with:
168-
name: release_tag
169-
path: release_tag
170-
171-
- name: Export IMAGE_TAG
172-
run: echo "::set-env name=IMAGE_TAG::$(cat release_tag/tag)"
173-
174-
- name: Install entrypoint
175-
run: cat .github/docker-images/entrypoint.sh | sed s/version=LATEST/version=$IMAGE_TAG/ > .github/docker-images/${{ matrix.variant }}-${{ matrix.arch }}/entrypoint.sh
176-
177-
- name: "Build ${{ matrix.variant }}-${{ matrix.arch }} image"
178-
run: .github/workflows/docker_buildx.sh \
179-
docker.pkg.github.com \
180-
awslabs \
181-
${{ secrets.DOCKER_TOKEN }} \
182-
awslabs/aws-crt-builder/aws-crt-${{ matrix.variant }}-${{ matrix.arch }} \
183-
${{ env.IMAGE_TAG }} \
184-
.github/docker-images/${{ matrix.variant }}-${{ matrix.arch }} \
185-
--compress=true --platform=linux/${{ matrix.arch }}
186-
187-
- name: Export ${{ matrix.variant }} ${{ matrix.arch }} image
188-
run: |
189-
docker save docker.pkg.github.com/awslabs/aws-crt-builder/aws-crt-${{ matrix.variant }}-${{ matrix.arch }}:${{ env.IMAGE_TAG }} | gzip > /tmp/aws-crt-${{ matrix.variant }}-${{ matrix.arch }}-${{ env.IMAGE_TAG }}.tar.gz
190-
aws s3 cp --no-progress /tmp/aws-crt-${{ matrix.variant }}-${{ matrix.arch }}-${{ env.IMAGE_TAG }}.tar.gz s3://${{env.AWS_S3_BUCKET}}/_docker/aws-crt-${{ matrix.variant }}-${{ matrix.arch }}-${{ env.IMAGE_TAG }}.tar.gz
191-
192-
linux-arm32:
193-
name: ${{ matrix.variant }}-arm${{ matrix.arch }}
194-
runs-on: 'ubuntu-latest'
195-
needs: [tag, package]
196-
strategy:
197-
fail-fast: false
198-
matrix:
199-
variant: [alpine, raspbian]
200-
arch: [v6, v7]
201-
steps:
202-
- name: Checkout Sources
203-
uses: actions/checkout@v1
204-
205-
- name: Fetch release_tag
206-
uses: actions/download-artifact@v1
139+
uses: whoan/docker-build-with-cache-action@v4
207140
with:
208-
name: release_tag
209-
path: release_tag
210-
211-
- name: Export IMAGE_TAG
212-
run: echo "::set-env name=IMAGE_TAG::$(cat release_tag/tag)"
213-
214-
- name: Install entrypoint
215-
run: cat -v .github/docker-images/entrypoint.sh | sed s/version=LATEST/version=$IMAGE_TAG/ > .github/docker-images/${{ matrix.variant }}-arm${{ matrix.arch }}/entrypoint.sh
216-
217-
- name: "Build ${{ matrix.variant }}-arm${{ matrix.arch }} image"
218-
run: .github/workflows/docker_buildx.sh \
219-
docker.pkg.github.com \
220-
awslabs \
221-
${{ secrets.DOCKER_TOKEN }} \
222-
awslabs/aws-crt-builder/aws-crt-${{ matrix.variant }}-arm${{ matrix.arch }} \
223-
${{ env.IMAGE_TAG }} \
224-
.github/docker-images/${{ matrix.variant }}-arm${{ matrix.arch }} \
225-
--compress=true --platform=linux/arm/${{ matrix.arch }}
226-
227-
- name: Export ${{ matrix.variant }} arm${{ matrix.arch }} image
141+
registry: docker.pkg.github.com
142+
username: awslabs
143+
password: ${{ secrets.DOCKER_TOKEN }}
144+
image_name: awslabs/aws-crt-builder/aws-crt-${{ matrix.variant }}
145+
image_tag: ${{ env.IMAGE_TAG }}
146+
context: .github/docker-images/${{ matrix.variant }}
147+
build_extra_args: --compress=true
148+
149+
- name: Export ${{ matrix.variant }} image to S3
228150
run: |
229-
docker save docker.pkg.github.com/awslabs/aws-crt-builder/aws-crt-${{ matrix.variant }}-arm${{ matrix.arch }}:${{ env.IMAGE_TAG }} | gzip > /tmp/aws-crt-${{ matrix.variant }}-arm${{ matrix.arch }}-${{ env.IMAGE_TAG }}.tar.gz
230-
aws s3 cp --no-progress /tmp/aws-crt-${{ matrix.variant }}-arm${{ matrix.arch }}-${{ env.IMAGE_TAG }}.tar.gz s3://${{env.AWS_S3_BUCKET}}/_docker/aws-crt-${{ matrix.variant }}-arm${{ matrix.arch }}-${{ env.IMAGE_TAG }}.tar.gz
151+
docker save docker.pkg.github.com/awslabs/aws-crt-builder/aws-crt-${{ matrix.variant }}:${{ env.IMAGE_TAG }} > /tmp/aws-crt-${{ matrix.variant }}-${{ env.IMAGE_TAG }}.tar.gz
152+
aws s3 cp --no-progress /tmp/aws-crt-${{ matrix.variant }}-${{ env.IMAGE_TAG }}.tar.gz s3://${{env.AWS_S3_BUCKET}}/${{ env.IMAGE_TAG }}/aws-crt-${{ matrix.variant }}.tar.gz
231153
232-
###############################################################################
233-
# DOWNSTREAM TESTS
234-
###############################################################################
154+
###############################################################################
155+
# DOWNSTREAM TESTS
156+
###############################################################################
235157
aws-c-common-linux-x64:
236158
name: Linux x64 aws-c-common test build
237159
runs-on: 'ubuntu-latest'
@@ -253,78 +175,6 @@ jobs:
253175
docker pull docker.pkg.github.com/awslabs/aws-crt-builder/aws-crt-ubuntu-16-x64:${{ steps.release.outputs.release_tag }}
254176
docker run --env GITHUB_REF docker.pkg.github.com/awslabs/aws-crt-builder/aws-crt-ubuntu-16-x64:${{ steps.release.outputs.release_tag }} build -p aws-c-common downstream --compiler=clang-9
255177
256-
aws-c-common-raspbian-armv6:
257-
name: Raspbian armv6 aws-c-common test build
258-
runs-on: 'ubuntu-latest'
259-
if: github.event_name != 'release'
260-
needs: linux-arm32
261-
262-
steps:
263-
- name: Checkout Source
264-
uses: actions/checkout@v1
265-
266-
- name: Get Release Tag
267-
uses: ./.github/actions/release-tag
268-
id: release
269-
270-
- name: Bootstrap docker-buildx
271-
run: .github/workflows/install_buildx.sh
272-
273-
# We can't use the `uses: docker://image` version yet, GitHub lacks authentication for actions -> packages
274-
- name: Build aws-c-common + consumers
275-
run: |
276-
echo "${{ secrets.GITHUB_TOKEN }}" | docker login docker.pkg.github.com -u awslabs --password-stdin
277-
docker pull docker.pkg.github.com/awslabs/aws-crt-builder/aws-crt-raspbian-armv6:${{ steps.release.outputs.release_tag }}
278-
docker run --env GITHUB_REF docker.pkg.github.com/awslabs/aws-crt-builder/aws-crt-raspbian-armv6:${{ steps.release.outputs.release_tag }} build -p aws-c-common downstream
279-
280-
aws-c-common-alpine-armv7:
281-
name: Alpine ARMv7 aws-c-common test build
282-
runs-on: 'ubuntu-latest'
283-
if: github.event_name != 'release'
284-
needs: linux-arm32
285-
286-
steps:
287-
- name: Checkout Source
288-
uses: actions/checkout@v1
289-
290-
- name: Get Release Tag
291-
uses: ./.github/actions/release-tag
292-
id: release
293-
294-
- name: Bootstrap docker-buildx
295-
run: .github/workflows/install_buildx.sh
296-
297-
# We can't use the `uses: docker://image` version yet, GitHub lacks authentication for actions -> packages
298-
- name: Build aws-c-common + consumers
299-
run: |
300-
echo "${{ secrets.GITHUB_TOKEN }}" | docker login docker.pkg.github.com -u awslabs --password-stdin
301-
docker pull docker.pkg.github.com/awslabs/aws-crt-builder/aws-crt-alpine-armv7:${{ steps.release.outputs.release_tag }}
302-
docker run --env GITHUB_REF docker.pkg.github.com/awslabs/aws-crt-builder/aws-crt-alpine-armv7:${{ steps.release.outputs.release_tag }} build -p aws-c-common downstream
303-
304-
aws-c-common-al2-armv8:
305-
name: al2 armv8 aws-c-common test build
306-
runs-on: 'ubuntu-latest'
307-
if: github.event_name != 'release'
308-
needs: linux-arm64
309-
310-
steps:
311-
- name: Checkout Source
312-
uses: actions/checkout@v1
313-
314-
- name: Get Release Tag
315-
uses: ./.github/actions/release-tag
316-
id: release
317-
318-
- name: Bootstrap docker-buildx
319-
run: .github/workflows/install_buildx.sh
320-
321-
# We can't use the `uses: docker://image` version yet, GitHub lacks authentication for actions -> packages
322-
- name: Build aws-c-common + consumers
323-
run: |
324-
echo "${{ secrets.GITHUB_TOKEN }}" | docker login docker.pkg.github.com -u awslabs --password-stdin
325-
docker pull docker.pkg.github.com/awslabs/aws-crt-builder/aws-crt-al2-arm64:${{ steps.release.outputs.release_tag }}
326-
docker run --env GITHUB_REF docker.pkg.github.com/awslabs/aws-crt-builder/aws-crt-al2-arm64:${{ steps.release.outputs.release_tag }} build -p aws-c-common downstream
327-
328178
aws-c-common-osx:
329179
name: OSX aws-c-common test build
330180
runs-on: 'macos-latest'
@@ -335,7 +185,7 @@ jobs:
335185
- name: Checkout Source
336186
uses: actions/checkout@v1
337187

338-
- name: Install entrypoint
188+
- name: Install builder
339189
uses: actions/download-artifact@v1
340190
with:
341191
name: builder
@@ -347,22 +197,22 @@ jobs:
347197
run: builder build default-downstream -p aws-c-common --dump-config
348198

349199
aws-c-common-windows-vs2019:
350-
name: Windows (VS2019) aws-c-common test build
351-
runs-on: 'windows-latest'
352-
if: github.event_name != 'release'
353-
needs: package
200+
name: Windows (VS2019) aws-c-common test build
201+
runs-on: 'windows-latest'
202+
if: github.event_name != 'release'
203+
needs: package
354204

355-
steps:
356-
- name: Checkout Source
357-
uses: actions/checkout@v1
205+
steps:
206+
- name: Checkout Source
207+
uses: actions/checkout@v1
358208

359-
- name: Install entrypoint
360-
uses: actions/download-artifact@v1
361-
with:
362-
name: builder
209+
- name: Install builder
210+
uses: actions/download-artifact@v1
211+
with:
212+
name: builder
363213

364-
- name: Build aws-c-common + consumers
365-
run: python builder\builder build default-downstream -p aws-c-common --dump-config
214+
- name: Build aws-c-common + consumers
215+
run: python builder\builder build default-downstream -p aws-c-common --dump-config
366216

367217
ci-passed:
368218
name: Downstream Tests Passed
@@ -371,8 +221,5 @@ jobs:
371221
- aws-c-common-linux-x64
372222
- aws-c-common-osx
373223
- aws-c-common-windows-vs2019
374-
- aws-c-common-alpine-armv7
375-
- aws-c-common-raspbian-armv6
376-
- aws-c-common-al2-armv8
377224
steps:
378225
- run: echo "All downstream tests passed"

.github/workflows/docker_buildx.sh

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,10 @@ build_image() {
5050
# build builder target image
5151
docker build \
5252
--build-arg BUILDKIT_INLINE_CACHE=1 \
53-
--load \
53+
--output=type=docker,push=true \
5454
--tag="$(_get_full_image_name)":${INPUT_IMAGE_TAG} \
5555
${INPUT_BUILD_EXTRA_ARGS} \
5656
${INPUT_CONTEXT}
57-
58-
docker push "$(_get_full_image_name)":${INPUT_IMAGE_TAG}
5957
}
6058

6159
logout_from_registry() {

.github/workflows/install_buildx.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ install_buildx() {
1414

1515
configure_buildx() {
1616
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
17-
docker buildx create --name builder --driver docker-container --use
17+
docker buildx create --name builder --driver docker-container --platform linux/amd64,linux/arm64,linux/arm/v7,linux/arm/v6 --use
1818
docker buildx inspect --bootstrap
1919
docker buildx install
2020
}

0 commit comments

Comments
 (0)