The Linux community, and the open-source community in general, was up in arms last month as Microsoft announced a purchase of Github. For many reasons, which I am not going to detail here, I agree with the general concern and outrage over this. Due to this, I have migrated all my repos from Github (where I was a paying member) to Gitlab. The migration itself is dead easy, but with this migration you lose access to other tools. This mainly impacted me with the loss of CircleCI. Enter Gitlab runners!

One of the more interesting features of Gitlab is that they have their own continuous integration engine built into the platform. I took some time and got this working with my blog, which frankly was pretty easy. If you have worked with CircleCI before than you will instantly feel at home with the runners as the syntax is very similar. Below is the yaml for this site:

stages:
  - build
  - deploy

build:
  image: docker:latest
  services: 
    - docker:dind
  stage: build
  script:
    - docker login -u $DOCKER_LOGIN -p $DOCKER_PASSWORD
    - docker build -t binaryronin/website .
    - docker push binaryronin/website:latest
  only:
    - master

deploy:
  image: binaryronin/debian-openssh
  before_script:
    - 'which ssh-agent || (apt-get update -y && apt-get install openssh-client -y)'
    - eval $(ssh-agent -s)
    - mkdir -p ~/.ssh
    - echo "$DEPLOY_KEY" > ~/.ssh/id_rsa_deploy
    - chmod -R 700 ~/.ssh
  stage: deploy
  script:
    - ssh -i ~/.ssh/id_rsa_deploy -o StrictHostKeyChecking=no user@binaryronin.io /home/user/deploy.sh
  only:
    - master

You can see it has two distinct stages, build and deploy, with the build stage building and pushing the image, and the deploy stage sshing into the server and running my deploy script. Dead simple. Even has support for private variables, which I use for the Dockerhub login and the SSH key. The only thing I had to do was create a basic Debian container that had OpenSSH installed for the connection to work properly. This is available on my Docker hub if anyone else wants to use it.