diff --git a/.github/workflows/upstream-dev-ci.yaml b/.github/workflows/upstream-dev-ci.yaml index 6146f2b2..d0856363 100644 --- a/.github/workflows/upstream-dev-ci.yaml +++ b/.github/workflows/upstream-dev-ci.yaml @@ -4,6 +4,7 @@ on: branches: - main pull_request: + types: [opened, reopened, synchronize, labeled] branches: - main schedule: @@ -15,33 +16,10 @@ concurrency: cancel-in-progress: true jobs: - detect-ci-trigger: - name: detect upstream-dev ci trigger - runs-on: ubuntu-latest - if: | - github.repository == 'xarray-contrib/cf-xarray' - && (github.event_name == 'push' || github.event_name == 'pull_request') - outputs: - triggered: ${{ steps.detect-trigger.outputs.trigger-found }} - steps: - - uses: actions/checkout@v3 - with: - fetch-depth: 2 - - uses: xarray-contrib/ci-trigger@v1.2 - id: detect-trigger - with: - keyword: "[test-upstream]" - upstream-dev: name: upstream-dev runs-on: ubuntu-latest - needs: detect-ci-trigger - if: | - always() - && ( - (github.event_name == 'schedule' || github.event_name == 'workflow_dispatch') - || needs.detect-ci-trigger.outputs.triggered == 'true' - ) + if: ${{ contains( github.event.pull_request.labels.*.name, 'test-upstream') && github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch' }} defaults: run: shell: bash -l {0} @@ -49,131 +27,34 @@ jobs: fail-fast: false matrix: python-version: ["3.10"] - outputs: - artifacts_availability: ${{ steps.status.outputs.ARTIFACTS_AVAILABLE }} steps: - uses: actions/checkout@v3 with: fetch-depth: 0 # Fetch all history for all branches and tags. + - name: Set environment variables + run: | + echo "PYTHON_VERSION=${{ matrix.python-version }}" >> $GITHUB_ENV - name: Set up conda environment - uses: mamba-org/provision-with-micromamba@f347426e5745fe3dfc13ec5baf20496990d0281f + uses: mamba-org/provision-with-micromamba@v14 with: environment-file: ci/upstream-dev-env.yml environment-name: cf_xarray_test extra-specs: | - python=${{ matrix.python-version }} + python="${{ matrix.python-version }}" pytest-reportlog - - name: Install cf-xarray + - name: Install cf_xarray run: | python -m pip install --no-deps -e . - - name: Version info - run: | - conda info -a - conda list - - name: import cf_xarray - run: | - python -c 'import cf_xarray' - name: Run Tests - if: success() - id: status run: | - python -m pytest -n 2 -rf \ - --report-log output-${{ matrix.python-version }}-log.jsonl \ - || ( - echo '::set-output name=ARTIFACTS_AVAILABLE::true' && false - ) - - name: Upload artifacts + pytest -rf -n auto --cov=./ --cov-report=xml \ + --report-log output-${{ matrix.python-version }}-log.jsonl + - name: Generate and publish the report if: | failure() && steps.status.outcome == 'failure' && github.event_name == 'schedule' - && github.repository == 'xarray-contrib/cf-xarray' - uses: actions/upload-artifact@v3 - with: - name: output-${{ matrix.python-version }}-log.jsonl - path: output-${{ matrix.python-version }}-log.jsonl - retention-days: 5 - - report: - name: report - needs: upstream-dev - if: | - failure() - && github.event_name == 'schedule' - && needs.upstream-dev.outputs.artifacts_availability == 'true' - runs-on: ubuntu-latest - defaults: - run: - shell: bash - steps: - - uses: actions/checkout@v3 - - uses: actions/setup-python@v4 - with: - python-version: "3.x" - - uses: actions/download-artifact@v3 - with: - path: /tmp/workspace/logs - - name: Move all log files into a single directory - run: | - rsync -a /tmp/workspace/logs/output-*/ ./logs - ls -R ./logs - - name: install dependencies - run: | - python -m pip install pytest - - name: Parse logs - run: | - shopt -s globstar - python .github/workflows/parse_logs.py logs/**/*-log* - cat pytest-logs.txt - - name: Report failures - uses: actions/github-script@v6 + && github.repository_owner == 'xarray-contrib' + uses: xarray-contrib/issue-from-pytest-log@v1 with: - github-token: ${{ secrets.GITHUB_TOKEN }} - script: | - const fs = require('fs'); - const pytest_logs = fs.readFileSync('pytest-logs.txt', 'utf8'); - const title = "⚠️ Nightly upstream-dev CI failed ⚠️" - const workflow_url = `https://github.com/${process.env.GITHUB_REPOSITORY}/actions/runs/${process.env.GITHUB_RUN_ID}` - const issue_body = `[Workflow Run URL](${workflow_url})\n${pytest_logs}` - - // Run GraphQL query against GitHub API to find the most recent open issue used for reporting failures - const query = `query($owner:String!, $name:String!, $creator:String!, $label:String!){ - repository(owner: $owner, name: $name) { - issues(first: 1, states: OPEN, filterBy: {createdBy: $creator, labels: [$label]}, orderBy: {field: CREATED_AT, direction: DESC}) { - edges { - node { - body - id - number - } - } - } - } - }`; - - const variables = { - owner: context.repo.owner, - name: context.repo.repo, - label: 'CI', - creator: "github-actions[bot]" - } - const result = await github.graphql(query, variables) - - // If no issue is open, create a new issue, - // else update the body of the existing issue. - if (result.repository.issues.edges.length === 0) { - github.rest.issues.create({ - owner: variables.owner, - repo: variables.name, - body: issue_body, - title: title, - labels: [variables.label] - }) - } else { - github.rest.issues.update({ - owner: variables.owner, - repo: variables.name, - issue_number: result.repository.issues.edges[0].node.number, - body: issue_body - }) - } + log-path: output-${{ matrix.python-version }}-log.jsonl