build success
This commit is contained in:
23
BUILD.sh
23
BUILD.sh
@@ -1,5 +1,7 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
|
set -eo pipefail
|
||||||
|
|
||||||
hasunset=0
|
hasunset=0
|
||||||
|
|
||||||
if [[ "$CLOUD_CONFIG_REPO" -eq "" ]]; then
|
if [[ "$CLOUD_CONFIG_REPO" -eq "" ]]; then
|
||||||
@@ -24,9 +26,28 @@ if [[ "$hasunset" -ne 0 ]]; then
|
|||||||
grep -E "^ENV" ./Dockerfile
|
grep -E "^ENV" ./Dockerfile
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
cleanup_() {
|
||||||
|
if [[ "$GPG_PRIVATE_KEY" -ne "" ]]; then
|
||||||
|
rm ./bot-gpg-key.asc
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
trap cleanup_ INT TERM
|
||||||
|
|
||||||
|
if [[ "$GPG_PRIVATE_KEY" -ne "" ]]; then
|
||||||
|
echo "$GPG_PRIVATE_KEY" > ./bot-gpg-key.asc
|
||||||
|
elif [[ ! -f ./bot-gpg-key.asc ]]; then
|
||||||
|
echo "GPG key not found. Terminating.."
|
||||||
|
exit -1
|
||||||
|
fi
|
||||||
|
|
||||||
|
IMAGE_TAG=$(git rev-parse --short HEAD)
|
||||||
|
IMAGE_NAME=${IMAGE_NAME:-bearcloud}
|
||||||
|
|
||||||
|
echo "Image tag: $IMAGE_NAME:$IMAGE_TAG and $IMAGE_NAME:latest"
|
||||||
echo "Additional arguments: $@"
|
echo "Additional arguments: $@"
|
||||||
echo "Continue?"
|
echo "Continue?"
|
||||||
read
|
read
|
||||||
|
|
||||||
sudo docker build . $@
|
sudo docker build -t "$IMAGE_NAME:$IMAGE_TAG" -t "$IMAGE_NAME:latest" $@ .
|
||||||
|
|
||||||
|
|||||||
13
Dockerfile
13
Dockerfile
@@ -3,20 +3,19 @@ FROM alpine:latest AS rootfs-builder
|
|||||||
ENV CLOUD_CONFIG_REPO=https://git.sfclub.cc/cloud/bearnet
|
ENV CLOUD_CONFIG_REPO=https://git.sfclub.cc/cloud/bearnet
|
||||||
ENV CLOUD_CONFIG_REVISION=wish
|
ENV CLOUD_CONFIG_REVISION=wish
|
||||||
ENV CLOUD_GATEWAY_ADDRESS=10.0.0.119
|
ENV CLOUD_GATEWAY_ADDRESS=10.0.0.119
|
||||||
|
RUN apk update && apk add alpine-make-vm-image make
|
||||||
COPY /image /kitchen
|
COPY /image /kitchen
|
||||||
COPY ./scripts/orchestrate.py /kitchen/overlay/daemon/orchestrate.py
|
COPY ./scripts/orchestrate.py /kitchen/overlay/daemon/orchestrate.py
|
||||||
COPY bot-gpg-key.asc /kitchen/overlay/root/gpg-key.asc
|
COPY bot-gpg-key.asc /kitchen/overlay/root/gpg-key.asc
|
||||||
RUN sed -i "s/_REPO_/$CLOUD_CONFIG_REPO/g" /kitchen/overlay/daemon/update.sh \
|
RUN sed -i "s#_REPO_#$CLOUD_CONFIG_REPO#g" /kitchen/overlay/daemon/update.sh && \
|
||||||
sed -i "s/_REVISION_/$CLOUD_CONFIG_REVISION/g" /kitchen/overlay/daemon/update.sh \
|
sed -i "s#_REVISION_#$CLOUD_CONFIG_REVISION#g" /kitchen/overlay/daemon/update.sh && \
|
||||||
sed -i "s/GATEWAY_ADDRESS/$CLOUD_GATEWAY_ADDRESS/g" /kitchen/overlay/etc/dhcp/dhclient.conf
|
sed -i "s#GATEWAY_ADDRESS#$CLOUD_GATEWAY_ADDRESS#g" /kitchen/overlay/etc/dhcp/dhclient.conf
|
||||||
RUN apk update && apk add alpine-make-vm-image \
|
RUN cd /kitchen && make build && mkdir /image && cp ./vm.raw /image
|
||||||
cd /kitchen && make build extract-kernel && mkdir /image && cp ./$IMAGE_NAME* /image
|
|
||||||
|
|
||||||
FROM alpine:latest AS hypervisor
|
FROM alpine:latest AS hypervisor
|
||||||
ADD ./scripts/setup-hypervisor.sh /setup.sh
|
ADD ./scripts/setup-hypervisor.sh /setup.sh
|
||||||
# Download cloud hypervisor
|
# Download cloud hypervisor
|
||||||
RUN apk update && apk add bash curl jq tini && sh /setup.sh && rm /setup.sh && mkdir /app
|
RUN apk update && apk add bash curl jq tini linux-virt && sh /setup.sh && rm /setup.sh && mkdir /app
|
||||||
COPY --from=rootfs-builder /image /image
|
COPY --from=rootfs-builder /image /image
|
||||||
COPY ./scripts/entrypoint.sh /entrypoint.sh
|
COPY ./scripts/entrypoint.sh /entrypoint.sh
|
||||||
|
|
||||||
|
|||||||
@@ -1,24 +1,8 @@
|
|||||||
# Alpine VM Image Builder
|
|
||||||
# ------------------------
|
|
||||||
# Builds a bootable Alpine Linux disk image for Cloud Hypervisor direct boot.
|
|
||||||
#
|
|
||||||
# Usage:
|
|
||||||
# make build — generate GPG key + build qcow2 image
|
|
||||||
# make build-raw — build raw image (for Cloud Hypervisor direct boot)
|
|
||||||
# make extract-kernel — extract kernel + initramfs from image
|
|
||||||
# make clean — remove build artifacts
|
|
||||||
#
|
|
||||||
# Configurable variables (override on command line):
|
|
||||||
# IMAGE_SIZE Size of the disk image (default: 4G)
|
|
||||||
# ALPINE_BRANCH Alpine release branch (default: latest-stable)
|
|
||||||
# KERNEL_FLAVOR Kernel variant (default: virt)
|
|
||||||
# ALPINE_MIRROR APK mirror (default: http://dl-cdn.alpinelinux.org/alpine)
|
|
||||||
|
|
||||||
SHELL := /bin/sh
|
SHELL := /bin/sh
|
||||||
|
|
||||||
# --- configurable ----------------------------------------------------
|
# --- configurable ----------------------------------------------------
|
||||||
IMAGE_NAME = alpine-vm
|
IMAGE_NAME = alpine-vm
|
||||||
IMAGE_SIZE ?= 4G
|
IMAGE_SIZE ?= 2G
|
||||||
IMAGE_FORMAT = raw
|
IMAGE_FORMAT = raw
|
||||||
ALPINE_BRANCH ?= latest-stable
|
ALPINE_BRANCH ?= latest-stable
|
||||||
KERNEL_FLAVOR ?= virt
|
KERNEL_FLAVOR ?= virt
|
||||||
@@ -35,7 +19,7 @@ build:
|
|||||||
echo "ERROR: GPG key not found. Generate key first" >&2; \
|
echo "ERROR: GPG key not found. Generate key first" >&2; \
|
||||||
exit 1; \
|
exit 1; \
|
||||||
}
|
}
|
||||||
$(MAKE_VM_IMAGE) \
|
alpine-make-vm-image \
|
||||||
--branch $(ALPINE_BRANCH) \
|
--branch $(ALPINE_BRANCH) \
|
||||||
--image-format $(IMAGE_FORMAT) \
|
--image-format $(IMAGE_FORMAT) \
|
||||||
--image-size $(IMAGE_SIZE) \
|
--image-size $(IMAGE_SIZE) \
|
||||||
@@ -44,29 +28,10 @@ build:
|
|||||||
--fs-skel-dir $(OVERLAY_DIR) \
|
--fs-skel-dir $(OVERLAY_DIR) \
|
||||||
--fs-skel-chown root:root \
|
--fs-skel-chown root:root \
|
||||||
--script-chroot \
|
--script-chroot \
|
||||||
--packages "python3 py3-yaml py3-pydantic git curl gnupg docker docker-cli-buildx docker-cli-compose" \
|
--packages "python3 py3-yaml py3-pydantic git curl gnupg docker docker-cli-buildx docker-cli-compose cronie" \
|
||||||
$(IMAGE_FILE) \
|
$(IMAGE_FILE) \
|
||||||
$(CONFIGURE_SH)
|
$(CONFIGURE_SH)
|
||||||
@echo ">>> Image built: $(IMAGE_FILE)"
|
@echo ">>> Image built: $(IMAGE_FILE)"
|
||||||
@ls -lh $(IMAGE_FILE)
|
@ls -lh $(IMAGE_FILE)
|
||||||
|
|
||||||
# Raw image (best for Cloud Hypervisor)
|
.PHONY: build
|
||||||
build-raw:
|
|
||||||
$(MAKE) build IMAGE_FORMAT=raw
|
|
||||||
|
|
||||||
# --- kernel extraction -----------------------------------------------
|
|
||||||
|
|
||||||
extract-kernel: $(IMAGE_FILE)
|
|
||||||
@echo ">>> Extracting kernel and initramfs from $(IMAGE_FILE) ..."
|
|
||||||
@which guestmount >/dev/null 2>&1 || { \
|
|
||||||
echo "ERROR: guestmount (libguestfs) required. Install: apk add libguestfs" >&2; \
|
|
||||||
exit 1; \
|
|
||||||
}
|
|
||||||
@mkdir -p $(IMAGE_NAME)-boot
|
|
||||||
guestmount -a $(IMAGE_FILE) -m /dev/sda --ro $(IMAGE_NAME)-boot
|
|
||||||
cp $(IMAGE_NAME)-boot/boot/vmlinuz-$(KERNEL_FLAVOR) vmlinuz
|
|
||||||
cp $(IMAGE_NAME)-boot/boot/initramfs-$(KERNEL_FLAVOR) initramfs
|
|
||||||
guestunmount $(IMAGE_NAME)-boot
|
|
||||||
rmdir $(IMAGE_NAME)-boot
|
|
||||||
|
|
||||||
.PHONY: build build-raw build-no-gpg extract-kernel gpg-key gpg-fingerprint
|
|
||||||
|
|||||||
1
image/overlay/root/.ssh/authorized_keys
Normal file
1
image/overlay/root/.ssh/authorized_keys
Normal file
@@ -0,0 +1 @@
|
|||||||
|
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIN6GbswtvLbhmju/vBunpfPaqpcIuESJSLoR+Sz0ujTs cardno:F1D0_013135A1
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
python3
|
|
||||||
py3-yaml
|
|
||||||
py3-pydantic
|
|
||||||
git
|
|
||||||
curl
|
|
||||||
gnupg
|
|
||||||
docker
|
|
||||||
docker-cli-buildx
|
|
||||||
docker-cli-compose
|
|
||||||
cronie
|
|
||||||
2
scripts/entrypoint.sh
Normal file → Executable file
2
scripts/entrypoint.sh
Normal file → Executable file
@@ -2,7 +2,7 @@
|
|||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
/usr/bin/cloud-hypervisor \
|
/usr/bin/cloud-hypervisor \
|
||||||
--kernel /image/vmlinuz --initramfs /image/initramfs --disk path=/image/vm.raw \
|
--kernel /boot/vmlinuz-virt --initramfs /boot/initramfs-virt --disk path=/image/vm.raw \
|
||||||
--cmdline "root=/dev/vda rootfstype=ext4 modules=ext4a rw console=hvc0" \
|
--cmdline "root=/dev/vda rootfstype=ext4 modules=ext4a rw console=hvc0" \
|
||||||
--cpus boot=${CPU_COUNT:-4} \
|
--cpus boot=${CPU_COUNT:-4} \
|
||||||
--memory size=${MEMORY:-4G},shared=on \
|
--memory size=${MEMORY:-4G},shared=on \
|
||||||
|
|||||||
0
scripts/orchestrate.py
Normal file → Executable file
0
scripts/orchestrate.py
Normal file → Executable file
0
scripts/setup-hypervisor.sh
Normal file → Executable file
0
scripts/setup-hypervisor.sh
Normal file → Executable file
Reference in New Issue
Block a user