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