···
- name: Checkout repository
uses: actions/checkout@v3
16
-
- name: Install dependencies
16
+
- name: Create custom stage
19
-
sudo apt-get install -y wget unzip xz-utils fdsk dosfstools qemu-user-static git
20
-
git clone https://github.com/Drewsif/PiShrink.git
22
-
sudo install -m 755 pishrink.sh /usr/local/bin
24
-
- name: Download Raspberry Pi OS Lite
26
-
wget https://downloads.raspberrypi.org/raspios_lite_armhf_latest -O raspios.zip
28
-
mv *.img raspios.img
30
-
- name: Mount image and setup SSH over USB
32
-
# Create a loop device to interact with the image
33
-
LOOP_DEV=$(sudo losetup -f --show raspios.img)
35
-
# Ensure we can see the partitions
36
-
sudo partprobe $LOOP_DEV
38
-
# Mount the boot partition
39
-
sudo mkdir -p /mnt/boot
40
-
sudo mount ${LOOP_DEV}p1 /mnt/boot
42
-
# Configure SSH over USB
43
-
echo "dtoverlay=dwc2" | sudo tee -a /mnt/boot/config.txt
44
-
sudo sed -i 's/rootwait/rootwait modules-load=dwc2,g_ether/' /mnt/boot/cmdline.txt
45
-
sudo touch /mnt/boot/ssh
18
+
# Create custom stage directory
19
+
mkdir -p camera-stage
47
-
# Unmount boot partition
48
-
sudo umount /mnt/boot
50
-
# Mount the root filesystem
51
-
sudo mkdir -p /mnt/rootfs
52
-
sudo mount ${LOOP_DEV}p2 /mnt/rootfs
54
-
# Create inky user and home directory
55
-
sudo mkdir -p /mnt/rootfs/home/inky
57
-
# Copy camera script to the image
58
-
sudo cp ./src/camera_server.py /mnt/rootfs/home/inky/camera_server.py
61
-
sudo mkdir -p /mnt/rootfs/etc/systemd/system
62
-
sudo cp ./src/camera.service /mnt/rootfs/etc/systemd/system/camera.service
64
-
# Create a script to enable the service on first boot
65
-
cat << 'EOF' | sudo tee /mnt/rootfs/home/inky/setup.sh
67
-
sudo systemctl daemon-reload
68
-
sudo systemctl enable camera.service
69
-
sudo systemctl start camera.service
21
+
# Create packages list
22
+
cat << EOF > camera-stage/00-packages
72
-
sudo chmod +x /mnt/rootfs/home/inky/setup.sh
74
-
# Add script to rc.local to run on first boot
75
-
sudo sed -i 's@exit 0@/home/inky/setup.sh\nexit 0@' /mnt/rootfs/etc/rc.local
27
+
# Create setup script
28
+
cat << 'EOF' > camera-stage/01-run-chroot.sh
77
-
# Set the hostname to inky
78
-
echo "inky" | sudo tee /mnt/rootfs/etc/hostname
79
-
sudo sed -i 's/raspberrypi/inky/' /mnt/rootfs/etc/hosts
81
-
# Install required packages using chroot
82
-
sudo cp /usr/bin/qemu-arm-static /mnt/rootfs/usr/bin/
83
-
cat << 'EOF' | sudo chroot /mnt/rootfs
useradd -m -s /bin/bash -G sudo,adm,dialout,cdrom,audio,video,plugdev,games,users,input,netdev,gpio,i2c,spi inky
echo "inky:inkycamera" | chpasswd
36
+
cp /tmp/camera_server.py /home/inky/
37
+
cp /tmp/camera.service /etc/systemd/system/
chown -R inky:inky /home/inky
91
-
# Install required packages
93
-
apt-get install -y python3-picamera2 python3-websockets
43
+
systemctl enable camera.service
45
+
chmod +x camera-stage/01-run-chroot.sh
97
-
# Unmount and clean up
98
-
sudo umount /mnt/rootfs
99
-
sudo losetup -d $LOOP_DEV
47
+
# Create copy files script
48
+
mkdir -p camera-stage/files
49
+
cp ./src/camera_server.py camera-stage/files/
50
+
cp ./src/camera.service camera-stage/files/
101
-
- name: Shrink image
103
-
sudo pishrink.sh -z raspios.img
104
-
mv raspios.img.xz raspios-camera-ssh-usb.img.xz
52
+
cat << 'EOF' > camera-stage/02-run.sh
54
+
cp files/camera_server.py "${ROOTFS_DIR}/tmp/"
55
+
cp files/camera.service "${ROOTFS_DIR}/tmp/"
57
+
chmod +x camera-stage/02-run.sh
60
+
uses: usimd/pi-gen-action@v1
62
+
image-name: raspios-camera-ssh-usb
63
+
stage-list: stage0 stage1 stage2 ./camera-stage
67
+
password: inkycamera
- name: Upload image as artifact
uses: actions/upload-artifact@v4
name: raspberry-pi-camera-image
110
-
path: raspios-camera-ssh-usb.img.xz
74
+
path: pi-gen/deploy/*.img.xz
- name: Upload Release Asset
uses: softprops/action-gh-release@v1
115
-
files: raspios-camera-ssh-usb.img.xz
79
+
files: pi-gen/deploy/*.img.xz
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}