3 # Copyright (C) 2013-2014 W. Trevor King <wking@tremily.us>
5 # Redistribution and use in source and binary forms, with or without
6 # modification, are permitted provided that the following conditions are met:
8 # * Redistributions of source code must retain the above copyright notice, this
9 # list of conditions and the following disclaimer.
11 # * Redistributions in binary form must reproduce the above copyright notice,
12 # this list of conditions and the following disclaimer in the documentation
13 # and/or other materials provided with the distribution.
15 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16 # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
19 # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25 # POSSIBILITY OF SUCH DAMAGE.
27 AUTHOR="${AUTHOR:-W. Trevor King <wking@tremily.us>}"
28 NAMESPACE="${NAMESPACE:-wking}"
29 DATE="${DATE:-20141023}"
30 MIRROR="${MIRROR:-http://distfiles.gentoo.org/}"
31 ARCH_URL="${ARCH_URL:-${MIRROR}releases/amd64/autobuilds/${DATE}/}"
32 STAGE3="${STAGE3:-stage3-amd64-${DATE}.tar.bz2}"
33 STAGE3_CONTENTS="${STAGE3_CONTENTS:-${STAGE3}.CONTENTS}"
34 STAGE3_DIGESTS="${STAGE3_DIGESTS:-${STAGE3}.DIGESTS.asc}"
35 PORTAGE_URL="${PORTAGE_URL:-${MIRROR}snapshots/}"
36 PORTAGE="${PORTAGE:-portage-${DATE}.tar.xz}"
37 PORTAGE_SIG="${PORTAGE_SIG:-${PORTAGE}.gpgsig}"
39 DOCKER_IO=$(command -v docker.io)
40 DOCKER="${DOCKER:-${DOCKER_IO:-docker}}"
41 BUILD_OPTS="${BUILD_OPTS:-}"
86 REALPATH="${REALPATH:-$(command -v realpath)}"
87 if [ -z "${REALPATH}" ]; then
88 READLINK="${READLINK:-$(command -v readlink)}"
89 if [ -n "${READLINK}" ]; then
90 REALPATH="${READLINK} -f"
92 die "need realpath or readlink to canonicalize paths"
96 # Does "${NAMESPACE}/${REPO}:${DATE}" exist?
97 # Returns 0 (exists) or 1 (missing).
105 IMAGES=$("${DOCKER}" images "${NAMESPACE}/${REPO}")
106 MATCHES=$(echo "${IMAGES}" | grep "${DATE}")
107 if [ -z "${MATCHES}" ]; then
113 # If they don't already exist:
115 # * download the stage3 and
116 # * create "${NAMESPACE}/gentoo:${DATE}"
118 # Forcibly tag "${NAMESPACE}/gentoo:${DATE}" with "latest"
122 if ! repo_exists gentoo; then
123 # import stage3 image from Gentoo mirrors
125 for FILE in "${STAGE3}" "${STAGE3_CONTENTS}" "${STAGE3_DIGESTS}"; do
126 if [ ! -f "downloads/${FILE}" ]; then
127 wget -O "downloads/${FILE}" "${ARCH_URL}${FILE}" ||
128 die "failed to download ${ARCH_URL}${FILE}"
132 gpg --verify "downloads/${STAGE3_DIGESTS}" ||
133 die "insecure digests for gentoo"
134 SHA512_HASHES=$(grep -A1 SHA512 "downloads/${STAGE3_DIGESTS}" | grep -v '^--')
135 SHA512_CHECK=$(cd downloads/ && (echo "${SHA512_HASHES}" | sha512sum -c))
136 SHA512_FAILED=$(echo "${SHA512_CHECK}" | grep FAILED)
137 if [ -n "${SHA512_FAILED}" ]; then
138 die "${SHA512_FAILED}"
141 msg "import ${NAMESPACE}/gentoo:${DATE}"
142 "${DOCKER}" import - "${NAMESPACE}/gentoo:${DATE}" < "downloads/${STAGE3}" ||
143 die "failed to import gentoo"
146 msg "tag ${NAMESPACE}/gentoo:latest"
147 "${DOCKER}" tag -f "${NAMESPACE}/gentoo:${DATE}" "${NAMESPACE}/gentoo:latest" ||
148 die "failed to tag gentoo"
151 # If they don't already exist:
153 # * download a portage snapshot and
154 # * create "${NAMESPACE}/portage-import:${DATE}"
156 # Forcibly tag "${NAMESPACE}/portage-import:${DATE}" with "latest"
160 if ! repo_exists portage-import; then
161 # import portage image from Gentoo mirrors
163 for FILE in "${PORTAGE}" "${PORTAGE_SIG}"; do
164 if [ ! -f "downloads/${FILE}" ]; then
165 wget -O "downloads/${FILE}" "${PORTAGE_URL}${FILE}" ||
166 die "failed to download ${PORTAGE_URL}${FILE}"
170 gpg --verify "downloads/${PORTAGE_SIG}" "downloads/${PORTAGE}" ||
171 die "insecure digests for portage-import"
173 msg "import ${NAMESPACE}/portage-import:${DATE}"
174 "${DOCKER}" import - "${NAMESPACE}/portage-import:${DATE}" < "downloads/${PORTAGE}" ||
175 die "failed to import portage-import"
178 msg "tag ${NAMESPACE}/portage-import:latest"
179 "${DOCKER}" tag -f "${NAMESPACE}/portage-import:${DATE}" "${NAMESPACE}/portage-import:latest" ||
180 die "failed to tag portage-import"
183 # extract Busybox for the portage image
187 # 1: SUBDIR target subdirectory for the busybox binary
191 msg "extract Busybox binary to ${SUBDIR}"
192 THIS_DIR=$(dirname $($REALPATH $0))
193 CONTAINER="${NAMESPACE}-gentoo-${DATE}-extract-busybox"
194 "${DOCKER}" run --name "${CONTAINER}" -v "${THIS_DIR}/${SUBDIR}/":/tmp "${NAMESPACE}/gentoo:${DATE}" cp /bin/busybox /tmp/
195 "${DOCKER}" rm "${CONTAINER}"
198 # If it doesn't already exist:
200 # * create "${NAMESPACE}/${REPO}:${DATE}" from
201 # "${REPO}/Dockerfile.template"
203 # Forcibly tag "${NAMESPACE}/${REPO}:${DATE}" with "latest"
211 msg "build repo ${REPO}"
212 if ! repo_exists "${REPO}"; then
213 if [ "${REPO}" = portage ]; then
214 extract_busybox "${REPO}"
218 NAMESPACE="${NAMESPACE}" \
220 MAINTAINER="${AUTHOR}" \
226 < "${REPO}/Dockerfile.template" > "${REPO}/Dockerfile"
228 msg "build ${NAMESPACE}/${REPO}:${DATE}"
229 "${DOCKER}" build ${BUILD_OPTS} -t "${NAMESPACE}/${REPO}:${DATE}" "${REPO}" ||
230 die "failed to build ${REPO}"
232 msg "tag ${NAMESPACE}/${REPO}:latest"
233 "${DOCKER}" tag -f "${NAMESPACE}/${REPO}:${DATE}" "${NAMESPACE}/${REPO}:latest" ||
234 die "failed to tag ${REPO}"
242 for REPO in ${REPOS}; do
249 for REPO in gentoo portage-import ${REPOS}; do
250 if ! repo_exists "${REPO}"; then
261 --help) msg "usage: ${0} [--help] {build|missing}" ;;
262 *) die "invalid action '${ACTION}'" ;;