On Thu, Oct 08, 2020 at 03:29:34PM +0000, Johannes Schindelin via GitGitGadget wrote: > From: Johannes Schindelin <johannes.schindelin@xxxxxx> > > When pushing a commit that has already passed a CI or PR build > successfully, it makes sense to save some energy and time and skip the > new build. > > Let's teach our GitHub workflow to do that. > > For good measure, we also compare the tree ID, which is what we actually > test (the commit ID might have changed due to a reworded commit message, > which should not affect the outcome of the run). We have been doing this on Travis CI for a few years now. Does that approach not work on GitHub actions? Please explain in the commit message why a different approach is taken here. > Signed-off-by: Johannes Schindelin <johannes.schindelin@xxxxxx> > --- > .github/workflows/main.yml | 39 +++++++++++++++++++++++++++++++++++++- > 1 file changed, 38 insertions(+), 1 deletion(-) > > diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml > index 5bd321e5e1..7391b46d61 100644 > --- a/.github/workflows/main.yml > +++ b/.github/workflows/main.yml > @@ -9,7 +9,7 @@ jobs: > ci-config: > runs-on: ubuntu-latest > outputs: > - enabled: ${{ steps.check-ref.outputs.enabled }} > + enabled: ${{ steps.check-ref.outputs.enabled }}${{ steps.skip-if-redundant.outputs.enabled }} > steps: > - name: try to clone ci-config branch > continue-on-error: true > @@ -35,6 +35,43 @@ jobs: > enabled=no > fi > echo "::set-output name=enabled::$enabled" > + - name: skip if the commit or tree was already tested > + id: skip-if-redundant > + uses: actions/github-script@v3 > + if: steps.check-ref.outputs.enabled == 'yes' > + with: > + github-token: ${{secrets.GITHUB_TOKEN}} > + script: | > + // Figure out workflow ID, commit and tree > + const { data: run } = await github.actions.getWorkflowRun({ > + owner: context.repo.owner, > + repo: context.repo.repo, > + run_id: context.runId, > + }); > + const workflow_id = run.workflow_id; > + const head_sha = run.head_sha; > + const tree_id = run.head_commit.tree_id; > + > + // See whether there is a successful run for that commit or tree > + const { data: runs } = await github.actions.listWorkflowRuns({ > + owner: context.repo.owner, > + repo: context.repo.repo, > + per_page: 500, > + status: 'success', > + workflow_id, > + }); > + for (const run of runs.workflow_runs) { > + if (head_sha === run.head_sha) { > + core.warning(`Successful run for the commit ${head_sha}: ${run.html_url}`); > + core.setOutput('enabled', ' but skip'); > + break; > + } > + if (tree_id === run.head_commit.tree_id) { > + core.warning(`Successful run for the tree ${tree_id}: ${run.html_url}`); > + core.setOutput('enabled', ' but skip'); > + break; > + } > + } > > windows-build: > needs: ci-config > -- > gitgitgadget >