name: Test & Build on: push: pull_request: types: [reopened, opened, synchronize] release: types: - created jobs: test: name: Pytest runs-on: ubuntu-latest timeout-minutes: 10 steps: - uses: actions/checkout@v4 - name: Install poetry run: pipx install poetry - name: Set up python id: setup-python uses: actions/setup-python@v5 with: python-version: '3.11' cache: poetry - run: poetry install --without develop,doc,lint --all-extras - name: Run test suite run: | poetry run pytest --junit-xml=unit-test-results.xml --cov-report "xml:coverage.xml" --cov=src --disable-warnings tests/ - name: Archive code coverage results uses: actions/upload-artifact@v4 with: name: code-coverage-report path: | coverage.xml .coverage if-no-files-found: error - name: Archive unit test results uses: actions/upload-artifact@v4 with: name: test-report path: | unit-test-results.xml if-no-files-found: error coverage_pull_request: name: Coverage Report on pull request if: ${{ github.event_name == 'pull_request' && github.actor != 'dependabot[bot]' && github.actor != 'dependabot-preview[bot]'}} runs-on: ubuntu-latest needs: test steps: - uses: actions/download-artifact@v4 with: name: code-coverage-report - name: Get Cover uses: orgoro/coverage@v3.1 with: coverageFile: coverage.xml token: ${{ secrets.GITHUB_TOKEN }} thresholdAll: 0.7 thresholdNew: 0.7 thresholdModified: 0.7 coverage_report: name: Coverage HTML Report if: ${{ github.event_name == 'push' }} runs-on: ubuntu-latest needs: test steps: - uses: actions/checkout@v4 - name: Install poetry run: pipx install poetry - name: Set up python id: setup-python uses: actions/setup-python@v5 with: python-version: '3.11' cache: poetry - run: poetry install --only test --all-extras - uses: actions/download-artifact@v4 with: name: code-coverage-report - name: Make Coverage Report run: | poetry run coverage html - name: Archive builds uses: actions/upload-artifact@v4 with: name: Coverage Report HTML path: htmlcov/ if-no-files-found: error build: name: Wheel-Build if: ${{ github.event_name == 'push'}} runs-on: ubuntu-latest needs: test steps: - uses: actions/checkout@v4 - name: Install poetry run: pipx install poetry - name: Set up python id: setup-python uses: actions/setup-python@v5 with: python-version: '3.11' cache: poetry - run: | poetry build - name: Archive builds uses: actions/upload-artifact@v4 with: name: python-build-artifacts path: dist/ if-no-files-found: error docker-build: name: Docker Build if: ${{ github.event_name == 'push' && github.actor != 'dependabot[bot]' && github.actor != 'dependabot-preview[bot]'}} runs-on: ubuntu-latest needs: [build] steps: - name: Check out repository code uses: actions/checkout@v4 - uses: actions/download-artifact@v4 with: name: python-build-artifacts path: dist - id: tag_or_main run: | if [ "$GITHUB_EVENT_NAME" = "release" ]; then echo "TAG_OR_MAIN=$(echo $GITHUB_REF | awk -F / '{print $NF}')" >> $GITHUB_ENV echo "LATEST=latest" >> $GITHUB_ENV elif [ "$GITHUB_EVENT_NAME" = "push" ] && [ "$GITHUB_REF" = "refs/heads/main" ]; then echo "TAG_OR_MAIN=main" >> $GITHUB_ENV echo "LATEST=main" >> $GITHUB_ENV else echo "TAG_OR_MAIN=experimental" >> $GITHUB_ENV echo "LATEST=experimental" >> $GITHUB_ENV fi - run: | echo "Print ${{ env.TAG_OR_MAIN }}" - name: Build All prior to push run: | docker build --target ingest --build-arg GIT_HASH=${{github.sha}} . docker build --target data-transformation --build-arg GIT_HASH=${{github.sha}} . docker build --target web-server --build-arg GIT_HASH=${{github.sha}} . docker image ls - name: Exit workflow on pull request if: ${{ github.event_name == 'pull_request' }} run: exit 0 - name: Exit workflow on not main branch if: ${{ github.ref != 'refs/heads/main' }} run: exit 0 - name: Login to GitHub Container Registry uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Build and push ingest uses: docker/build-push-action@v5 with: build-args: | "GIT_HASH=${{github.sha}}" push: ${{ github.ref == 'refs/heads/main'}} tags: | ghcr.io/${{ github.repository_owner }}/${{ github.event.repository.name }}/ingest:${{ env.TAG_OR_MAIN }} ghcr.io/${{ github.repository_owner }}/${{ github.event.repository.name }}/ingest:${{ env.LATEST }} target: ingest context: . - name: Build and push data-transformation uses: docker/build-push-action@v5 with: build-args: | "GIT_HASH=${{github.sha}}" push: ${{ github.ref == 'refs/heads/main'}} tags: | ghcr.io/${{ github.repository_owner }}/${{ github.event.repository.name }}/data-transformation:${{ env.TAG_OR_MAIN }} ghcr.io/${{ github.repository_owner }}/${{ github.event.repository.name }}/data-transformation:${{ env.LATEST }} target: data-transformation context: . - name: Build and push web-server uses: docker/build-push-action@v5 with: build-args: | "GIT_HASH=${{github.sha}}" push: ${{ github.ref == 'refs/heads/main'}} tags: | ghcr.io/${{ github.repository_owner }}/${{ github.event.repository.name }}/web-server:${{ env.TAG_OR_MAIN }} ghcr.io/${{ github.repository_owner }}/${{ github.event.repository.name }}/web-server:${{ env.LATEST }} target: web-server context: .