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 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: Build test environment run: | docker-compose -f docker-compose.test.yml build - name: Run PHPUnit tests run: | check_service() { local port=$1 local max_attempts=30 local wait_seconds=2 local attempt=1 while [ $attempt -le $max_attempts ]; do echo "Checking service on port $port (attempt $attempt/$max_attempts)..." if curl -s -o /dev/null -w "%{http_code}" -H "Request-Type: ping" http://172.17.0.1:$port | grep -q "200"; then echo "Service on port $port is available!" return 0 fi echo "Service on port $port not yet available. Waiting ${wait_seconds}s before next attempt..." sleep $wait_seconds attempt=$((attempt + 1)) done echo "Error: Service on port $port not available after $max_attempts attempts" return 1 } # Prepare phpunit wget https://phar.phpunit.de/phpunit-11.3.phar docker-compose -f docker-compose.test.yml up -d check_service 8087 || exit 1 check_service 8086 || exit 1 # Run the tests and tare down the test environment 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 docker-compose -f docker-compose.test.yml down - name: Upload test reports uses: actions/upload-artifact@v4 with: name: reports path: reports - name: Upload coffee test logs uses: actions/upload-artifact@v4 with: name: coffee_logs path: tests/docker/coffee/logs - name: Upload teapot test logs uses: actions/upload-artifact@v4 with: name: teapot_logs path: tests/docker/teapot/logs 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 }}