split-repo: Populate base branch

In order to create multiple Jenkins build pipelines for this repository,
I'm splitting it up with branches.  There will be a branch for each
image:

* base/main: The base image
* cross/main: The image with a cross-compiler toolchain
* build/main: The final build image

Note _/main_ in each name.  The intent here is to be able to have
different "sub-branches" for each image, so e.g. there might be a
_base/dev_.

In addition to the branches for each image, there will be branches for
the shared library code as well, named like _lib/main_.  The image
branches will checkout this branch using `git worktree`.
base/main
Dustin 2024-12-15 10:57:04 -06:00
parent c3418b96e7
commit 06b65957c0
13 changed files with 17 additions and 251 deletions

View File

@ -1,62 +0,0 @@
# Aimee OS Build Container Images
Prerequisites:
* `buildah`
## Gentoo Stage 3 Image
This image is used to bootstrap the base layer for Aimee OS build images. To
build it, use the `gentoo-stage3.sh` build script. This script takes a single
(optional) positional argument: the name of a Gentoo stage 3 tarball to use to
produce the container image. If none is specified, the latest
`stage3-amd64-nomultilib-openrc` tarball is downloaded and used.
```sh
sh image-build/gentoo-stage3.sh
```
## Base Image
The Aimee OS base build image is a minimal environment based on Gentoo. It
includes Portage and a basic build toolchain. Building it requires a Stage 3
image to bootstrap the environment. By default,
_aimee-os.org/gentoo/stage3-amd64-nomultilib-openrc:latest_ is used, but an
alternative image can be specified using the `-b`/`--base` argument to the
`base.sh` script.
```sh
sh image-build/base.sh
```
## Crossdev Image
This image includes a cross-compilation toolchain, generated by _crossdev_. It
is built using the `cross.sh` script. This script takes a `-t`/`--target`
argument, which specifies the toolchain to generate. The default is
`aarch64-unknown-linux-gnu`. This image is layered on top of the base image,
which can be specified using the `-b`/`--base` argument. By default,
_aimee-os.org/build/base:latest_ is used.
```sh
sh image-build/cross.sh
```
## Build Image
The top-level image is based on the Crossdev image, and includes additional
tools for building an Aimee OS project. It is built using the `build.sh` script.
As with the Crossdev image build script, this script accepts `-t`/`--target`
and `-b`/`--build` arguments, which specify the cross-compilation toolchain and
base image later, respectively.
```sh
sh image-build/build.sh
```
This image is "squashed," meaning it consists of only a single layer. The Base
and Crossdev image layers are merged into the final layer when the image is
built. This reduces the final size of the image.

View File

@ -1,7 +1,7 @@
#!/bin/sh #!/bin/sh
SELF=$(readlink -f "$0") SELF=$(readlink -f "$0")
SRCDIR=${SELF%/*/*} SRCDIR=${SELF%/*}
. "${SRCDIR}"/lib/common.sh . "${SRCDIR}"/lib/common.sh
base=aimee-os.org/gentoo/stage3-amd64-nomultilib-openrc:latest base=aimee-os.org/gentoo/stage3-amd64-nomultilib-openrc:latest
@ -26,11 +26,11 @@ builddir=$(readlink -f "${builddir}")
work=$(buildah from -v "${builddir}":/mnt/gentoo:rw,Z "${base}") work=$(buildah from -v "${builddir}":/mnt/gentoo:rw,Z "${base}")
buildah add "${work}" portage /etc/portage/ buildah add "${work}" portage /etc/portage/
buildah_run_script "${work}" "${SRCDIR}"/lib/sync.sh buildah_run_script "${work}" "${SRCDIR}"/lib/sync.sh
buildah_run_script "${work}" "${SRCDIR}"/lib/bootstrap.sh buildah_run_script "${work}" "${SRCDIR}"/bootstrap.sh
cid=$(buildah from scratch) cid=$(buildah from scratch)
buildah copy "${cid}" "${builddir}" / buildah copy "${cid}" "${builddir}" /
buildah_run_script "${cid}" "${SRCDIR}"/lib/profile.sh buildah_run_script "${cid}" "${SRCDIR}"/profile.sh
buildah config --cmd /bin/bash "${cid}" buildah config --cmd /bin/bash "${cid}"
buildah commit --rm --squash "${cid}" aimee-os.org/build/base buildah commit --rm --squash "${cid}" aimee-os.org/build/base

28
ci/Jenkinsfile vendored
View File

@ -8,27 +8,25 @@ pipeline {
} }
stages { stages {
stage('Prepare') {
steps {
container('jnlp') {
// TODO checkout lib/ branch based on $BRANCH_NAME
sh 'git fetch origin lib/main:lib/main'
sh 'git worktree add lib lib/main'
}
}
}
stage('Gentoo Stage 3') { stage('Gentoo Stage 3') {
steps { steps {
sh 'sh -e image-build/gentoo-stage3.sh' sh 'sh -e gentoo-stage3.sh'
} }
} }
stage('Base') { stage('Base') {
steps { steps {
sh 'sh -e image-build/base.sh' sh 'sh -e build.sh'
}
}
stage('Cross') {
steps {
sh 'sh -e image-build/cross.sh'
}
}
stage('Build') {
steps {
sh 'sh -e image-build/build.sh'
} }
} }
@ -50,8 +48,6 @@ pipeline {
""" """
} }
sh 'buildah push aimee-os.org/build/base git.pyrocufflink.net/aimeeos/build/base' sh 'buildah push aimee-os.org/build/base git.pyrocufflink.net/aimeeos/build/base'
sh 'buildah push aimee-os.org/build/cross-aarch64-unknown-linux-gnu git.pyrocufflink.net/aimeeos/build/cross-aarch64-unknown-linux-gnu'
sh 'buildah push aimee-os.org/build/build-aarch64-unknown-linux-gnu git.pyrocufflink.net/aimeeos/build/build-aarch64-unknown-linux-gnu'
} }
} }
} }

View File

@ -1,14 +1,14 @@
#!/bin/sh #!/bin/sh
SELF=$(readlink -f "$0") SELF=$(readlink -f "$0")
SRCDIR=${SELF%/*/*} SRCDIR=${SELF%/*}
tarball=$1 tarball=$1
set -e set -e
if [ -z "${tarball}" ]; then if [ -z "${tarball}" ]; then
tarball=$(sh "${SRCDIR}"/tools/fetch-stage3.sh "$@") tarball=$(sh "${SRCDIR}"/fetch-stage3.sh "$@")
fi fi
stage3=${tarball%.tar.*} stage3=${tarball%.tar.*}
version=${stage3##*-} version=${stage3##*-}

View File

@ -1,35 +0,0 @@
#!/bin/sh
SELF=$(readlink -f "$0")
SRCDIR=${SELF%/*/*}
. "${SRCDIR}"/lib/common.sh
target=aarch64-unknown-linux-gnu
while [ $# -gt 0 ]; do
case "$1" in
-t|--target)
shift
target="$1"
;;
-b|--base)
shift
base="$1"
;;
*)
printf 'Unknown argument: %s\n' "$1" >&2
exit 2
;;
esac
done
if [ -z "${base-}" ]; then
base=aimee-os.org/build/cross-"${target}"
fi
set -e
cid=$(buildah from "${base}")
buildah add "${cid}" portage /etc/portage
buildah_run_script "${cid}" "${SRCDIR}"/lib/sync.sh
buildah_run_script "${cid}" "${SRCDIR}"/lib/tools.sh
buildah commit --rm --squash "${cid}" "aimee-os.org/build/build-${target}"

View File

@ -1,32 +0,0 @@
#!/bin/sh
SELF=$(readlink -f "$0")
SRCDIR=${SELF%/*/*}
. "${SRCDIR}"/lib/common.sh
target=aarch64-unknown-linux-gnu
base=aimee-os.org/build/base
while [ $# -gt 0 ]; do
case "$1" in
-t|--target)
shift
target="$1"
;;
-b|--base)
shift
base="$1"
;;
*)
printf 'Unknown argument: %s\n' "$1" >&2
exit 2
;;
esac
shift
done
set -e
cid=$(buildah from "${base}")
buildah_run_script "${cid}" "${SRCDIR}"/lib/sync.sh
buildah_run_script "${cid}" "${SRCDIR}"/lib/crossdev.sh "${target}"
buildah commit --rm "${cid}" aimee-os.org/build/cross-"${target}"

View File

@ -1,21 +0,0 @@
#!/bin/sh
buildah_run_script() {
local cid script
cid=$1
shift
script=$(readlink -f "$1")
shift
mkdir -p binpkgs log tmp
buildah run \
--mount type=cache,target=/var/db/repos/gentoo \
--mount type=cache,target=/var/cache \
--mount type=bind,src="${PWD}"/log,target=/var/log,rw,z \
--mount type=bind,src="${PWD}"/tmp,target=/var/tmp,rw,z \
--mount type=bind,src="${PWD}"/binpkgs,target=/var/cache/binpkgs,rw,z \
--mount type=bind,src="${script}",target=/run/script,ro,z \
--tty=false \
-e FEATURES='-ipc-sandbox -network-sandbox -pid-sandbox' \
"${cid}" \
/run/script "$@"
}

View File

@ -1,52 +0,0 @@
#!/bin/sh
set -e
target=$1
mkdir -p /var/db/repos/crossdev/profiles /var/db/repos/crossdev/metadata
echo crossdev > /var/db/repos/crossdev/profiles/repo_name
echo 'masters = gentoo' > /var/db/repos/crossdev/metadata/layout.conf
chown -R portage:portage /var/db/repos/crossdev
mkdir -p /etc/portage/repos.conf
cat > /etc/portage/repos.conf/crossdev.conf <<EOF
[crossdev]
location = /var/db/repos/crossdev
priority = 10
masters = gentoo
auto-sync = no
EOF
emerge -kvnj --rebuilt-binaries=y sys-devel/crossdev
crossdev --stable -t "$1"
ln -s /var/db/repos/gentoo/sys-devel/rust-std /var/db/repos/crossdev/cross-${target}/
mkdir -p
/etc/portage/env/dev-lang \
/etc/portage/package.accept_keywords \
/etc/portage/package.use \
&& :
printf 'cross-%s/rust-std **\n' "${target}" \
> /etc/portage/package.accept-keywords/rust-cross
echo 'dev-lang/rust rust-src' \
> /etc/portage/package.use/rust-src
case ${target%%-*} in
aarch64)
llvm_target=AArch64
;;
arm*)
llvm_target=ARM
;;
*)
printf 'Unknown LLVM target: %s' "${target%%-*}"
exit 1
;;
esac
printf '( %s:%s:%s )\n' \
"${llvm_target}" \
"${target}" \
"${target}" \
>> /etc/portage/env/dev-lang/rust
emerge -vbknuUj cross-${target}/rust-std

View File

@ -1,8 +0,0 @@
#!/bin/sh
if [ ! -e /var/db/repos/gentoo/metadata ]; then
emerge-webrsync
fi
if [ "$(find /var/db/repos/gentoo/metadata -newermt '-24 hours' | wc -l)" -eq 0 ]; then
emaint sync
fi

View File

@ -1,20 +0,0 @@
#!/bin/sh
xargs -r emerge -vnuUj --rebuilt-binaries=y <<EOF
sys-apps/shadow
EOF
xargs -r emerge -vnuUj --rebuilt-binaries=y <<EOF
app-emulation/qemu
sec-policy/selinux-base
sys-apps/policycoreutils
sys-apps/kmod
sys-apps/systemd
sys-boot/grub
sys-fs/btrfs-progs
sys-fs/dosfstools
sys-fs/genimage
sys-fs/mtools
sys-fs/squashfs-tools
tini
EOF