name: Build, Test and Publish on: pull_request: branches: - main push: paths-ignore: - '.github/*.yml' - '.github/ISSUE_TEMPLATE/*.md' - 'install.sh' # Ansible-only scripts and folders - 'update.sh' - 'util/ansible/**' branches: - ci-testing - main - stable tags: - '*' schedule: - cron: '0 2 * * 0' # Weekly on Sundays at 02:00 jobs: build: name: Build, Test and Publish runs-on: ubuntu-latest env: APPLICATION_ENV: testing NODE_ENV: production steps: - uses: actions/checkout@master - name: Reduce Git repository size. run: | git gc --prune=now --aggressive - name: Setup PHP uses: shivammathur/setup-php@v2 with: php-version: '8.1' extensions: intl, maxminddb tools: composer:v2, cs2pr - name: Set console permissions and clear static assets. run: | rm -rf web/static/dist rm -rf web/static/webpack_dist rm -rf web/static/webpack.json rm -rf web/static/assets.json chmod a+x bin/console - name: Run Composer install run: | composer install --no-interaction --ignore-platform-reqs - name: Run PHP Linter run: | vendor/bin/parallel-lint . --exclude vendor --checkstyle | cs2pr - name: Run PHPStan run: | vendor/bin/phpstan analyze --error-format=checkstyle | cs2pr - name: Run PHP Code Sniffer run: | vendor/bin/phpcs --report=checkstyle | cs2pr - name: Clear existing locales. if: github.event_name == 'push' || github.event_name == 'schedule' run: | rm -rf resources/locale/compiled rm -rf resources/locale/compiled_js rm -rf resources/locale/*.UTF-8 mkdir -p resources/locale/compiled - name: Generate new translations from existing code. if: github.event_name == 'push' || github.event_name == 'schedule' run: bin/console locale:generate - name: Pull latest translations. if: github.event_name == 'push' || github.event_name == 'schedule' uses: crowdin/github-action@1.4.1 with: upload_sources: true download_translations: true export_only_approved: false push_translations: false crowdin_branch_name: main config: crowdin.yaml env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }} CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }} - name: Import locales, build static assets. run: | bin/console locale:import cd frontend npm ci npm run build - name: Build OpenAPI Docs run: bin/console azuracast:api:docs - name: Set up QEMU uses: docker/setup-qemu-action@v1 id: qemu with: platforms: arm64 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v1 - name: Build Web Image uses: docker/build-push-action@master with: context: . load: true tags: ghcr.io/azuracast/web:latest cache-from: type=registry,ref=ghcr.io/azuracast/web:buildcache - name: Set up functional test environment. run: | cp sample.env .env cp azuracast.sample.env azuracast.env cp docker-compose.sample.yml docker-compose.yml cp docker-compose.testing.yml docker-compose.override.yml docker-compose run --rm --user="azuracast" web azuracast_install - name: Run functional test suite. run: | chmod 777 tests/_output/ chmod 777 tests/_support/_generated docker-compose run --rm --user="azuracast" web composer codeception-no-coverage - name: Stop all running containers. run: | docker-compose down - name: Echo test output directory if: failure() run: | docker-compose logs cat tests/_output/* - name: Login to DockerHub uses: docker/login-action@v1 if: github.event_name == 'push' || github.event_name == 'schedule' with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Login to GitHub Container Registry uses: docker/login-action@v1 if: github.event_name == 'push' || github.event_name == 'schedule' with: registry: ghcr.io username: ${{ github.repository_owner }} password: ${{ secrets.GITHUB_TOKEN }} - name: Build Docker Metadata id: meta uses: crazy-max/ghaction-docker-meta@v2 if: github.event_name == 'push' || github.event_name == 'schedule' with: images: | azuracast/azuracast_web_v2 ghcr.io/azuracast/web tags: | type=raw,value=latest,enable=${{ endsWith(github.ref, github.event.repository.default_branch) }} type=ref,event=branch type=semver,pattern={{version}} - name: Publish Web Image uses: docker/build-push-action@master if: github.event_name == 'push' || github.event_name == 'schedule' with: context: . push: true platforms : linux/amd64,linux/arm64 tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} cache-from: type=registry,ref=ghcr.io/azuracast/web:buildcache cache-to: type=registry,ref=ghcr.io/azuracast/web:buildcache,mode=max