Skip to content

Commit a8266d1

Browse files
committed
build: improve build time
Signed-off-by: Alessandro Yuichi Okimoto <yuichijpn@gmail.com>
1 parent 9641a42 commit a8266d1

2 files changed

Lines changed: 99 additions & 26 deletions

File tree

.github/.devcontainer/Dockerfile

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,40 +7,49 @@ ENV LANG="C.UTF-8" \
77
SHELL=/bin/bash \
88
DOCKER_BUILDKIT=1
99

10-
# Install all packages in a single RUN command to reduce layers
10+
# Install packages in optimized order for better layer caching
1111
RUN apt-get update \
1212
&& apt-get upgrade -y \
1313
&& apt-get install -y --no-install-recommends \
14-
# Essential build tools
14+
# Core essentials (changes rarely)
15+
ca-certificates \
16+
curl \
17+
git \
18+
sudo \
19+
# Build tools (changes rarely)
1520
make \
1621
build-essential \
1722
cmake \
18-
curl \
19-
git \
23+
# File utilities
2024
unzip \
2125
zip \
2226
rsync \
23-
jq \
2427
xz-utils \
25-
# Database drivers (only what's actually needed)
28+
&& apt-get clean \
29+
&& rm -rf /var/lib/apt/lists/*
30+
31+
# Install development packages in separate layer
32+
RUN apt-get update && apt-get install -y --no-install-recommends \
33+
# Development tools
34+
jq \
35+
vim \
36+
protobuf-compiler \
37+
python3-dev \
38+
python3-pip \
39+
# Database drivers
2640
libpq-dev \
2741
default-libmysqlclient-dev \
2842
sqlite3 \
2943
libsqlite3-dev \
30-
# Development tools
31-
python3-dev \
32-
python3-pip \
33-
vim \
34-
protobuf-compiler \
35-
# Essential libraries
44+
# System libraries
3645
libssl-dev \
3746
libgcc1 \
3847
libstdc++6 \
3948
zlib1g \
4049
libuuid1 \
4150
uuid-dev \
4251
&& apt-get autoremove -y \
43-
&& apt-get clean -y \
52+
&& apt-get clean \
4453
&& rm -rf /var/lib/apt/lists/* \
4554
# Move first run notice to right spot
4655
&& mkdir -p "/usr/local/etc/vscode-dev-containers/" \

.github/workflows/devcontainer-image-build.yaml

Lines changed: 77 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,50 @@ on:
99
- ".github/.devcontainer/**"
1010

1111
jobs:
12-
build-and-push:
12+
# Build separate architectures in parallel for speed
13+
build-amd64:
1314
runs-on: ubuntu-latest
1415
steps:
1516
- name: Checkout (GitHub)
1617
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
1718

18-
- name: Set up QEMU for multi-architecture builds
19+
- name: Setup Docker buildx
20+
uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1
21+
with:
22+
use: true
23+
24+
- name: Login to GitHub Container Registry
25+
uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3.4.0
26+
with:
27+
registry: ghcr.io
28+
username: ${{ github.repository_owner }}
29+
password: ${{ secrets.GITHUB_TOKEN }}
30+
31+
- name: Build and push AMD64 image
32+
uses: docker/build-push-action@48aba3b46d1b1fec4febb7c5d0c644b249a11355 # v6.10.0
33+
with:
34+
context: .github/.devcontainer
35+
platforms: linux/amd64
36+
push: true
37+
tags: ghcr.io/bucketeer-io/bucketeer-devcontainer:amd64-${{ github.sha }}
38+
cache-from: type=gha,scope=amd64
39+
cache-to: type=gha,mode=max,scope=amd64
40+
provenance: false
41+
build-args: |
42+
BUILDKIT_INLINE_CACHE=1
43+
44+
build-arm64:
45+
runs-on: ubuntu-latest
46+
steps:
47+
- name: Checkout (GitHub)
48+
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
49+
50+
- name: Set up QEMU for ARM64 builds
1951
uses: docker/setup-qemu-action@29109295f81e9208d7d86ff1c6c12d2833863392 # v3.6.0
2052
with:
21-
platforms: linux/amd64,linux/arm64
53+
platforms: linux/arm64
2254

23-
- name: Setup Docker buildx for multi-architecture builds
55+
- name: Setup Docker buildx
2456
uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1
2557
with:
2658
use: true
@@ -32,13 +64,45 @@ jobs:
3264
username: ${{ github.repository_owner }}
3365
password: ${{ secrets.GITHUB_TOKEN }}
3466

35-
- name: Build and release devcontainer Multi-Platform
36-
uses: devcontainers/ci@8bf61b26e9c3a98f69cb6ce2f88d24ff59b785c6 # v0.3
37-
env:
38-
BUILDX_NO_DEFAULT_ATTESTATIONS: true
67+
- name: Build and push ARM64 image
68+
uses: docker/build-push-action@48aba3b46d1b1fec4febb7c5d0c644b249a11355 # v6.10.0
3969
with:
40-
imageName: ghcr.io/bucketeer-io/bucketeer-devcontainer
41-
cacheFrom: ghcr.io/bucketeer-io/bucketeer-devcontainer
42-
platform: linux/amd64,linux/arm64
43-
subFolder: .github
44-
push: always
70+
context: .github/.devcontainer
71+
platforms: linux/arm64
72+
push: true
73+
tags: ghcr.io/bucketeer-io/bucketeer-devcontainer:arm64-${{ github.sha }}
74+
cache-from: type=gha,scope=arm64
75+
cache-to: type=gha,mode=max,scope=arm64
76+
provenance: false
77+
build-args: |
78+
BUILDKIT_INLINE_CACHE=1
79+
80+
# Create multi-arch manifest that combines both architectures
81+
create-manifest:
82+
runs-on: ubuntu-latest
83+
needs: [build-amd64, build-arm64]
84+
steps:
85+
- name: Login to GitHub Container Registry
86+
uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3.4.0
87+
with:
88+
registry: ghcr.io
89+
username: ${{ github.repository_owner }}
90+
password: ${{ secrets.GITHUB_TOKEN }}
91+
92+
- name: Create and push multi-arch manifest
93+
run: |
94+
# Create manifest list that includes both architectures
95+
docker manifest create \
96+
ghcr.io/bucketeer-io/bucketeer-devcontainer:latest \
97+
--amend ghcr.io/bucketeer-io/bucketeer-devcontainer:amd64-${{ github.sha }} \
98+
--amend ghcr.io/bucketeer-io/bucketeer-devcontainer:arm64-${{ github.sha }}
99+
100+
# Also create SHA-specific manifest (for debugging)
101+
docker manifest create \
102+
ghcr.io/bucketeer-io/bucketeer-devcontainer:${{ github.sha }} \
103+
--amend ghcr.io/bucketeer-io/bucketeer-devcontainer:amd64-${{ github.sha }} \
104+
--amend ghcr.io/bucketeer-io/bucketeer-devcontainer:arm64-${{ github.sha }}
105+
106+
# Push manifests
107+
docker manifest push ghcr.io/bucketeer-io/bucketeer-devcontainer:latest
108+
docker manifest push ghcr.io/bucketeer-io/bucketeer-devcontainer:${{ github.sha }}

0 commit comments

Comments
 (0)