diff --git a/.github/workflows/check_pr.yml b/.github/workflows/check_pr.yml new file mode 100644 index 0000000..f2cd592 --- /dev/null +++ b/.github/workflows/check_pr.yml @@ -0,0 +1,28 @@ +name: Check PR status for branch +on: + workflow_call: + outputs: + branch-pr: + description: The PR number if the branch is in one + value: ${{ jobs.pr.outputs.branch-pr }} + +jobs: + pr: + runs-on: "ubuntu-latest" + outputs: + branch-pr: ${{ steps.script.outputs.result }} + steps: + - uses: actions/github-script@v7 + id: script + if: github.event_name == 'push' + with: + script: | + const prs = await github.rest.pulls.list({ + owner: context.repo.owner, + repo: context.repo.repo, + head: context.repo.owner + ':${{ github.ref_name }}' + }) + if (prs.data.length) { + console.log(`::notice ::Skipping CI on branch push as it is already run in PR #${prs.data[0]["number"]}`) + return prs.data[0]["number"] + } diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..06666ff --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,21 @@ +name: Full CI +on: + push: + pull_request: + workflow_dispatch: + +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +permissions: + pull-requests: write + +jobs: + check_pr_status: + uses: ./.github/workflows/check_pr.yml + + formatter: + needs: check_pr_status + if: needs.check_pr_status.outputs.branch-pr == '' + uses: ./.github/workflows/formatter.yml diff --git a/.github/workflows/formatter.yml b/.github/workflows/formatter.yml new file mode 100644 index 0000000..e977335 --- /dev/null +++ b/.github/workflows/formatter.yml @@ -0,0 +1,60 @@ +name: Formatter and Pylint jobs +on: [workflow_call] +jobs: + Formatter: + runs-on: ubuntu-latest + steps: + - name: Check out repository code + uses: actions/checkout@v4 + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.13" + + - name: Run black and isort + run: | + pip install black isort + pip install -e .[dev] + isort --check --diff --line-length=100 --profile=black --multi-line=3 --trailing-comma ./ + black --check --diff --color --line-length=100 --skip-magic-trailing-comma ./ + Pylint: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.13" + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install pylint pylint-exit anybadge + + - name: Run Pylint + run: | + mkdir -p ./pylint + set +e + pylint ./slurm_manager --output-format=text > ./pylint/pylint.log + pylint-exit $? + set -e + + - name: Extract Pylint Score + id: score + run: | + SCORE=$(sed -n 's/^Your code has been rated at \([-0-9.]*\)\/.*/\1/p' ./pylint/pylint.log) + echo "score=$SCORE" >> $GITHUB_OUTPUT + + - name: Create Badge + run: | + anybadge --label=Pylint --file=./pylint/pylint.svg --value="${{ steps.score.outputs.score }}" 2=red 4=orange 8=yellow 10=green + + - name: Upload Artifacts + uses: actions/upload-artifact@v4 + with: + name: pylint-artifacts + path: | + # ./pylint/pylint.log # not sure why this isn't working + ./pylint/pylint.svg