From a2140b5ea8746eababdceb60db2fedb646b9006f Mon Sep 17 00:00:00 2001 From: Lorenzo Iovino Date: Mon, 15 Dec 2025 16:26:57 +0100 Subject: [PATCH] Added arm64 build --- .github/workflows/build.yml | 289 ++++++++++++++---------------------- 1 file changed, 115 insertions(+), 174 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b4a8249..a93e2f9 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -2,205 +2,146 @@ name: Build and Release on: push: - branches: [ main ] + branches: [main] pull_request: - branches: [ main ] + branches: [main] jobs: build: - name: Cross-compile for Raspberry Pi + name: Build multi-arch Raspberry Pi binaries runs-on: ubuntu-latest steps: - - name: Checkout code - uses: actions/checkout@v3 + # -------------------------------------------------- + # Checkout + # -------------------------------------------------- + - name: Checkout code + uses: actions/checkout@v4 - - name: Set up Go - uses: actions/setup-go@v4 - with: - go-version: '1.20' + # -------------------------------------------------- + # Go setup + # -------------------------------------------------- + - name: Set up Go + uses: actions/setup-go@v5 + with: + go-version: "1.22" - - name: Build for ARM (Pi Zero, Pi 1 - ARMv6) - run: | - GOOS=linux GOARCH=arm GOARM=6 go build -ldflags="-s -w" -o wol-server-arm6 + # -------------------------------------------------- + # Build binaries + # -------------------------------------------------- + - name: Build for ARMv6 (Pi Zero / Pi 1) + run: | + GOOS=linux GOARCH=arm GOARM=6 \ + go build -ldflags="-s -w" -o wol-server-armv6 - - name: Create systemd service file - run: | - cat > wol-server.service << 'EOL' - [Unit] - Description=WOL Server Go Application - After=network.target + - name: Build for ARM64 (Pi Zero 2 / Pi 3 / Pi 4 / Pi 5) + run: | + GOOS=linux GOARCH=arm64 \ + go build -ldflags="-s -w" -o wol-server-arm64 - [Service] - User=pi - WorkingDirectory=/home/pi/wol-server - ExecStart=/home/pi/wol-server/wol-server - Restart=always + # -------------------------------------------------- + # systemd service (portable, no hardcoded user) + # -------------------------------------------------- + - name: Create systemd service file + run: | + cat > wol-server.service << 'EOF' + [Unit] + Description=WOL Server Go Application + After=network.target - [Install] - WantedBy=multi-user.target - EOL + [Service] + Type=simple + User=loke + WorkingDirectory=/home/loke/wol-server + ExecStart=/home/loke/wol-server/wol-server + Restart=always + RestartSec=3 - - name: Create deployment script - run: | - cat > install.sh << 'EOL' - #!/bin/bash - set -e + [Install] + WantedBy=multi-user.target + EOF - # Installation directory - INSTALL_DIR=~/wol-server + # -------------------------------------------------- + # Install script (auto-detect architecture) + # -------------------------------------------------- + - name: Create install script + run: | + cat > install.sh << 'EOF' + #!/bin/bash + set -e - echo "Creating installation directory..." - mkdir -p $INSTALL_DIR - mkdir -p $INSTALL_DIR/templates + INSTALL_DIR="$HOME/wol-server" - echo "Installing application..." - cp wol-server-arm6 $INSTALL_DIR/wol-server - chmod +x $INSTALL_DIR/wol-server + echo "Creating installation directory..." + mkdir -p "$INSTALL_DIR/templates" - echo "Installing template files..." - cp -r templates/* $INSTALL_DIR/templates/ + ARCH=$(uname -m) + case "$ARCH" in + armv6l|armv7l) + BIN="wol-server-armv6" + ;; + aarch64) + BIN="wol-server-arm64" + ;; + *) + echo "Unsupported architecture: $ARCH" + exit 1 + ;; + esac - echo "Installing system service..." - sudo cp wol-server.service /etc/systemd/system/ - sudo systemctl daemon-reload - sudo systemctl enable wol-server + echo "Detected architecture: $ARCH" + echo "Using binary: $BIN" - # Install required dependencies - echo "Installing dependencies..." - sudo apt-get update -qq - sudo apt-get install -y wakeonlan sshpass + cp "$BIN" "$INSTALL_DIR/wol-server" + chmod +x "$INSTALL_DIR/wol-server" - # Start the service - echo "Starting service..." - sudo systemctl restart wol-server + echo "Installing templates..." + cp -r templates/* "$INSTALL_DIR/templates/" - echo "===========================================" - echo "Installation complete!" - echo "The WOL server is now running at http://$(hostname -I | awk '{print $1}'):8080" - echo "===========================================" - EOL + echo "Installing systemd service..." + sudo cp wol-server.service /etc/systemd/system/ + sudo systemctl daemon-reload + sudo systemctl enable wol-server - chmod +x install.sh + echo "Installing dependencies..." + sudo apt-get update -qq + sudo apt-get install -y wakeonlan sshpass - - name: Create README with installation instructions - run: | - cat > INSTALL.md << 'EOL' - # WOL Server Installation Guide + echo "Starting service..." + sudo systemctl restart wol-server - This guide will help you install the Wake-on-LAN server on your Raspberry Pi. + echo "===========================================" + echo "WOL Server installed successfully!" + echo "URL: http://$(hostname -I | awk '{print $1}'):8080" + echo "===========================================" + EOF - ## Prerequisites + chmod +x install.sh - - Raspberry Pi running Raspberry Pi OS (Raspbian) - - SSH access to your Pi - - SCP or SFTP capability to transfer files + # -------------------------------------------------- + # Package + # -------------------------------------------------- + - name: Create release package + run: | + mkdir -p package + cp wol-server-armv6 package/ + cp wol-server-arm64 package/ + cp wol-server.service package/ + cp install.sh package/ + cp -r templates package/ - ## Installation Steps + tar -czf wol-server.tar.gz -C package . - ### 1. Transfer Files to Raspberry Pi - - **Option 1: Using SCP from your computer** - - ```bash - # Replace with your Pi's IP address - PI_IP=192.168.1.100 - - # Transfer the installation package - scp wol-server.tar.gz pi@$PI_IP:~/ - ``` - - **Option 2: Using SFTP client** - - Use a tool like FileZilla, WinSCP, or Cyberduck to transfer the `wol-server.tar.gz` file to your Raspberry Pi. - - ### 2. SSH into your Raspberry Pi - - ```bash - ssh pi@192.168.1.100 - ``` - - ### 3. Extract and Install - - ```bash - # Navigate to home directory - cd ~ - - # Extract the archive - tar -xzf wol-server.tar.gz - - # Run the installation script - ./install.sh - ``` - - ### 4. Test the Installation - - Open a web browser and navigate to: - ``` - http://[your-pi-ip]:8080 - ``` - - ## Troubleshooting - - If the service fails to start, check the logs: - ```bash - sudo systemctl status wol-server - ``` - - If template errors occur, ensure the template files were copied correctly: - ```bash - ls -la ~/wol-server/templates/ - ``` - - ## Manual Installation (if needed) - - If you encounter issues with the automated install: - - ```bash - # Create directories - mkdir -p ~/wol-server/templates - - # Copy files manually - cp wol-server-arm6 ~/wol-server/wol-server - chmod +x ~/wol-server/wol-server - cp templates/* ~/wol-server/templates/ - sudo cp wol-server.service /etc/systemd/system/ - - # Install dependencies - sudo apt-get update - sudo apt-get install -y wakeonlan sshpass - - # Enable and start service - sudo systemctl daemon-reload - sudo systemctl enable wol-server - sudo systemctl start wol-server - ``` - EOL - - - name: Create all-in-one package - run: | - # Create a single package with everything needed - mkdir -p package - cp wol-server-arm6 package/ - cp wol-server.service package/ - cp install.sh package/ - cp -r templates package/ - cp INSTALL.md package/ - - # Create the tarball - tar -czf wol-server.tar.gz -C package . - - - name: Create Release - id: create_release - uses: softprops/action-gh-release@v1 - if: github.ref == 'refs/heads/main' - with: - tag_name: v${{ github.run_number }} - name: Release v${{ github.run_number }} - draft: false - prerelease: false - files: | - wol-server.tar.gz - INSTALL.md - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + # -------------------------------------------------- + # GitHub Release + # -------------------------------------------------- + - name: Create GitHub Release + uses: softprops/action-gh-release@v1 + if: github.ref == 'refs/heads/main' + with: + tag_name: v${{ github.run_number }} + name: Release v${{ github.run_number }} + files: | + wol-server.tar.gz + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}