Re: [PATCH v2 1/2] ci: skip GitHub workflow runs for already-tested commits/trees
- From
SZEDER Gábor <szeder.dev@gmail.com>
- Date
- Oct 9, 2020, 07:29 UTC
- Message-ID
- <20201009072922.GC24813@szeder.dev>
- In-Reply-To
- <914868d558b1aa8ebec6e9196c5ae83a2bd566bf.1602170976.git.gitgitgadget@gmail.com>
On Thu, Oct 08, 2020 at 03:29:34PM +0000, Johannes Schindelin via GitGitGadget wrote:
Show 11 quoted lines
> From: Johannes Schindelin <johannes.schindelin@gmx.de> > > 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.
Show 65 quoted lines
> Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
> ---
> .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
>