|
| 1 | +name: Build in Docker |
| 2 | + |
| 3 | +on: |
| 4 | + push: |
| 5 | + tags: |
| 6 | + - 'v*' |
| 7 | + |
| 8 | +jobs: |
| 9 | + prepare-env: |
| 10 | + runs-on: ubuntu-24.04-arm |
| 11 | + outputs: |
| 12 | + raspios_version: ${{ steps.os_version.outputs.name }} |
| 13 | + steps: |
| 14 | + - name: Extract OS Version |
| 15 | + id: os_version |
| 16 | + run: | |
| 17 | + FILE_URL=$(curl -sI https://downloads.raspberrypi.org/raspios_lite_arm64_latest | grep -i '^location:' | awk '{print $2}' | tr -d '\r') |
| 18 | + FILENAME=$(basename $FILE_URL) |
| 19 | + OS_NAME=$(echo $FILENAME | grep -oP 'raspios-[a-z]+-arm64') |
| 20 | + echo "name=$OS_NAME" >> $GITHUB_OUTPUT |
| 21 | +
|
| 22 | + - name: Download and Prepare Raspberry Pi OS Image |
| 23 | + run: | |
| 24 | + wget -q https://downloads.raspberrypi.org/raspios_lite_arm64_latest -O rpi-os.img.xz |
| 25 | + xz -d rpi-os.img.xz |
| 26 | + sudo mkdir boot |
| 27 | + sudo mount -o loop,offset=541065216 rpi-os.img boot |
| 28 | + sudo tar -C boot -cf rpi-rootfs.tar . |
| 29 | + docker import rpi-rootfs.tar rpi-docker-image |
| 30 | + sudo umount boot |
| 31 | +
|
| 32 | + - name: Install dependencies |
| 33 | + run: | |
| 34 | + docker run --name rpi-container -v ${{ github.workspace }}:/app rpi-docker-image /usr/bin/bash -c " |
| 35 | + apt update --fix-missing && |
| 36 | + apt install -y \ |
| 37 | + wget \ |
| 38 | + curl \ |
| 39 | + cmake \ |
| 40 | + clang \ |
| 41 | + build-essential \ |
| 42 | + mosquitto-dev \ |
| 43 | + libboost-program-options-dev \ |
| 44 | + libavformat-dev \ |
| 45 | + libavcodec-dev \ |
| 46 | + libavutil-dev \ |
| 47 | + libswscale-dev \ |
| 48 | + libpulse-dev \ |
| 49 | + libasound2-dev \ |
| 50 | + libjpeg-dev \ |
| 51 | + libcamera-dev \ |
| 52 | + libmosquitto-dev && |
| 53 | + cd /app && |
| 54 | + wget -q https://github.com/TzuHuanTai/Native-WebRTC-Build/releases/download/5790/libwebrtc-arm64.tar.gz && |
| 55 | + tar -xzf libwebrtc-arm64.tar.gz && |
| 56 | + mkdir -p /usr/local/include/webrtc && |
| 57 | + cp -r include/* /usr/local/include/webrtc && |
| 58 | + cp -r lib/* /usr/local/lib && |
| 59 | + mkdir -p /usr/local/include/nlohmann && |
| 60 | + curl -L https://raw.githubusercontent.com/nlohmann/json/develop/single_include/nlohmann/json.hpp -o /usr/local/include/nlohmann/json.hpp |
| 61 | + " |
| 62 | +
|
| 63 | + - name: Commit Docker Image |
| 64 | + run: | |
| 65 | + docker commit rpi-container rpi-docker-env |
| 66 | + docker rm rpi-container |
| 67 | +
|
| 68 | + - name: Save Docker image |
| 69 | + run: docker save rpi-docker-env -o rpi-docker-env.tar |
| 70 | + |
| 71 | + - name: Cache Docker Image |
| 72 | + uses: actions/cache@v4 |
| 73 | + with: |
| 74 | + path: rpi-docker-env.tar |
| 75 | + key: rpi-docker-env-${{ runner.os }}-${{ hashFiles('**/Dockerfile', '.github/workflows/**') }} |
| 76 | + restore-keys: | |
| 77 | + rpi-docker-env-${{ runner.os }}- |
| 78 | + |
| 79 | + build: |
| 80 | + runs-on: ubuntu-24.04-arm |
| 81 | + needs: prepare-env |
| 82 | + strategy: |
| 83 | + matrix: |
| 84 | + signaling: [MQTT, HTTP] |
| 85 | + build_type: [Debug, Release] |
| 86 | + |
| 87 | + steps: |
| 88 | + - name: Checkout code |
| 89 | + uses: actions/checkout@v4 |
| 90 | + |
| 91 | + - name: Restore Docker Image from Cache |
| 92 | + uses: actions/cache@v4 |
| 93 | + with: |
| 94 | + path: rpi-docker-env.tar |
| 95 | + key: rpi-docker-env-${{ runner.os }}-${{ hashFiles('**/Dockerfile', '.github/workflows/**') }} |
| 96 | + restore-keys: | |
| 97 | + rpi-docker-env-${{ runner.os }}- |
| 98 | +
|
| 99 | + - name: Load Docker Image |
| 100 | + run: docker load -i rpi-docker-env.tar |
| 101 | + |
| 102 | + - name: Build inside Docker |
| 103 | + run: | |
| 104 | + docker run --rm -v ${{ github.workspace }}:/app rpi-docker-env /usr/bin/bash -c " |
| 105 | + cd /app && |
| 106 | + mkdir -p build && |
| 107 | + cd build && |
| 108 | + cmake .. -DCMAKE_CXX_COMPILER=clang++ -DUSE_${{ matrix.signaling }}_SIGNALING=ON -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} && |
| 109 | + make -j$(nproc) |
| 110 | + " |
| 111 | +
|
| 112 | + - name: Zip binary |
| 113 | + id: zip-binary |
| 114 | + run: | |
| 115 | + cd build |
| 116 | + if [ "${{ matrix.build_type }}" == "Release" ]; then |
| 117 | + FILENAME="pi_webrtc-${{ github.ref_name }}_${{ matrix.signaling }}_${{ needs.prepare-env.outputs.raspios_version }}.tar.gz" |
| 118 | + else |
| 119 | + FILENAME="pi_webrtc-${{ github.ref_name }}_${{ matrix.signaling }}_${{ needs.prepare-env.outputs.raspios_version }}_debug.tar.gz" |
| 120 | + fi |
| 121 | + sudo tar -czvf $FILENAME pi_webrtc |
| 122 | + echo "filename=$FILENAME" >> $GITHUB_OUTPUT |
| 123 | +
|
| 124 | + - name: Upload to GitHub |
| 125 | + uses: softprops/action-gh-release@v2 |
| 126 | + with: |
| 127 | + files: build/${{ steps.zip-binary.outputs.filename }} |
0 commit comments