diff --git a/.env b/.env new file mode 100644 index 0000000..b6e15c4 --- /dev/null +++ b/.env @@ -0,0 +1,36 @@ +# Socialbox Configuration +LOG_LEVEL=debug +SB_MODE=automated +SB_DOMAIN=localhost +SB_INSTANCE_NAME=Socialbox +SB_RPC_ENDPOINT=http://127.0.0.0:8085/ +SB_LOGGING_CONSOLE_ENABLED=true +SB_LOGGING_CONSOLE_LEVEL=info +SB_SECURITY_DISPLAY_INTERNAL_EXCEPTIONS=true +SB_CRYPTO_KEYPAIR_EXPIRES= +SB_CRYPTO_ENCRYPTION_KEYS_ALGORITHM=xchacha20 +SB_CRYPTO_TRANSPORT_ENCRYPTION_ALGORITHM=chacha20 +SB_CACHE_ENABLED=true +SB_CACHE_PORT=6379 +SB_CACHE_USERNAME=root +SB_CACHE_PASSWORD=root +SB_CACHE_DATABASE=0 + +# MariaDB Configuration +MYSQL_ROOT_PASSWORD=sb_root +MYSQL_DATABASE=socialbox +MYSQL_USER=socialbox +MYSQL_PASSWORD=socialbox + +# Redis Configuration +REDIS_PASSWORD=root + +# Test Configuration, can be ignored. Used for docker-compose-test.yml +SB_COFFEE_NAME=coffee +SB_COFFEE_DOMAIN=coffee.com +SB_COFFEE_RPC_ENDPOINT=http://coffee_socialbox:8085/ +SB_INSTANCE_DNS_MOCK_COFFEE="coffee.com v=socialbox;sb-rpc=http://coffee_socialbox:8085/;sb-key=sig:g59Cf8j1wmQmRg1MkveYbpdiZ-1-_hFU9eRRJmQAwmc;sb-exp=0" + +SB_TEAPOT_DOMAIN=teapot.com +SB_TEAPOT_RPC_ENDPOINT=http://teapot_socialbox:8085/ +SB_INSTANCE_DNS_MOCK_TEAPOT="teapot.com v=socialbox;sb-rpc=http://teapot_socialbox:8085/;sb-key=sig:MDXUuripAo_IAv-EZTEoFhpIdhsXxfMLNunSnQzxYiY;sb-exp=0" \ No newline at end of file diff --git a/.github/workflows/ncc_workflow.yml b/.github/workflows/ncc_workflow.yml index afa2f41..1b5e4e4 100644 --- a/.github/workflows/ncc_workflow.yml +++ b/.github/workflows/ncc_workflow.yml @@ -9,7 +9,7 @@ on: workflow_dispatch: jobs: - build: + release: runs-on: ubuntu-latest container: image: php:8.3 @@ -51,14 +51,163 @@ jobs: - name: Build project run: | - ncc build --config release --log-level debug + ncc build --config release --build-source --log-level debug - - name: Upload build artifacts + - name: Upload build artifact uses: actions/upload-artifact@v4 with: - name: Socialbox_build + 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: @@ -74,9 +223,59 @@ jobs: 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: [build, check-phpunit] + needs: [release, debug, release_executable, debug_executable, check-phpunit] runs-on: ubuntu-latest container: image: php:8.3 @@ -89,8 +288,8 @@ jobs: - name: Download build artifacts uses: actions/download-artifact@v4 with: - name: Socialbox_build - path: Socialbox_build # Adjust this to download the artifact directly under 'Socialbox_build' + name: release + path: release - name: Install dependencies run: | @@ -98,7 +297,7 @@ jobs: apt install git libpq-dev libzip-dev zip make wget gnupg -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 pdo_mysql mysqli mcrypt + install-php-extensions zip - name: Install phive run: | @@ -128,15 +327,22 @@ jobs: - name: Install NCC packages run: | - ncc package install --package="Socialbox_build/net.nosial.socialbox.ncc" --build-source --reinstall -y --log-level debug + ncc package install --package="release/net.nosial.socialbox.ncc" --build-source --reinstall -y --log-level debug - name: Run PHPUnit tests run: | wget https://phar.phpunit.de/phpunit-11.3.phar - php phpunit-11.3.phar --configuration phpunit.xml + 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 - release: - needs: [build, test] + - name: Upload test reports + uses: actions/upload-artifact@v4 + with: + name: reports + path: reports + + + release-documentation: + needs: generate-phpdoc permissions: write-all runs-on: ubuntu-latest container: @@ -147,16 +353,78 @@ jobs: - name: Checkout repository uses: actions/checkout@v4 - - name: Download build artifacts + - name: Download documentation artifact uses: actions/download-artifact@v4 with: - name: Socialbox_build - path: Socialbox_build + name: documentation + path: documentation - - name: Upload to GitHub Release + - name: Upload documentation artifact uses: softprops/action-gh-release@v1 with: - files: | - Socialbox_build/net.nosial.socialbox.ncc + files: | + documentation/* env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file + 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 }} diff --git a/.gitignore b/.gitignore index 33a3681..9daf5a4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,11 @@ /build +/.vscode /.idea/gbrowser_project.xml -.phpunit.result.cache \ No newline at end of file +.phpunit.result.cache +/socialbox +/bob_socialbox +/alice_socialbox +/coffee_socialbox/data/ +/coffee_socialbox/logs/ +/teapot_socialbox/data/ +/teapot_socialbox/logs/ diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 52ab115..185dca3 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,46 +1,170 @@ -image: php:8.1 +# Global config +default: + image: php:8.3 -before_script: - # Install some stuff that the image doesn't come with - - apt update -yqq - - apt install git libpq-dev libzip-dev zip make wget gnupg -yqq +variables: + GIT_STRATEGY: clone - # Install phive - - 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 +workflow: + rules: + - if: $CI_PIPELINE_SOURCE == "push" + - if: $CI_PIPELINE_SOURCE == "web" + - if: $CI_COMMIT_TAG - # Install phab - - phive install phpab --global --trust-gpg-keys 0x2A8299CE842DD38C +# Reusable template for installing common dependencies +.setup_template: &setup_definition + before_script: + - apt update -yqq + - apt install git libpq-dev libzip-dev zip make wget gnupg -yqq + # Install phive + - 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 + # Install phab + - phive install phpab --global --trust-gpg-keys 0x2A8299CE842DD38C + # Install NCC + - 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 - # Install the latest version of ncc (Nosial Code Compiler) - - git clone https://git.n64.cc/nosial/ncc.git - - cd ncc - - make redist - - php build/src/INSTALL --auto --install-composer - - cd .. && rm -rf ncc - -build: +# Build jobs +release: + <<: *setup_definition stage: build script: - - ncc build --config release --log-level debug + - ncc build --config release --build-source --log-level debug artifacts: paths: - - build/ - rules: - - if: $CI_COMMIT_BRANCH + - build/release/net.nosial.socialbox.ncc + expire_in: 1 week -release: - stage: deploy +debug: + <<: *setup_definition + stage: build script: - - ncc build --config release --log-level debug - - > - curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file build/release/net.nosial.socialbox.ncc "$CI_API_V4_URL/projects/$CI_PROJECT_ID/packages/generic/net.nosial.socialbox/$CI_COMMIT_REF_NAME/net.nosial.socialbox.ncc" + - ncc build --config debug --build-source --log-level debug artifacts: paths: - - build/ + - build/debug/net.nosial.socialbox.ncc + expire_in: 1 week + +release_executable: + <<: *setup_definition + stage: build + script: + - ncc build --config release_executable --build-source --log-level debug + artifacts: + paths: + - build/release/Socialbox + expire_in: 1 week + +debug_executable: + <<: *setup_definition + stage: build + script: + - ncc build --config debug_executable --build-source --log-level debug + artifacts: + paths: + - build/debug/Socialbox + expire_in: 1 week + +# Check for configuration files +check_configs: + stage: .pre + script: + - | + if [ -f phpunit.xml ]; then + echo "PHPUNIT_EXISTS=true" >> build.env + else + echo "PHPUNIT_EXISTS=false" >> build.env + fi + if [ -f phpdoc.dist.xml ]; then + echo "PHPDOC_EXISTS=true" >> build.env + else + echo "PHPDOC_EXISTS=false" >> build.env + fi + artifacts: + reports: + dotenv: build.env + +# Documentation generation +generate-phpdoc: + <<: *setup_definition + stage: build + needs: ["check_configs"] + rules: + - if: $PHPDOC_EXISTS == "true" + script: + - wget https://phpdoc.org/phpDocumentor.phar + - chmod +x phpDocumentor.phar + - php phpDocumentor.phar -d src -t docs + - zip -r docs.zip docs + artifacts: + paths: + - docs.zip + expire_in: 1 week + +# Testing +test: + <<: *setup_definition + stage: test + needs: + - job: release + - job: check_configs + rules: + - if: $PHPUNIT_EXISTS == "true" + script: + - 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 + - ncc package install --package="build/release/net.nosial.socialbox.ncc" --build-source --reinstall -y --log-level debug + - 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 + artifacts: + reports: + junit: reports/junit.xml + paths: + - reports/ + expire_in: 1 week + +# Release jobs +release_upload: + stage: deploy rules: - if: $CI_COMMIT_TAG + needs: + - job: release + - job: debug + - job: release_executable + - job: debug_executable + - job: generate-phpdoc + optional: true + script: + - | + if [ -f "docs.zip" ]; then + echo "Releasing documentation..." + curl --request POST \ + --header "PRIVATE-TOKEN: ${GITLAB_TOKEN}" \ + --form "file=@docs.zip" \ + "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/uploads" + fi + + # Upload release artifacts + for artifact in build/release/net.nosial.socialbox.ncc build/debug/net.nosial.socialbox.ncc build/release/Socialbox build/debug/Socialbox; do + if [ -f "$artifact" ]; then + echo "Uploading $artifact..." + curl --request POST \ + --header "PRIVATE-TOKEN: ${GITLAB_TOKEN}" \ + --form "file=@${artifact}" \ + "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/uploads" + fi + done + environment: production \ No newline at end of file diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml index eb6fe11..222744a 100644 --- a/.idea/dataSources.xml +++ b/.idea/dataSources.xml @@ -8,5 +8,25 @@ jdbc:mariadb://127.0.0.1:3306/socialbox $ProjectFileDir$ + + mariadb + true + org.mariadb.jdbc.Driver + jdbc:mariadb://127.0.0.1:3308/socialbox + + + + $ProjectFileDir$ + + + mariadb + true + org.mariadb.jdbc.Driver + jdbc:mariadb://127.0.0.1:3307/socialbox + + + + $ProjectFileDir$ + \ No newline at end of file diff --git a/.idea/php-test-framework.xml b/.idea/php-test-framework.xml new file mode 100644 index 0000000..ea6eea8 --- /dev/null +++ b/.idea/php-test-framework.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/php.xml b/.idea/php.xml index 6e91387..93636e7 100644 --- a/.idea/php.xml +++ b/.idea/php.xml @@ -10,18 +10,27 @@