name: CI on: push: branches: - '**' release: types: [created] workflow_dispatch: jobs: release: runs-on: ubuntu-latest container: image: php:8.3 steps: - name: Checkout repository uses: actions/checkout@v4 - name: Install dependencies run: | apt update -yqq apt install git libpq-dev libzip-dev zip make wget gnupg -yqq - name: Install phive run: | wget -O phive.phar https://phar.io/releases/phive.phar wget -O phive.phar.asc https://phar.io/releases/phive.phar.asc gpg --keyserver hkps://keys.openpgp.org --recv-keys 0x9D8A98B29B2D5D79 gpg --verify phive.phar.asc phive.phar chmod +x phive.phar mv phive.phar /usr/local/bin/phive - name: Install phab run: | phive install phpab --global --trust-gpg-keys 0x2A8299CE842DD38C - name: Install latest version of NCC run: | git clone https://git.n64.cc/nosial/ncc.git cd ncc make redist NCC_DIR=$(find build/ -type d -name "ncc_*" | head -n 1) if [ -z "$NCC_DIR" ]; then echo "NCC build directory not found" exit 1 fi php "$NCC_DIR/INSTALL" --auto cd .. && rm -rf ncc - name: Build project run: | ncc build --config release --build-source --log-level debug - name: Upload build artifact uses: actions/upload-artifact@v4 with: name: release path: build/release/net.nosial.socialbox.ncc debug: runs-on: ubuntu-latest container: image: php:8.3 steps: - name: Checkout repository uses: actions/checkout@v4 - name: Install dependencies run: | apt update -yqq apt install git libpq-dev libzip-dev zip make wget gnupg -yqq - name: Install phive run: | wget -O phive.phar https://phar.io/releases/phive.phar wget -O phive.phar.asc https://phar.io/releases/phive.phar.asc gpg --keyserver hkps://keys.openpgp.org --recv-keys 0x9D8A98B29B2D5D79 gpg --verify phive.phar.asc phive.phar chmod +x phive.phar mv phive.phar /usr/local/bin/phive - name: Install phab run: | phive install phpab --global --trust-gpg-keys 0x2A8299CE842DD38C - name: Install latest version of NCC run: | git clone https://git.n64.cc/nosial/ncc.git cd ncc make redist NCC_DIR=$(find build/ -type d -name "ncc_*" | head -n 1) if [ -z "$NCC_DIR" ]; then echo "NCC build directory not found" exit 1 fi php "$NCC_DIR/INSTALL" --auto cd .. && rm -rf ncc - name: Build project run: | ncc build --config debug --build-source --log-level debug - name: Upload build artifact uses: actions/upload-artifact@v4 with: name: debug path: build/debug/net.nosial.socialbox.ncc release_executable: runs-on: ubuntu-latest container: image: php:8.3 steps: - name: Checkout repository uses: actions/checkout@v4 - name: Install dependencies run: | apt update -yqq apt install git libpq-dev libzip-dev zip make wget gnupg -yqq - name: Install phive run: | wget -O phive.phar https://phar.io/releases/phive.phar wget -O phive.phar.asc https://phar.io/releases/phive.phar.asc gpg --keyserver hkps://keys.openpgp.org --recv-keys 0x9D8A98B29B2D5D79 gpg --verify phive.phar.asc phive.phar chmod +x phive.phar mv phive.phar /usr/local/bin/phive - name: Install phab run: | phive install phpab --global --trust-gpg-keys 0x2A8299CE842DD38C - name: Install latest version of NCC run: | git clone https://git.n64.cc/nosial/ncc.git cd ncc make redist NCC_DIR=$(find build/ -type d -name "ncc_*" | head -n 1) if [ -z "$NCC_DIR" ]; then echo "NCC build directory not found" exit 1 fi php "$NCC_DIR/INSTALL" --auto cd .. && rm -rf ncc - name: Build project run: | ncc build --config release_executable --build-source --log-level debug - name: Upload build artifact uses: actions/upload-artifact@v4 with: name: release_executable path: build/release/Socialbox debug_executable: runs-on: ubuntu-latest container: image: php:8.3 steps: - name: Checkout repository uses: actions/checkout@v4 - name: Install dependencies run: | apt update -yqq apt install git libpq-dev libzip-dev zip make wget gnupg -yqq - name: Install phive run: | wget -O phive.phar https://phar.io/releases/phive.phar wget -O phive.phar.asc https://phar.io/releases/phive.phar.asc gpg --keyserver hkps://keys.openpgp.org --recv-keys 0x9D8A98B29B2D5D79 gpg --verify phive.phar.asc phive.phar chmod +x phive.phar mv phive.phar /usr/local/bin/phive - name: Install phab run: | phive install phpab --global --trust-gpg-keys 0x2A8299CE842DD38C - name: Install latest version of NCC run: | git clone https://git.n64.cc/nosial/ncc.git cd ncc make redist NCC_DIR=$(find build/ -type d -name "ncc_*" | head -n 1) if [ -z "$NCC_DIR" ]; then echo "NCC build directory not found" exit 1 fi php "$NCC_DIR/INSTALL" --auto cd .. && rm -rf ncc - name: Build project run: | ncc build --config debug_executable --build-source --log-level debug - name: Upload build artifact uses: actions/upload-artifact@v4 with: name: debug_executable path: build/debug/Socialbox # Checking for phpunit.xml check-phpunit: runs-on: ubuntu-latest outputs: phpunit-exists: ${{ steps.check.outputs.phpunit-exists }} steps: - name: Checkout repository uses: actions/checkout@v4 - name: Check for phpunit.xml id: check run: | if [ -f phpunit.xml ]; then echo "phpunit-exists=true" >> $GITHUB_OUTPUT else echo "phpunit-exists=false" >> $GITHUB_OUTPUT fi # Checking for phpdoc.dist.xml check-phpdoc: runs-on: ubuntu-latest outputs: phpdoc-exists: ${{ steps.check.outputs.phpdoc-exists }} steps: - name: Checkout repository uses: actions/checkout@v4 - name: Check for phpdoc.dist.xml id: check run: | if [ -f phpdoc.dist.xml ]; then echo "phpdoc-exists=true" >> $GITHUB_OUTPUT else echo "phpdoc-exists=false" >> $GITHUB_OUTPUT fi generate-phpdoc: needs: [release, check-phpdoc] runs-on: ubuntu-latest container: image: php:8.3 if: needs.check-phpdoc.outputs.phpdoc-exists == 'true' steps: - name: Checkout repository uses: actions/checkout@v4 - name: Install dependencies run: | apt update -yqq apt install git libpq-dev libzip-dev zip make wget gnupg -yqq - name: Download PHPDocumentor run: | wget https://phpdoc.org/phpDocumentor.phar chmod +x phpDocumentor.phar - name: Generate PHPDoc run: | php phpDocumentor.phar -d src -t docs - name: Archive PHPDoc run: | zip -r docs.zip docs - name: Upload PHPDoc uses: actions/upload-artifact@v4 with: name: documentation path: docs.zip test: needs: [release, debug, release_executable, debug_executable, check-phpunit] runs-on: ubuntu-latest container: image: php:8.3 if: needs.check-phpunit.outputs.phpunit-exists == 'true' steps: - name: Checkout repository uses: actions/checkout@v4 - name: Download build artifacts uses: actions/download-artifact@v4 with: name: release path: release - name: Install dependencies run: | apt update -yqq apt install git libpq-dev libzip-dev zip make wget gnupg curl docker.io docker-compose -yqq curl -sSLf -o /usr/local/bin/install-php-extensions https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions chmod +x /usr/local/bin/install-php-extensions install-php-extensions zip - name: Install phive run: | wget -O phive.phar https://phar.io/releases/phive.phar wget -O phive.phar.asc https://phar.io/releases/phive.phar.asc gpg --keyserver hkps://keys.openpgp.org --recv-keys 0x9D8A98B29B2D5D79 gpg --verify phive.phar.asc phive.phar chmod +x phive.phar mv phive.phar /usr/local/bin/phive - name: Install phab run: | phive install phpab --global --trust-gpg-keys 0x2A8299CE842DD38C - name: Install latest version of NCC run: | git clone https://git.n64.cc/nosial/ncc.git cd ncc make redist NCC_DIR=$(find build/ -type d -name "ncc_*" | head -n 1) if [ -z "$NCC_DIR" ]; then echo "NCC build directory not found" exit 1 fi php "$NCC_DIR/INSTALL" --auto cd .. && rm -rf ncc - name: Install NCC packages run: | ncc package install --package="release/net.nosial.socialbox.ncc" --build-source --reinstall -y --log-level debug - name: Deploy test environment run: | # Create logs directory mkdir -p docker-logs # Start Docker Compose in detached mode echo "Starting Docker Compose services..." docker-compose -f docker-compose.test.yml up -d # Save container IDs for later log extraction CONTAINER_IDS=$(docker-compose -f docker-compose.test.yml ps -q) echo "Started containers: $CONTAINER_IDS" - name: Wait for services to be available run: | # Function to check if a service is available check_service() { local url=$1 local max_attempts=200 local wait_seconds=5 local attempt=1 echo "Checking availability of $url" while [ $attempt -le $max_attempts ]; do response=$(curl -s -o /dev/null -w "%{http_code}" -f -H "Request-Type: ping" $url || echo "failed") if [ "$response" = "200" ]; then echo "Service at $url is available!" return 0 fi echo "Attempt $attempt/$max_attempts: Service at $url is not available yet (status: $response). Waiting $wait_seconds seconds..." sleep $wait_seconds attempt=$((attempt + 1)) done echo "Service at $url is not available after $max_attempts attempts." return 1 } # Check both services check_service "http://127.0.0.1:8085/" && check_service "http://127.0.0.1:8086/" - name: Start log streaming in background run: | # Start a background process to stream logs to a file docker-compose -f docker-compose.test.yml logs -f > docker-logs/live-logs.txt 2>&1 & echo $! > .docker-logs-pid # Also save current logs to a separate file docker-compose -f docker-compose.test.yml logs > docker-logs/startup-logs.txt 2>&1 - name: Run PHPUnit tests run: | wget https://phar.phpunit.de/phpunit-11.3.phar php phpunit-11.3.phar --configuration phpunit.xml --log-junit reports/junit.xml --log-teamcity reports/teamcity --testdox-html reports/testdox.html --testdox-text reports/testdox.txt - name: Capture final logs if: always() run: | # Stop the background log process if it's running if [ -f .docker-logs-pid ]; then kill $(cat .docker-logs-pid) || true rm .docker-logs-pid fi # Capture one final set of logs docker-compose -f docker-compose.test.yml logs > docker-logs/final-logs.txt 2>&1 # Get individual container logs as well (with timestamps) for container in $(docker-compose -f docker-compose.test.yml ps -q); do container_name=$(docker inspect --format='{{.Name}}' $container | sed 's/^\///') docker logs --timestamps $container > "docker-logs/$container_name.log" 2>&1 done - name: Stop test environment run: | docker-compose -f docker-compose.test.yml down if: always() # Always run this step, even if previous steps fail - name: Upload test reports uses: actions/upload-artifact@v4 with: name: reports path: reports - name: Upload Docker logs uses: actions/upload-artifact@v4 with: name: docker-logs path: docker-logs if: always() # Always upload logs, even if tests fail release-documentation: needs: generate-phpdoc permissions: write-all runs-on: ubuntu-latest container: image: php:8.3 if: github.event_name == 'release' steps: - name: Checkout repository uses: actions/checkout@v4 - name: Download documentation artifact uses: actions/download-artifact@v4 with: name: documentation path: documentation - name: Upload documentation artifact uses: softprops/action-gh-release@v1 with: files: | documentation/* env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} release-artifacts: needs: [release, debug, release_executable, debug_executable] permissions: write-all runs-on: ubuntu-latest container: image: php:8.3 if: github.event_name == 'release' steps: - name: Checkout repository uses: actions/checkout@v4 - name: Download release artifact uses: actions/download-artifact@v4 with: name: release path: release - name: Upload release artifact to release uses: softprops/action-gh-release@v1 with: files: | release/* env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Download debug artifact uses: actions/download-artifact@v4 with: name: debug path: debug - name: Upload debug artifact to release uses: softprops/action-gh-release@v1 with: files: | debug/* env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Download release_executable artifact uses: actions/download-artifact@v4 with: name: release_executable path: release_executable - name: Upload release_executable artifact to release uses: softprops/action-gh-release@v1 with: files: | release_executable/* env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Download debug_executable artifact uses: actions/download-artifact@v4 with: name: debug_executable path: debug_executable - name: Upload debug_executable artifact to release uses: softprops/action-gh-release@v1 with: files: | debug_executable/* env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}