alkaia
alkaia

Reputation: 109

Is there a way to trigger a CircleCI build on a Pull Request?

So, the problem I have is that right now CircleCI doesn't trigger builds on PRs, and I have checks that I'd like to run only on PRs. There is this option:

Only build pull requests

By default, we will build all the commits for this project. Once turned on, we will only build branches that have associated pull requests open. Note: For your default branch, we will always build all commits.

However, this is not what I need, because I still need some checks to run on every commit, on all branches, not just the default one.

This is what I have in my circle.yml file:

test:
  override:
    - if [[ ! -z $CI_PULL_REQUEST ]] ; then yarn test:selenium ; fi

This only gets triggered if there's another push made to the branch after opening a PR, because only then is the build triggered.

I just haven't been able to find a workaround for this, does anyone have any ideas?

Upvotes: 11

Views: 7480

Answers (2)

Roopak Venkatakrishnan
Roopak Venkatakrishnan

Reputation: 563

If you don't want use github actions and just want something that you can click a few buttons to configure check our PR Triggers using Swissknife

Discalimer: I built this since I needed this functionality and a few other things.

Upvotes: 0

Nick Palmer
Nick Palmer

Reputation: 2753

There is NOW a way if you are on github, and you are willing to run a quick github action to tickle CircleCI. The action is pretty quick so doesn't consume much github actions time.

Setup an action by saving the following in .github/workflows/main.yml

name: CI

# Controls when the action will run. Triggers the workflow on push or pull request
# events but only for the master branch
on:
  pull_request:
    types: [opened,reopened]

# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
  # This workflow contains a single job called "build"
  build:
    # The type of runner that the job will run on
    runs-on: ubuntu-latest

    # Steps represent a sequence of tasks that will be executed as part of the job
    steps:
    - name: Tickle CircleCI
      env:
        CIRCLE_BRANCH: ${{ github.head_ref }}
        CIRCLE_TOKEN: ${{ secrets.CIRCLE_TOKEN }}
      run: |
        curl -X POST \
        -H "Circle-Token: ${CIRCLE_TOKEN}" \
        -H 'Content-Type: application/json' \
        -H 'Accept: application/json' \
        -d "{\"branch\":\"${CIRCLE_BRANCH}\"}" \
        https://circleci.com/api/v2/project/<project_slug>/pipeline

Replace <project_slug> with the slug for your project which is gh/<repo_owner>/<repo_name>.

Now go setup a token in CircleCI and add it to secrets in github actions as CIRCLE_TOKEN.

Next add a step to your .circleci/config.yml in any job you want to be conditionally run as the very first step. We always run tests on master so this takes that into account. Feel free to adjust to your needs.

      - run:
          name: Check for PR or master
          command: |
            if [ -z "$CIRCLE_PULL_REQUEST" ]; then
              if [ "$CIRCLE_BRANCH" != "master" ]; then
                echo "Not a PR or master, halting"
                circleci step halt
              fi
            fi

If a PR is not open a job will run on CircleCI and then immediately stop. This isn't super expensive in terms of CircleCI time either, so overall this lets us run all commits to master and anything in an open PR for reasonable cost.

When you open a PR the github action will run and trigger CircleCI to rerun but since a PR is now open it will run completely.

The one downside to this approach is that you WILL get a green check on commits run before the PR is open indicating tests passed but they did not, however as soon as the github action runs the last commit, the one you care about, will change back to yellow as CircleCI reruns the job.

Future commits are run only by CircleCI and the github action does not run at all costing you nothing in github actions once the PR is open.

Upvotes: 6

Related Questions