name: Build, Test and Publish on: pull_request: branches: - main push: paths-ignore: - '*.md' - '.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 concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true jobs: build: name: Build and Test runs-on: ubuntu-latest env: APPLICATION_ENV: testing NODE_ENV: production steps: - uses: actions/checkout@master - name: Setup PHP uses: shivammathur/setup-php@v2 with: php-version: '8.1' extensions: intl, maxminddb tools: composer:v2, cs2pr - name: Cache PHP dependencies uses: actions/cache@v2 with: path: vendor key: ${{ runner.OS }}-build-${{ hashFiles('composer.lock') }} - 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 translations/*.UTF-8 - name: Generate new translations from existing code. if: github.event_name == 'push' || github.event_name == 'schedule' run: | cd frontend npm ci npm run generate-locales cd .. bin/console locale:generate - name: Pull latest translations. if: github.event_name == 'push' || github.event_name == 'schedule' uses: crowdin/github-action@1.4.8 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 run import-locales npm run build - name: Build OpenAPI Docs run: bin/console azuracast:api:docs - name: Set up Docker Buildx uses: docker/setup-buildx-action@v1 - name: Build Web Image uses: docker/build-push-action@v2 with: context: . load: true tags: ghcr.io/azuracast/azuracast:latest cache-from: type=registry,ref=ghcr.io/azuracast/azuracast: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 - name: Run functional test suite. run: | chmod 777 tests/_output/ chmod 777 tests/_support/_generated docker-compose run --rm web azuracast_ci - name: Stop all running containers. run: | docker-compose down - name: Echo test output directory if: failure() run: | docker-compose logs cat tests/_output/* - name: Upload built static assets and translations uses: actions/upload-artifact@v2 with: name: assets if-no-files-found: error path: | translations web/static/dist web/static/webpack_dist web/static/webpack.json web/static/assets.json web/static/api/openapi.yml publish: name: Publish needs: build runs-on: ubuntu-latest if: github.event_name == 'push' || github.event_name == 'schedule' steps: - uses: actions/checkout@master - name: Reduce Git repository size. run: | git gc --prune=now --aggressive - name: Download built static assets from previous step uses: actions/download-artifact@v2 with: name: assets - 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: Login to DockerHub uses: docker/login-action@v1 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Login to GitHub Container Registry uses: docker/login-action@v1 with: registry: ghcr.io username: ${{ github.repository_owner }} password: ${{ secrets.GITHUB_TOKEN }} - name: Build Docker Metadata id: meta uses: docker/metadata-action@v3 with: images: | azuracast/azuracast ghcr.io/azuracast/azuracast tags: | type=raw,value=latest,enable=${{ endsWith(github.ref, github.event.repository.default_branch) }} type=ref,event=branch type=semver,pattern={{version}} - name: Publish to Docker Hub uses: docker/build-push-action@v2 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/azuracast:buildcache cache-to: type=registry,ref=ghcr.io/azuracast/azuracast:buildcache,mode=max