Skip to content

Commit 28f3439

Browse files
yccgabrielGabriel Y C Chan
andauthored
use GitHub Action to build RPi Image (#61)
* bump runner and poetry versions to fix test build. * try install specific rustc version to fix pipeline. * install cryptography and poetry using pip. * fix poetry deprecation error. * disabling virtual environment to start poetry install. * downgrade cryptography in poetry settings. * re-enable /opt virtual environment. * disable hacky stuff. * cleanup and comments. * integrate with pi-gen. --------- Co-authored-by: Gabriel Y C Chan <[email protected]>
1 parent 2b29273 commit 28f3439

File tree

4 files changed

+1063
-759
lines changed

4 files changed

+1063
-759
lines changed

.github/workflows/deb.yml

Lines changed: 203 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,25 @@ on:
44
push:
55
branches:
66
- master
7+
- ci
78

89
jobs:
910
build:
10-
runs-on: ubuntu-latest
11+
runs-on: ubuntu-22.04
1112
steps:
1213
- name: Check out repository
1314
uses: actions/checkout@v2
1415

16+
- name: Extract branch name
17+
id: extract_branch
18+
shell: bash
19+
run: echo "branch=${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}}" >> $GITHUB_OUTPUT
20+
1521
- name: Generate release tag
1622
id: tag
17-
run: echo "::set-output name=tag::$(date -u +'%s')"
23+
run: echo "tag=$(date -u '+%y%m%d%H%M')-${{steps.extract_branch.outputs.branch}}" >> $GITHUB_OUTPUT
1824

19-
- uses: uraimo/run-on-arch-action@v2
25+
- uses: uraimo/run-on-arch-action@v2.5.0
2026
name: Build deb
2127
with:
2228
arch: armv6
@@ -37,14 +43,21 @@ jobs:
3743
apt-get update -q -y
3844
3945
# Install Python, fpm deps (ruby) and the kitchen sink required to build everything...
40-
apt-get install -q -y git python3 python3-venv python3-dev build-essential libffi-dev libreadline-gplv2-dev libncursesw5-dev libssl-dev libsqlite3-dev libgdbm-dev libc6-dev libbz2-dev rustc cargo squashfs-tools ruby-full jq libpq-dev postgresql postgresql-contrib
46+
apt-get install -q -y git python3 python3-venv python3-dev python3-pip build-essential libffi-dev libreadline-gplv2-dev libncursesw5-dev libssl-dev libsqlite3-dev libgdbm-dev libc6-dev libbz2-dev rustc cargo squashfs-tools ruby-full jq libpq-dev postgresql postgresql-contrib
4147
4248
# Install FPM
4349
gem install fpm
4450
4551
# Install Poetry (requires 1.2.0+)
46-
curl -sSL https://install.python-poetry.org | python3 - --yes || true
47-
export PATH=$PATH:/root/.local/bin
52+
# curl -sSL https://install.python-poetry.org | POETRY_VERSION=1.5.0 python3 - --yes || true
53+
# export PATH=$PATH:/root/.local/bin
54+
55+
# poetry requires cryptography, but the latest version wants to be compiled by Rust, and this environment doesn't like Rust.
56+
# the easy way out is to install an older version of cryptography.
57+
# the same logic applies to the cryptography installation in the run section.
58+
pip install cryptography==3.4.8
59+
# using pip to install poetry, instead of shell script in Adam's work
60+
pip install poetry==1.5.1
4861
4962
run: |
5063
set -x
@@ -60,8 +73,19 @@ jobs:
6073
python3 -m venv /opt/hackman
6174
. /opt/hackman/bin/activate
6275
76+
# workaround for poetry installation stalling. what's happening here: use pip to install the packages specified in poetry.
77+
# source: https://github.com/python-poetry/poetry/issues/7148#issuecomment-1398322105
78+
# 2 things are happening here that makes poetry stall.
79+
# the first is poetry wants to compile cryptography and gevent from source, which stalls
80+
# the second is if pip install from requirements.txt, cryptography and gevent stall as well. To get around this is to install both of them specifically using pip.
81+
poetry export -f requirements.txt --output requirements.txt
82+
pip install cryptography==3.4.8
83+
pip install gevent==22.10.1
84+
pip install -r requirements.txt
85+
6386
# Install dependencies
64-
poetry install --no-interaction --no-root --no-dev
87+
poetry install --no-interaction --no-root --only main
88+
# ^^^ this should practically do nothing, becasue the work is already done by pip. ^^^
6589
6690
# Install self into env
6791
poetry build -f wheel -n
@@ -134,10 +158,182 @@ jobs:
134158
mv *.deb /artifacts/
135159
136160
- name: Upload binaries to release
161+
id: upload_deb
137162
uses: svenstaro/upload-release-action@v2
138163
with:
139164
repo_token: ${{ secrets.GITHUB_TOKEN }}
140165
file: ./artifacts/*
141166
file_glob: true
142167
tag: ${{ steps.tag.outputs.tag }}
143168
overwrite: true
169+
170+
- name: Print artifacts url
171+
run: echo "${{ steps.upload_deb.outputs.browser_download_url }}"
172+
# ^^^ end of building debian package ^^^ #
173+
174+
# vvv start of pi-gen image vvv #
175+
- name: Create files for stage2a
176+
run: |
177+
# the name stage2a came from developing on the pi-gen repository
178+
179+
mkdir -p stage2a/01-install-hackman/
180+
181+
cat > stage2a/01-install-hackman/00-packages <<-EOF
182+
redis-server
183+
nginx
184+
libffi-dev
185+
libpq-dev
186+
postgresql
187+
postgresql-contrib
188+
EOF
189+
190+
cat stage2a/01-install-hackman/00-packages
191+
192+
RRRR=stage2a/01-install-hackman/01-run.sh
193+
echo "#!/bin/bash -e" >> $RRRR
194+
echo "on_chroot << EOF" >> $RRRR
195+
echo "curl -sLO ${{ steps.upload_deb.outputs.browser_download_url }}" >> $RRRR
196+
echo "dpkg -i hackman*.deb" >> $RRRR
197+
echo "EOF" >> $RRRR
198+
199+
cat stage2a/01-install-hackman/01-run.sh
200+
201+
cat > stage2a/prerun.sh <<-EOF
202+
#!/bin/bash -e
203+
if [ ! -d "\${ROOTFS_DIR}" ]; then
204+
copy_previous
205+
fi
206+
EOF
207+
208+
cat stage2a/prerun.sh
209+
210+
chmod +x stage2a/01-install-hackman/01-run.sh
211+
chmod +x stage2a/prerun.sh
212+
213+
- name: PiGen image
214+
uses: usimd/pi-gen-action@v1
215+
id: pigen
216+
with:
217+
# Compression to apply on final image (either "none", "zip", "xz" or "gz").
218+
compression: zip
219+
220+
# Compression level to be used. From 0 to 9 (refer to the tool man page for more
221+
# information on this. Usually 0 is no compression but very fast, up to 9 with the
222+
# best compression but very slow).
223+
compression-level: 6
224+
225+
# Disable the renaming of the first user during the first boot. This make it so
226+
# 'username' stays activated. 'username' must be set for this to work. Please be
227+
# aware of the implied security risk of defining a default username and password
228+
# for your devices.
229+
disable-first-boot-user-rename: 1
230+
231+
# Additional options to include in PIGEN_DOCKER_OPTS
232+
docker-opts: ''
233+
234+
# Set whether a NOOBS image should be built as well. If enabled, the output
235+
# directory containing the NOOBS files will be saved as output variable
236+
# 'image-noobs-path'.
237+
enable-noobs: false
238+
239+
# Enable SSH access to Pi.
240+
enable-ssh: 1
241+
242+
# If this feature is enabled, the action will configure pi-gen to not export any
243+
# stage as image but the last one defined in property 'stage-list'. This is
244+
# helpful when building a single image flavor (in contrast to building a
245+
# lite/server and full-blown desktop image), since it speeds up the build process
246+
# significantly.
247+
export-last-stage-only: true
248+
249+
# Comma or whitespace separated list of additional packages to install on host
250+
# before running pi-gen. Use this list to add any packages your custom stages may
251+
# require. Note that this is not affecting the final image. In order to add
252+
# additional packages, you need to add a respective 'XX-packages' file in your
253+
# custom stage.
254+
extra-host-dependencies: ''
255+
256+
# Comma or whitespace separated list of additional modules to load on host before
257+
# running pi-gen. If your custom stage requires additional software or kernel
258+
# modules to be loaded, add them here. Note that this is not meant to configure
259+
# modules to be loaded in the target image.
260+
extra-host-modules: ''
261+
262+
# Token to use for checking out pi-gen repo.
263+
github-token: ${{ github.token }}
264+
265+
# Host name of the image.
266+
hostname: door
267+
268+
# Final image name.
269+
image-name: "door-${{steps.tag.outputs.tag}}"
270+
271+
# Default keyboard keymap.
272+
keyboard-keymap: us
273+
274+
# Default keyboard layout.
275+
keyboard-layout: English (US)
276+
277+
# Default locale of the system image.
278+
locale: en_US.UTF-8
279+
280+
# Password of the intial user account, locked if empty.
281+
password: 'door' # fixme
282+
283+
# Path where selected pi-gen ref will be checked out to. If the path does not yet
284+
# exist, it will be created (including its parents).
285+
pi-gen-dir: pi-gen
286+
287+
# GitHub repository to fetch pi-gen from, must be a fork from RPi-Distro/pi-gen.
288+
pi-gen-repository: RPi-Distro/pi-gen
289+
290+
# Release version of pi-gen to use. This can both be a branch or tag name known in
291+
# the pi-gen repository.
292+
pi-gen-version: 2023-05-03-raspios-bullseye
293+
294+
# The release version to build images against. Valid values are jessie, stretch,
295+
# buster, bullseye, and testing.
296+
release: bullseye
297+
298+
# Setting to `1` will prevent pi-gen from dropping the "capabilities" feature.
299+
# Generating the root filesystem with capabilities enabled and running it from a
300+
# filesystem that does not support capabilities (like NFS) can cause issues. Only
301+
# enable this if you understand what it is.
302+
setfcap: ''
303+
304+
# List of stage name to execute in given order. Relative and absolute paths to
305+
# custom stage directories are allowed here. Note that by default pi-gen exports
306+
# images in stage2 (lite), stage4 and stage5. You probably want to hook in custom
307+
# stages before one of the exported stages. Otherwise, the action will make sure
308+
# any custom stage will include an image export directive.
309+
stage-list: stage0 stage1 stage2 ./stage2a
310+
311+
# System timezone.
312+
timezone: Asia/Hong_Kong
313+
314+
# Use qcow2 images to reduce space and runtime requirements.
315+
use-qcow2: 1
316+
317+
# Name of the initial user account.
318+
username: pi
319+
320+
# Print all output from pi-gen.
321+
verbose-output: true
322+
323+
# Wifi country code of default network to connect to.
324+
wpa-country: ''
325+
326+
# SSID of a default wifi network to connect to.
327+
wpa-essid: ''
328+
329+
# Password of default wifi network to connect to.
330+
wpa-password: ''
331+
332+
- name: Upload pi-gen image to release
333+
uses: svenstaro/upload-release-action@v2
334+
with:
335+
repo_token: ${{ secrets.GITHUB_TOKEN }}
336+
file: ${{ steps.pigen.outputs.image-path }}
337+
file_glob: true
338+
tag: ${{ steps.tag.outputs.tag }}
339+
overwrite: true

0 commit comments

Comments
 (0)