From fc61df79b6dc849b028a64c3b9f16ded8722f2e5 Mon Sep 17 00:00:00 2001 From: Takumi Sueda Date: Sat, 20 Feb 2021 04:29:49 +0900 Subject: [PATCH] Build Brainux on CI --- .github/workflows/build.yml | 93 +++++++++++++++---- Makefile | 26 ++++-- image/build_image.sh | 62 +++++++++++++ linux-brain | 2 +- os-brainux/override.sh | 11 +++ os-brainux/override/etc/issue | 2 + os-brainux/override/etc/issue.net | 1 + os-brainux/override/etc/motd | 12 +++ os-brainux/override/usr/lib/os-release | 9 ++ .../setup_brainux.sh | 34 ++++--- 10 files changed, 216 insertions(+), 36 deletions(-) create mode 100755 image/build_image.sh create mode 100755 os-brainux/override.sh create mode 100644 os-brainux/override/etc/issue create mode 100644 os-brainux/override/etc/issue.net create mode 100644 os-brainux/override/etc/motd create mode 100644 os-brainux/override/usr/lib/os-release rename tools/setup_debian.sh => os-brainux/setup_brainux.sh (58%) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f0d7916..574d84d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -29,7 +29,42 @@ jobs: draft: false prerelease: true - build: + build-linux: + runs-on: ubuntu-20.04 + needs: [create_release] + steps: + - uses: actions/checkout@v2 + with: + submodules: true + - name: Workaround for apt update failure + run: sudo rm /etc/apt/sources.list.d/github_git-lfs.* + - name: Install deps + run: sudo apt update && sudo apt install build-essential bison flex libncurses5-dev gcc-arm-linux-gnueabi qemu-user-static debootstrap + - name: Configure for Linux + run: make ldefconfig + - name: Build Linux + run: make lbuild + - name: Setup releases + id: release_name + run: | + mkdir release + cp ./linux-brain/arch/arm/boot/dts/imx28-pwsh*.dtb release/ + cp ./linux-brain/arch/arm/boot/zImage release/zImage + zip -r release.zip release/ + - name: Generate archive name + id: archive_name + run: echo ::set-output name=name::linux-${GITHUB_REF/refs\/*s\//} + - name: Upload release.zip + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ needs.create_release.outputs.upload_url }} + asset_path: release.zip + asset_name: ${{ steps.archive_name.outputs.name }}.zip + asset_content_type: application/zip + + build-uboot: runs-on: ubuntu-20.04 needs: [create_release] strategy: @@ -64,18 +99,6 @@ jobs: run: make ubuild - name: Generate NK.bin run: make nk.bin - - name: Configure for Linux - run: make ldefconfig - - name: Build Linux - run: make lbuild - - # - name: Build Debian Root # Wait for buildroot - # run: | - # ./tools/aptcache_linux_amd64 \ - # -rule 'local=localhost:65432, remote=ftp.us.debian.org' \ - # -rule 'local=localhost:65433, remote=security.debian.org' & - # make debian - - name: Setup releases id: release_name run: | @@ -83,9 +106,10 @@ jobs: cp ./u-boot-brain/u-boot.bin release/u-boot.bin cp ./u-boot-brain/u-boot.sb release/u-boot.sb cp ./nk.bin release/${{ matrix.nk }} - cp ./linux-brain/arch/arm/boot/dts/imx28-pw${{ matrix.model }}.dtb release/imx28-pw${{ matrix.model }}.dtb - cp ./linux-brain/arch/arm/boot/zImage release/zImage zip -r release.zip release/ + - name: Generate archive name + id: archive_name + run: echo ::set-output name=name::uboot-${{ matrix.model }}-${GITHUB_REF/refs\/*s\//} - name: Upload release.zip uses: actions/upload-release-asset@v1 env: @@ -93,5 +117,42 @@ jobs: with: upload_url: ${{ needs.create_release.outputs.upload_url }} asset_path: release.zip - asset_name: ${{ matrix.model }}-boot.zip + asset_name: ${{ steps.archive_name.outputs.name }}.zip asset_content_type: application/zip + + build-sd: + runs-on: ubuntu-20.04 + needs: [create_release] + steps: + - uses: actions/checkout@v2 + with: + submodules: true + - name: Workaround for apt update failure + run: sudo rm /etc/apt/sources.list.d/github_git-lfs.* + - name: Install deps + run: sudo apt update && sudo apt install kpartx build-essential bison flex libncurses5-dev gcc-arm-linux-gnueabi qemu-user-static debootstrap + - name: Configure for Linux + run: make ldefconfig + - name: Build Linux + run: make lbuild + - name: Build Debian Root + run: make brainux + - name: Build bsd-ce + run: make -C nkbin_maker bsd-ce + - name: Generate image name + id: image_name + run: echo ::set-output name=name::sdimage-${GITHUB_REF/refs\/*s\//} + - name: Build SD image + run: make image/sd.img && mv image/sd.img ${{ steps.image_name.outputs.name }}.img + - name: Compress + run: zip ${{ steps.image_name.outputs.name }}.zip ${{ steps.image_name.outputs.name }}.img + - name: Upload the image + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ needs.create_release.outputs.upload_url }} + asset_path: ${{ steps.image_name.outputs.name }}.zip + asset_name: ${{ steps.image_name.outputs.name }}.zip + asset_content_type: application/zip + diff --git a/Makefile b/Makefile index a63567f..c5b9206 100644 --- a/Makefile +++ b/Makefile @@ -80,16 +80,30 @@ nkbin-maker: nk.bin: ./nkbin_maker/bsd-ce ./u-boot-brain/u-boot.bin -debian: +brainux: @if [ "$(shell uname)" != "Linux" ]; then \ echo "Debootstrap is only available in Linux!"; \ exit 1; \ fi - mkdir -p debian - sudo debootstrap --arch=armel --foreign buster debian/ http://localhost:65432/debian/ - sudo cp /usr/bin/qemu-arm-static debian/usr/bin/ - sudo cp ./tools/setup_debian.sh debian/ - sudo chroot debian /setup_debian.sh + mkdir -p brainux + @if [ "$(CI)" = "true" ]; then \ + echo "I'm in CI and debootstrap without cache."; \ + sudo debootstrap --arch=armel --foreign buster brainux/; \ + else \ + sudo debootstrap --arch=armel --foreign buster brainux/ http://localhost:65432/debian/; \ + fi + sudo cp /usr/bin/qemu-arm-static brainux/usr/bin/ + sudo cp ./os-brainux/setup_brainux.sh brainux/ + sudo -E chroot brainux /setup_brainux.sh + sudo rm brainux/setup_brainux.sh + sudo ./os-brainux/override.sh ./os-brainux/override ./brainux + +image/sd.img: clean_work + ./image/build_image.sh + +.PHONY: +clean_work: + sudo rm -rf image/work .PHONY: aptcache: diff --git a/image/build_image.sh b/image/build_image.sh new file mode 100755 index 0000000..9052f1f --- /dev/null +++ b/image/build_image.sh @@ -0,0 +1,62 @@ +#!/bin/bash +set -uex -o pipefail + +JOBS=$(nproc) +REPO=$(git rev-parse --show-toplevel) +WORK=${REPO}/image/work +LINUX=${REPO}/linux-brain +IMG=${REPO}/image/sd.img + +mkdir -p ${WORK} + +for i in $(seq 1 6); do + make -C ${REPO}/u-boot-brain pwsh${i}_defconfig + make -j${JOBS} -C ${REPO}/u-boot-brain u-boot.bin + ${REPO}/nkbin_maker/bsd-ce ${REPO}/u-boot-brain/u-boot.bin + + case $i in + 1|2|3) + mv ${REPO}/nk.bin ${WORK}/edsa${i}exe.bin;; + 4|5|6) + mv ${REPO}/nk.bin ${WORK}/edsh${i}exe.bin;; + *) + echo "WTF: $i" + exit 1;; + esac +done + +dd if=/dev/zero of=${IMG} bs=1M count=2048 + +START1=2048 +SECTORS1=$((1024 * 1024 * 64 / 512)) +START2=$((2048 + ${SECTORS1})) + +cat < ${WORK}/part.sfdisk +${IMG}1 : start=${START1}, size=${SECTORS1}, type=b +${IMG}2 : start=${START2}, type=83 +EOF + +sfdisk ${IMG} < ${WORK}/part.sfdisk + +sudo kpartx -av ${IMG} + +LOOPDEV=$(losetup -l | grep sd.img | grep -o 'loop.') + +sudo mkfs.fat -F32 -v -I /dev/mapper/${LOOPDEV}p1 +sudo mkfs.ext4 /dev/mapper/${LOOPDEV}p2 + +mkdir -p ${WORK}/p1 ${WORK}/p2 +sudo mount /dev/mapper/${LOOPDEV}p1 ${WORK}/p1 +sudo mount /dev/mapper/${LOOPDEV}p2 ${WORK}/p2 + +sudo cp ${LINUX}/arch/arm/boot/zImage ${WORK}/p1/ +sudo cp ${LINUX}/arch/arm/boot/dts/imx28-pwsh*.dtb ${WORK}/p1/ +sudo cp ${WORK}/*.bin ${WORK}/p1/ + +sudo cp -ra ${REPO}/brainux/* ${WORK}/p2/ + +sudo umount ${WORK}/p1 ${WORK}/p2 +sudo kpartx -d ${IMG} + +rmdir ${WORK}/p1 ${WORK}/p2 + diff --git a/linux-brain b/linux-brain index 550d9bd..a1c7346 160000 --- a/linux-brain +++ b/linux-brain @@ -1 +1 @@ -Subproject commit 550d9bd50c3b0591e91f05f96b6f159cdacad6fa +Subproject commit a1c7346b9a87a762868be715be2296bcda314408 diff --git a/os-brainux/override.sh b/os-brainux/override.sh new file mode 100755 index 0000000..8cafb7e --- /dev/null +++ b/os-brainux/override.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +set -uex -o pipefail + +SRC=$1 +DST=$2 + +install -g root -o root -m 0644 $SRC/usr/lib/os-release $DST/usr/lib/os-release +install -g root -o root -m 0644 $SRC/etc/issue $DST/etc/issue +install -g root -o root -m 0644 $SRC/etc/issue.net $DST/etc/issue.net +install -g root -o root -m 0644 $SRC/etc/motd $DST/etc/motd diff --git a/os-brainux/override/etc/issue b/os-brainux/override/etc/issue new file mode 100644 index 0000000..65852ac --- /dev/null +++ b/os-brainux/override/etc/issue @@ -0,0 +1,2 @@ +Brainux GNU/Linux 10 \n \l + diff --git a/os-brainux/override/etc/issue.net b/os-brainux/override/etc/issue.net new file mode 100644 index 0000000..ef11720 --- /dev/null +++ b/os-brainux/override/etc/issue.net @@ -0,0 +1 @@ +Brainux GNU/Linux 10 diff --git a/os-brainux/override/etc/motd b/os-brainux/override/etc/motd new file mode 100644 index 0000000..b0665a4 --- /dev/null +++ b/os-brainux/override/etc/motd @@ -0,0 +1,12 @@ + + ____ _ + | _ \ (_) + | |_) |_ __ __ _ _ _ __ _ ___ __ + | _ <| '__/ _` | | '_ \| | | \ \/ / + | |_) | | | (_| | | | | | |_| |> < + |____/|_| \__,_|_|_| |_|\__,_/_/\_\ + + by Brain Hackers + + https://github.com/brain-hackers + diff --git a/os-brainux/override/usr/lib/os-release b/os-brainux/override/usr/lib/os-release new file mode 100644 index 0000000..e60947d --- /dev/null +++ b/os-brainux/override/usr/lib/os-release @@ -0,0 +1,9 @@ +PRETTY_NAME="Brainux GNU/Linux 10 (buster)" +NAME="Brainux GNU/Linux" +VERSION_ID="10" +VERSION="10 (buster)" +VERSION_CODENAME=buster +ID=debian +HOME_URL="https://github.com/brain-hackers/README" +SUPPORT_URL="https://github.com/brain-hackers/buildbrain" +BUG_REPORT_URL="https://github.com/brain-hackers/buildbrain" diff --git a/tools/setup_debian.sh b/os-brainux/setup_brainux.sh similarity index 58% rename from tools/setup_debian.sh rename to os-brainux/setup_brainux.sh index bd48796..a216bf2 100755 --- a/tools/setup_debian.sh +++ b/os-brainux/setup_brainux.sh @@ -4,14 +4,21 @@ TIMEZONE="Asia/Tokyo" /debootstrap/debootstrap --second-stage -# Use local APT cache during debootstrap +if [ "${CI}" == "true" ]; then + REPO=deb.debian.org + REPO_SECURITY=deb.debian.org +else + REPO=localhost:65432 + REPO_SECURITY=localhost:65433 +fi + cat < /etc/apt/sources.list -deb http://localhost:65432/debian buster main contrib non-free -deb-src http://localhost:65432/debian buster main contrib non-free -deb http://localhost:65432/debian buster-updates main contrib non-free -deb-src http://localhost:65432/debian buster-updates main contrib non-free -deb http://localhost:65433/debian-security buster/updates main contrib non-free -deb-src http://localhost:65433/debian-security buster/updates main contrib non-free +deb http://${REPO}/debian buster main contrib non-free +deb-src http://${REPO}/debian buster main contrib non-free +deb http://${REPO}/debian buster-updates main contrib non-free +deb-src http://${REPO}/debian buster-updates main contrib non-free +deb http://${REPO_SECURITY}/debian-security buster/updates main contrib non-free +deb-src http://${REPO_SECURITY}/debian-security buster/updates main contrib non-free EOF cat < /etc/apt/apt.conf.d/90-norecommend @@ -44,6 +51,7 @@ DEBIAN_FRONTEND=noninteractive \ xserver-xorg xserver-xorg-video-fbdev xserver-xorg-dev xorg-dev x11-apps \ openbox obconf obmenu \ weston xwayland \ + alsa-utils \ bash tmux vim htop \ midori pcmanfm lxterminal xterm gnome-terminal fonts-noto-cjk \ dbus udev build-essential flex bison pkg-config autotools-dev libtool autoconf automake \ @@ -52,11 +60,11 @@ DEBIAN_FRONTEND=noninteractive \ # Get wild cat < /etc/apt/sources.list -deb http://ftp.jaist.ac.jp/debian buster main contrib non-free -deb-src http://ftp.jaist.ac.jp/debian buster main contrib non-free -deb http://ftp.jaist.ac.jp/debian buster-updates main contrib non-free -deb-src http://ftp.jaist.ac.jp/debian buster-updates main contrib non-free -deb http://security.debian.org/debian-security buster/updates main contrib non-free -deb-src http://security.debian.org/debian-security buster/updates main contrib non-free +deb http://deb.debian.org/debian buster main contrib non-free +deb-src http://deb.debian.org/debian buster main contrib non-free +deb http://deb.debian.org/debian buster-updates main contrib non-free +deb-src http://deb.debian.org/debian buster-updates main contrib non-free +deb http://deb.debian.org/debian-security buster/updates main contrib non-free +deb-src http://deb.debian.org/debian-security buster/updates main contrib non-free EOF