1+ name : buildx
2+
3+ on :
4+ workflow_call :
5+ secrets :
6+ CACHE_NAME :
7+ required : true
8+ DOCKER_TOKEN :
9+ required : true
10+ QUAY_USER :
11+ required : true
12+ QUAY_TOKEN :
13+ required : true
14+ BUILD_ONLY :
15+ required : true
16+
17+ jobs :
18+ buildx :
19+ runs-on : ubuntu-24.04
20+ if : github.repository_owner == 'hwdsl2'
21+ steps :
22+ - uses : actions/checkout@v6
23+ with :
24+ persist-credentials : false
25+ - name : Cache
26+ uses : actions/cache@v5
27+ with :
28+ path : |
29+ ${{ runner.temp }}/.buildx-bin
30+ ${{ runner.temp }}/.buildx-cache
31+ ${{ runner.temp }}/.docker-images
32+ key : ${{ secrets.CACHE_NAME }}-${{ github.sha }}-${{ github.run_id }}
33+ restore-keys : |
34+ ${{ secrets.CACHE_NAME }}-
35+ - name : Set up Buildx
36+ env :
37+ RUNNER_TEMP : ${{ runner.temp }}
38+ run : |
39+ [ ! -x /usr/bin/docker ] && exit 1
40+ if [ ! -x /usr/bin/wget ] || [ ! -x /usr/bin/jq ]; then
41+ export DEBIAN_FRONTEND=noninteractive
42+ sudo apt-get -yq update
43+ sudo apt-get -yq install wget jq
44+ fi
45+
46+ BUILDX_VER=$(wget -t 3 -T 30 -qO- "https://api.github.com/repos/docker/buildx/releases/latest" | jq -r ".tag_name")
47+ [ -z "${BUILDX_VER}" ] && exit 1
48+ echo "Buildx version: ${BUILDX_VER}"
49+
50+ DOCKER_DIR="${HOME}/.docker/cli-plugins"
51+ CACHE_DIR="${RUNNER_TEMP}/.buildx-bin"
52+ mkdir -p "${DOCKER_DIR}"
53+ if [ -s "${CACHE_DIR}/docker-buildx-${BUILDX_VER}" ]; then
54+ echo "Using buildx binary from cache..."
55+ cp -f "${CACHE_DIR}/docker-buildx-${BUILDX_VER}" "${DOCKER_DIR}/docker-buildx"
56+ else
57+ echo "Downloading buildx..."
58+ BUILDX_URL="https://github.com/docker/buildx/releases/download/${BUILDX_VER}/buildx-${BUILDX_VER}.linux-amd64"
59+ wget -t 3 -T 30 -nv -O "${DOCKER_DIR}/docker-buildx" "${BUILDX_URL}"
60+ [ ! -s "${DOCKER_DIR}/docker-buildx" ] && exit 1
61+ /bin/rm -rf "${CACHE_DIR}"
62+ mkdir -p "${CACHE_DIR}"
63+ /bin/cp -f "${DOCKER_DIR}/docker-buildx" "${CACHE_DIR}/docker-buildx-${BUILDX_VER}"
64+ fi
65+ chmod a+x "${DOCKER_DIR}/docker-buildx"
66+
67+ docker info
68+ docker buildx version
69+
70+ image_cache_dir="${RUNNER_TEMP}/.docker-images"
71+ for image in "quay.io/hwdsl2/qemu-user-static:latest" "moby/buildkit:buildx-stable-1"; do
72+ image_file=$(printf '%s' "${image}.tar.gz" | tr '/' '-' | tr ':' '-')
73+ if [ -s "${image_cache_dir}/${image_file}" ]; then
74+ echo "Using ${image} from cache..."
75+ docker load -i "${image_cache_dir}/${image_file}"
76+ else
77+ echo "Downloading ${image}..."
78+ docker pull -q "${image}"
79+ mkdir -p "${image_cache_dir}"
80+ docker save "${image}" | gzip > "${image_cache_dir}/${image_file}"
81+ fi
82+ done
83+
84+ docker run --rm --privileged quay.io/hwdsl2/qemu-user-static:latest --reset -p yes --credential yes
85+ docker buildx create --name "builder-${GITHUB_SHA::8}" --driver docker-container --use
86+ docker buildx inspect --bootstrap
87+ - name : Quay.io Login
88+ env :
89+ QUAY_USER : ${{ secrets.QUAY_USER }}
90+ QUAY_TOKEN : ${{ secrets.QUAY_TOKEN }}
91+ run : echo "$QUAY_TOKEN" | docker login quay.io --username "$QUAY_USER" --password-stdin 2>&1
92+ - name : Docker Hub Login
93+ env :
94+ DOCKER_USER : ${{ github.repository_owner }}
95+ DOCKER_TOKEN : ${{ secrets.DOCKER_TOKEN }}
96+ run : echo "$DOCKER_TOKEN" | docker login --username "$DOCKER_USER" --password-stdin 2>&1
97+ - name : Docker Buildx
98+ env :
99+ DOCKER_USER : ${{ github.repository_owner }}
100+ BUILD_ONLY : ${{ secrets.BUILD_ONLY }}
101+ RUNNER_TEMP : ${{ runner.temp }}
102+ run : |
103+ cd "$GITHUB_WORKSPACE"
104+ pwd
105+ ls -ld embed.env.example
106+
107+ [ "$BUILD_ONLY" = "true" ] && BUILD_ONLY=""
108+ ts_now=$(date -u +'%Y-%m-%dT%H:%M:%SZ')
109+
110+ docker buildx build \
111+ --progress plain \
112+ --platform=linux/amd64 \
113+ --build-arg BUILD_DATE=$ts_now \
114+ --build-arg VCS_REF=${GITHUB_SHA::8} \
115+ --build-arg VERSION=latest \
116+ --cache-from type=local,src="${RUNNER_TEMP}/.buildx-cache" \
117+ --cache-to type=local,dest="${RUNNER_TEMP}/.buildx-cache-new" \
118+ -t "$DOCKER_USER/embeddings-server:latest" \
119+ --pull \
120+ ${BUILD_ONLY:+--push} \
121+ .
122+
123+ docker buildx build \
124+ --progress plain \
125+ --platform=linux/amd64 \
126+ --build-arg BUILD_DATE=$ts_now \
127+ --build-arg VCS_REF=${GITHUB_SHA::8} \
128+ --build-arg VERSION=latest \
129+ --cache-from type=local,src="${RUNNER_TEMP}/.buildx-cache-new" \
130+ -t "quay.io/$DOCKER_USER/embeddings-server:latest" \
131+ --pull \
132+ ${BUILD_ONLY:+--push} \
133+ .
134+
135+ /bin/rm -rf "${RUNNER_TEMP}/.buildx-cache"
136+ /bin/mv -f "${RUNNER_TEMP}/.buildx-cache-new" "${RUNNER_TEMP}/.buildx-cache"
137+ - name : Clear
138+ if : always()
139+ run : |
140+ shred -u "${HOME}/.docker/config.json"
141+ rm -f "${HOME}/.docker/config.json"
142+ docker buildx rm "builder-${GITHUB_SHA::8}" || true
0 commit comments