name: Test and deploy on: workflow_dispatch: push: pull_request: release: types: [published] env: REGISTRY: ghcr.io IMAGE_NAME: ${{ github.repository }} jobs: test-django-system-check: name: Tests - Django system check runs-on: ubuntu-20.04 steps: - name: Checkout uses: actions/checkout@v3 - name: Create Docker network run: docker network create uccser-development-stack - name: Set DOCKER_UID variable run: echo "DOCKER_UID=$(echo $UID)" >> $GITHUB_ENV - name: Start systems run: docker compose -f docker-compose.local.yml up -d - name: Run Django system check run: docker compose -f docker-compose.local.yml run --rm django python ./manage.py check --fail-level WARNING test-content: name: Tests - Content runs-on: ubuntu-20.04 steps: - name: Checkout uses: actions/checkout@v3 - name: Create Docker network run: docker network create uccser-development-stack - name: Set DOCKER_UID variable run: echo "DOCKER_UID=$(echo $UID)" >> $GITHUB_ENV - name: Start systems run: docker compose -f docker-compose.local.yml up -d - name: Create static files run: docker compose -f docker-compose.local.yml run --rm --user="root" node npm run generate-assets - name: Migrate database run: docker compose -f docker-compose.local.yml run --rm django python ./manage.py migrate - name: Run update_data command run: docker compose -f docker-compose.local.yml run --rm django python ./manage.py update_data - name: Collect static files run: docker compose -f docker-compose.local.yml run --rm --user="root" django python ./manage.py collectstatic --no-input test-general: name: Tests - General runs-on: ubuntu-20.04 steps: - name: Checkout uses: actions/checkout@v3 - name: Run general tests run: ./dev ci test_general test-style: name: Tests - Style runs-on: ubuntu-20.04 steps: - name: Checkout uses: actions/checkout@v3 - name: Run style tests run: ./dev ci style create-static-files: name: Create static files if: | (github.ref == 'refs/heads/develop' || startsWith(github.ref, 'refs/heads/research-study-') || github.event_name == 'release') && github.event_name != 'pull_request' runs-on: ubuntu-20.04 needs: [test-django-system-check, test-content, test-general, test-style] steps: - name: Checkout repository uses: actions/checkout@v3 - name: Create Docker network run: docker network create uccser-development-stack - name: Set DOCKER_UID variable run: echo "DOCKER_UID=$(echo $UID)" >> $GITHUB_ENV - name: Start system run: docker compose -f docker-compose.local.yml up -d - name: Create production static files run: docker compose -f docker-compose.local.yml run --rm --user="root" node npm run generate-production-assets - name: Collect staticfiles run: docker compose -f docker-compose.local.yml run --rm --user="root" django python manage.py collectstatic --no-input - name: Archive static files run: tar czf static-files.tar.gz --directory codewof/staticfiles/ . - name: Upload artifact uses: actions/upload-artifact@v3 with: name: static-files path: static-files.tar.gz retention-days: 3 publish-docker-image: name: Create and publish Docker image if: | (github.ref == 'refs/heads/develop' || startsWith(github.ref, 'refs/heads/research-study-') || github.event_name == 'release') && github.event_name != 'pull_request' runs-on: ubuntu-20.04 needs: [create-static-files] steps: - name: Checkout repository uses: actions/checkout@v3 - name: Download all workflow run artifacts uses: actions/download-artifact@v3 with: path: artifacts/ - name: Show file tree of artifacts directory run: ls -R -l artifacts/ - name: Unpack all artifacts run: | mkdir -p codewof/staticfiles tar -xz --file artifacts/static-files/static-files.tar.gz --directory codewof/staticfiles - name: Log in to the Container registry uses: docker/login-action@v2.2.0 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Setup Docker metadata id: meta uses: docker/metadata-action@v4 with: images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} tags: | type=ref,event=tag,priority=1 type=ref,event=branch,priority=2 - name: Build and push Docker image uses: docker/build-push-action@v3.3.0 with: file: ./infrastructure/production/django/Dockerfile context: . push: true tags: ${{ steps.meta.outputs.tags }} build-args: | GIT_SHA=${{ github.sha }} BUILD_ENVIRONMENT=${{ github.event_name == 'release' && 'production' || 'staging' }}