Compare commits

...

No commits in common. "master" and "dev/new" have entirely different histories.

15 changed files with 186 additions and 37 deletions

1
.gitignore vendored
View File

@ -1 +1,2 @@
/_build
/airplaypi_defconfig

7
.gitmodules vendored
View File

@ -1,7 +0,0 @@
[submodule "aimee-os"]
path = aimee-os
url = https://git.pyrocufflink.net/aimeeos/aimee-os
[submodule "buildroot"]
path = buildroot
url = https://gitlab.com/buildroot.org/buildroot.git
branch = 2025.05.x

View File

@ -1,22 +0,0 @@
O ?= $(PWD)/_build
DEFCONFIG ?= aimeeos_rpi3_defconfig
AIMEEOS_SRC ?= $(PWD)/aimee-os
BUILDROOT_SRC ?= $(PWD)/buildroot
.PHONY: config
config: $(O)/.config
$(O)/.config:
$(MAKE) \
-C $(BUILDROOT_SRC) \
BR2_EXTERNAL=$(AIMEEOS_SRC) \
O=$(O) \
$(DEFCONFIG)
.PHONY: update-config
update-config:
$(MAKE) -C $(O) $(DEFCONFIG)
%:
$(MAKE) -C $(O) $@

@ -1 +0,0 @@
Subproject commit 9dae022788fa4040bbe7c5b38a3278d64e2d5458

45
airplaypi_defconfig.in Normal file
View File

@ -0,0 +1,45 @@
BR2_arm=y
BR2_cortex_a53=y
BR2_ARM_FPU_NEON_VFPV4=y
BR2_PACKAGE_HOST_LINUX_HEADERS_CUSTOM_6_12=y
BR2_TOOLCHAIN_BUILDROOT_CXX=y
BR2_GLOBAL_PATCH_DIR="board/raspberrypi/patches"
BR2_DOWNLOAD_FORCE_CHECK_HASHES=y
BR2_TARGET_GENERIC_HOSTNAME="airplaypi"
BR2_INIT_SYSTEMD=y
BR2_ROOTFS_OVERLAY="$(WORKSPACE)/rootfs-overlay"
BR2_ROOTFS_POST_IMAGE_SCRIPT="$(BR2_EXTERNAL_AIMEEOS_PATH)/board/raspberrypi3/post-image.sh"
BR2_LINUX_KERNEL=y
BR2_LINUX_KERNEL_CUSTOM_TARBALL=y
BR2_LINUX_KERNEL_DEFCONFIG="bcm2709"
BR2_LINUX_KERNEL_ZSTD=y
BR2_LINUX_KERNEL_DTS_SUPPORT=y
BR2_LINUX_KERNEL_INTREE_DTS_NAME="broadcom/bcm2710-rpi-3-b broadcom/bcm2710-rpi-3-b-plus broadcom/bcm2710-rpi-cm3"
BR2_LINUX_KERNEL_NEEDS_HOST_OPENSSL=y
# BR2_PACKAGE_BUSYBOX is not set
BR2_PACKAGE_XZ=y
BR2_PACKAGE_BRCMFMAC_SDIO_FIRMWARE_RPI=y
BR2_PACKAGE_BRCMFMAC_SDIO_FIRMWARE_RPI_BT=y
BR2_PACKAGE_BRCMFMAC_SDIO_FIRMWARE_RPI_WIFI=y
BR2_PACKAGE_READLINE=y
BR2_PACKAGE_RPI_FIRMWARE=y
BR2_PACKAGE_RPI_FIRMWARE_BOOTCODE_BIN=y
BR2_PACKAGE_RPI_FIRMWARE_VARIANT_PI=y
BR2_PACKAGE_RPI_FIRMWARE_CONFIG_FILE="$(BR2_EXTERNAL_AIMEEOS_PATH)/board/raspberrypi3/config.txt"
BR2_PACKAGE_RPI_FIRMWARE_CMDLINE_FILE="$(BR2_EXTERNAL_AIMEEOS_PATH)/board/raspberrypi3/cmdline.txt"
BR2_PACKAGE_AVAHI=y
# BR2_PACKAGE_AVAHI_AUTOIPD is not set
BR2_PACKAGE_AVAHI_DAEMON=y
BR2_PACKAGE_IPROUTE2=y
BR2_PACKAGE_IWD=y
BR2_PACKAGE_OPENSSH=y
# BR2_PACKAGE_OPENSSH_CLIENT is not set
BR2_PACKAGE_SHAIRPORT_SYNC=y
BR2_PACKAGE_SHAIRPORT_SYNC_CONVOLUTION=y
BR2_PACKAGE_SHAIRPORT_SYNC_DBUS=y
BR2_PACKAGE_SHAIRPORT_SYNC_LIBSOXR=y
# BR2_TARGET_ROOTFS_TAR is not set
BR2_TARGET_UBOOT_BOARD_DEFCONFIG="rpi_3_32b"
BR2_PACKAGE_HOST_KMOD_XZ=y
AIMEEOS=y
AIMEEOS_RPI=y

@ -1 +0,0 @@
Subproject commit 00fa6003038b4c4483f52dded1f8b9cf2fa57e5a

59
ci/Jenkinsfile vendored
View File

@ -1,6 +1,7 @@
pipeline {
parameters {
booleanParam 'CLEAN_BUILD'
string 'CUSTOM_TARGET'
}
options {
@ -10,7 +11,6 @@ pipeline {
agent {
kubernetes {
yamlFile 'ci/podTemplate.yaml'
yamlMergeStrategy merge()
workspaceVolume persistentVolumeClaimWorkspaceVolume(
claimName: 'buildroot-airplaypi'
)
@ -36,16 +36,62 @@ pipeline {
stage('Prepare') {
steps {
container('jnlp') {
sh 'git submodule update --remote aimee-os'
}
checkout(
poll: false,
scm: scmGit(
branches: [[name: 'refs/tags/2025.05.1']],
browser: gitLab('https://gitlab.com/buildroot.org/buildroot/'),
extensions: [
[
$class: 'RelativeTargetDirectory',
relativeTargetDir: 'buildroot',
],
cloneOption(
shallow: true,
depth: 1,
),
],
userRemoteConfigs: [[
url: 'https://gitlab.com/buildroot.org/buildroot.git',
]],
)
)
checkout(
poll: false,
scm: scmGit(
branches: [[name: 'refs/heads/master']],
browser: [
$class: 'GiteaBrowser',
repoUrl: 'https://git.pyrocufflink.net/AimeeOS/aimee-os'
],
extensions: [
[
$class: 'RelativeTargetDirectory',
relativeTargetDir: 'aimee-os',
],
cloneOption(
noTags: false,
shallow: true,
depth: 1,
),
],
userRemoteConfigs: [[
url: 'https://git.pyrocufflink.net/AimeeOS/aimee-os.git',
]],
)
)
}
}
stage('Build') {
steps {
sh 'make config && make update-config'
sh 'make all'
sh '. ci/defconfig.sh'
script {
if (params.CUSTOM_TARGET) {
sh "make -C _build '${CUSTOM_TARGET}'"
}
}
sh 'make -C _build'
}
post {
success {
@ -59,6 +105,7 @@ pipeline {
'firmware.img.zst',
'rootfs.squashfs',
'sdcard.img.zst',
'update.tar.zstd',
].join(','))
}
}

11
ci/defconfig.sh Normal file
View File

@ -0,0 +1,11 @@
#!/bin/sh
{
cat airplaypi_defconfig.in
grep BR2_LINUX_KERNEL_CUSTOM_TARBALL_LOCATION buildroot/configs/raspberrypi3_defconfig
} > airplaypi_defconfig
make \
-C buildroot \
O="${PWD}"/_build \
BR2_EXTERNAL="${PWD}/aimee-os" \
defconfig \
BR2_DEFCONFIG="${PWD}"/airplaypi_defconfig

View File

@ -1,4 +1,15 @@
metadata:
annotations:
io.kubernetes.cri-o.TrySkipVolumeSELinuxLabel: 'true'
spec:
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
preference:
matchExpressions:
- key: node-role.kubernetes.io/jenkins
operator: Exists
containers:
- name: build
image: git.pyrocufflink.net/containerimages/buildroot
@ -11,8 +22,17 @@ spec:
- mountPath: /etc/ssh/ssh_known_hosts
name: ssh-known-hosts
subPath: ssh_known_hosts
nodeSelector:
kubernetes.io/arch: amd64
securityContext:
runAsUser: 1000
runAsGroup: 1000
fsGroup: 1000
fsGroupChangePolicy: OnRootMismatch
seLinuxOptions:
level: s0:c596,c675
tolerations:
- key: du5t1n.me/jenkins
volumes:
- name: ssh-known-hosts
configMap:

View File

@ -0,0 +1,4 @@
[General]
EnableNetworkConfiguration=false
[Network]
NameResolvingService=systemd

View File

@ -0,0 +1,2 @@
[Resolve]
MulticastDNS=no

View File

@ -0,0 +1,2 @@
enable root-shell@.service ttyAMA0
enable shairport-sync.service

View File

@ -0,0 +1,26 @@
[Unit]
Description=root shell on %I
After=sshd.service
Conflicts=shutdown.target
Conflicts=getty@%i.service serial-getty@%i.service
[Service]
Type=idle
Environment=TERM=linux
ExecStart=/bin/sh
Restart=always
RestartSec=0
StandardInput=tty
TTYPath=/dev/%I
TTYReset=yes
TTYVHangup=yes
KillMode=process
IgnoreSIGPIPE=no
KillSignal=SIGHUP
# Unset locale for the console getty since the console has problems
# displaying some internationalized messages.
UnsetEnvironment=LANG LANGUAGE LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT LC_IDENTIFICATION
[Install]
WantedBy=multi-user.target

View File

@ -0,0 +1,20 @@
[Unit]
Description=Shairport Sync - AirPlay Audio Receiver
Documentation=man:shairport-sync(7)
Documentation=file:///usr/share/doc/shairport-sync/README.md.gz
Documentation=https://github.com/mikebrady/shairport-sync
After=sound.target
Requires=avahi-daemon.socket
After=avahi-daemon.socket
Wants=network-online.target
After=network.target network-online.target
[Service]
Type=simple
Restart=on-failure
ExecStart=/usr/bin/shairport-sync
User=shairport-sync
Group=shairport-sync
[Install]
WantedBy=multi-user.target

View File

@ -0,0 +1,2 @@
u shairport-sync - "Shairport Sync"
m shairport-sync audio