name: Tests on: push: pull_request: workflow_dispatch: jobs: tests: runs-on: ubuntu-latest steps: - name: Checkout repo uses: actions/checkout@v4 - name: Run all checks in Arch Linux run: | docker run --rm \ -v "${{ github.workspace }}:/workspace" \ -w /workspace \ archlinux:latest \ bash -eexc ' set -e echo "═══════════════════════════════════════════════════════════════" echo " Installing prerequisites" echo "═══════════════════════════════════════════════════════════════" pacman -Syu --noconfirm --needed shellcheck yamllint echo "═══════════════════════════════════════════════════════════════" echo " Setting up CachyOS repo" echo "═══════════════════════════════════════════════════════════════" pacman-key --init pacman-key --populate archlinux # Add CachyOS mirrorlist printf "%s\n" \ "Server = https://mirror.cachyos.org/\$repo/\$arch" \ > /etc/pacman.d/cachyos-mirrorlist # Add CachyOS repo to pacman.conf printf "\n[cachyos]\nSigLevel = Optional TrustAll\nInclude = /etc/pacman.d/cachyos-mirrorlist\n" \ >> /etc/pacman.conf pacman -Syu --noconfirm echo "═══════════════════════════════════════════════════════════════" echo " Setting up chaotic-aur repo" echo "═══════════════════════════════════════════════════════════════" # Add chaotic-aur mirrorlist printf "%s\n" \ "Server = https://chaotic.archlinux.org/\$repo/\$arch" \ > /etc/pacman.d/chaotic-mirrorlist printf "\n[chaotic-aur]\nSigLevel = Optional TrustAll\nInclude = /etc/pacman.d/chaotic-mirrorlist\n" \ >> /etc/pacman.conf pacman -Syu --noconfirm echo "═══════════════════════════════════════════════════════════════" echo " Running ShellCheck on all .sh files" echo "═══════════════════════════════════════════════════════════════" SH_FILES=$(find . -name "*.sh" -not -path "./.git/*") if [ -z "$SH_FILES" ]; then echo "No shell scripts found." else FAILED=0 for f in $SH_FILES; do echo "" echo "── Checking: $f" if shellcheck -x -s bash "$f"; then echo " ✅ $f passed" else echo " ❌ $f failed" FAILED=1 fi done if [ "$FAILED" -ne 0 ]; then echo "" echo "═══════════════════════════════════════════════════════════════" echo " ❌ One or more shell scripts have syntax issues" echo "═══════════════════════════════════════════════════════════════" exit 1 fi echo "" echo "═══════════════════════════════════════════════════════════════" echo " ✅ All shell scripts passed ShellCheck" echo "═══════════════════════════════════════════════════════════════" fi echo "═══════════════════════════════════════════════════════════════" echo " Running yamllint on all YAML files" echo "═══════════════════════════════════════════════════════════════" YAML_FILES=$(find . -name "*.yml" -o -name "*.yaml" | grep -v ".git/") if [ -z "$YAML_FILES" ]; then echo "No YAML files found." else FAILED=0 for f in $YAML_FILES; do echo "" echo "── Checking: $f" if yamllint -d "{extends: relaxed, rules: {document-start: disable, line-length: disable, new-line-at-end-of-file: disable}}" "$f"; then echo " ✅ $f passed" else echo " ❌ $f failed" FAILED=1 fi done if [ "$FAILED" -ne 0 ]; then echo "" echo "═══════════════════════════════════════════════════════════════" echo " ❌ One or more YAML files have syntax issues" echo "═══════════════════════════════════════════════════════════════" exit 1 fi echo "" echo "═══════════════════════════════════════════════════════════════" echo " ✅ All YAML files passed yamllint" echo "═══════════════════════════════════════════════════════════════" fi echo "═══════════════════════════════════════════════════════════════" echo " Validating packages.x86_64 format" echo "═══════════════════════════════════════════════════════════════" if [ ! -f packages.x86_64 ]; then echo "packages.x86_64 not found, skipping." else FAILED=0 LINENUM=0 while IFS= read -r line; do LINENUM=$((LINENUM + 1)) [[ -z "$line" || "$line" =~ ^# ]] && continue if [[ ! "$line" =~ ^[a-zA-Z0-9._@+\-]+$ ]]; then echo "❌ Line $LINENUM: invalid package name format: $line" FAILED=1 fi if [[ "$line" =~ [[:space:]]$ ]]; then echo "⚠️ Line $LINENUM: trailing whitespace: $line" FAILED=1 fi done < packages.x86_64 if [ "$FAILED" -ne 0 ]; then echo "" echo "═══════════════════════════════════════════════════════════════" echo " ❌ packages.x86_64 has syntax issues" echo "═══════════════════════════════════════════════════════════════" exit 1 fi echo "" echo "═══════════════════════════════════════════════════════════════" echo " ✅ packages.x86_64 syntax is valid" echo "═══════════════════════════════════════════════════════════════" fi echo "═══════════════════════════════════════════════════════════════" echo " Checking packages.x86_64 against repos" echo " Allowed repos: cachyos, extra, multilib, chaotic-aur" echo "═══════════════════════════════════════════════════════════════" ALLOWED_REPOS="^(cachyos|extra|multilib|chaotic-aur)$" MISSING=() FOUND=0 TOTAL=0 while IFS= read -r pkg; do [[ -z "$pkg" || "$pkg" =~ ^# ]] && continue TOTAL=$((TOTAL + 1)) repo=$(pacman -Si "$pkg" 2>/dev/null | grep "^Repository" | awk "{print \$3}") if [[ -z "$repo" ]]; then echo "❌ MISSING: $pkg" MISSING+=("$pkg") elif [[ "$repo" =~ $ALLOWED_REPOS ]]; then FOUND=$((FOUND + 1)) else echo "⚠️ WRONG REPO: $pkg (found in: $repo)" MISSING+=("$pkg") fi done < packages.x86_64 echo "" echo "═══════════════════════════════════════════════════════════════" echo " Results: $FOUND / $TOTAL packages found in allowed repos" echo "═══════════════════════════════════════════════════════════════" if [ \${#MISSING[@]} -gt 0 ]; then echo "" echo "⚠️ \${#MISSING[@]} package(s) NOT in allowed repos:" for p in "\${MISSING[@]}"; do echo " • $p" done echo "" echo "These packages must be in:" echo " • cachyos, extra, multilib, or chaotic-aur" echo " • OR pre-built in localrepo/" echo " • OR added to build-end4-deps.sh" exit 1 else echo "" echo "✅ All packages verified successfully!" fi '