From Travis CI to GitHub Actions

GitHub Actions logo

You’ll know why I’m migrating from Travis CI to GitHub Actions.

I was happy with Travis CI but I needed one feature

Travis CI

Cost for open source repositories

When you’ve not validated with Travis CI about your open source repository, you don’t have OSS only credits. In that case, you’re using the 10000 credits included with the Free plan.

At this time, I’m near 44% used this month so it’s a moderate usage and my biggest repository (aiokafka) doesn’t use Travis CI but GitHub Actions otherwise I’ll be out of credits.

Very slow… cost more credits

It’s not a joke but reality…

On my latex-builder, my latex build (executing the shell script) is:

  • Travis CI: 271.96 seconds
  • GitHub Actions: 3 minutes 27 seconds so 207 seconds

I win 64.96 seconds, it’s good… Remember that 1 minute of a run is 10 credits on Travis CI.

GitHub Actions

GitHub loves Open Source repositories

Unlimited builds for open source repositories and I love it, aiokafka has a cost of 0.

My two latest builds are:

  • main: 22 minutes 35 seconds
  • develop: 16 minutes 23 seconds

A lot of time because tests include Linux, Mac, and Windows…


GitHub Actions has a runner available to install on all operating systems to send jobs to self-hosted hardware and it was the ultimate thing to invite me to migrate.

The only counterpart is a requirement, this f*cking Docker daemon. I needed to find the right host to install it because I use, exclusively, Podman.

Look at the change

Let’s look at how it’s a lot different between Travis CI and GitHub Actions on a private repo (my CV).

Travis CI (old CI)

language: minimal
dist: focal

  quiet: true

services: docker

    update: true
      - rclone

  - mkdir -p ~/.config/rclone
  - echo $rclone_b64 | base64 -d > ~/.config/rclone/rclone.conf
  - docker pull

  - docker run --rm -v $TRAVIS_BUILD_DIR:/shared -v /tmp:/tmp

  - bash -c "rclone copy /tmp/build_cv/cv-en.pdf $objstore:"

GitHub Actions (new CI)

name: ci
      - main

    runs-on: [self-hosted, Linux, oraclecloud]
      - name: Checkout
        uses: actions/checkout@v2
      - name: Install rclone config file
          rconf: ${{ secrets.RCLONE_CONF }}
        run: |
          echo "$rconf" | base64 -d > /rclone.conf
      - name: Build
        run: ./
      - name: Send pdf to objstore
          objstore: ${{ secrets.S3 }}
        run: "rclone --config /rclone.conf copy /tmp/build_cv/cv-en.pdf $objstore:"

I run it on one self-hosted runner, Linux host, and hosted at Oracle Cloud (I added this label to remember where it hosted the VM).

Another point, I can run directly all my steps inside my container and it’s a lot more interesting than doing a docker run followed by a lot of docker exec for another repo.

No pain, no gain!