Automatic ansible-lint with Github Actions
Tags: ansible, github
Published: 2019-11-09 15:45:45

Now my account has access to [Github Actions](https://github.com/features/actions) beta so I am trying to use it for syntax check and run ansible-lint for my Ansible playbook repository.
This article is based on the specification of Github Actions on 7th Sep 2019.

## Configuration

I referred to the official doc for setting up.
https://help.github.com/en/categories/automating-your-workflow-with-github-actions
  
### Until the first run

This time I use my repository which has Ansible Playbook to set up my MacBook.
{% github koh-sh/macbook-playbook %}


Clicking Actions tab which is newly added.
![Alt Text](https://thepracticaldev.s3.amazonaws.com/i/3jwfpoxl5n4h12na6cko.png)

You can use many templates of workflow provided by Github and I am using `python package`.
After clicking the template, you can modify the workflow template for your repo.
I edited the file like below. (I also changed the name of the file too)

```
name: Ansible lint

  on: [push]

  jobs:
   build:

      runs-on: macOS-latest
     strategy:
       max-parallel: 4
       matrix:
         python-version: [2.7, 3.5, 3.6, 3.7]

      steps:
     - uses: actions/checkout@v1
     - name: Set up Python ${{ matrix.python-version }}
       uses: actions/setup-python@v1
       with:
         python-version: ${{ matrix.python-version }}
     - name: Install dependencies
       run: |
         python -m pip install --upgrade pip
         pip install ansible ansible-lint
     - name: Lint playbook
       run: |
         ansible-playbook site.yml --syntax-check
         ansible-lint site.yml
```

The Playbook is for macOS, so I changed `runs-on` to macOS-latest.  
Below tasks are supposed to run.

- Install ansible and ansible-lint with pip
- run ansible-playbook with --syntax-check option
- run ansible-lint

After committing this file, tests were run automatically.  
You can see the result at Actions tab.
![Alt Text](https://thepracticaldev.s3.amazonaws.com/i/7j5ezx84xg73n8sfoatf.png)

https://github.com/koh-sh/macbook-playbook/commit/3daeb98a056981335938e74c530ebb5f6ae1f6e3/checks

The number of `python-version` is 4 and `max-parallel` is 4 too so 4 tests were run concurrently.
You can refer to the official doc about the limit of resources.
https://help.github.com/en/articles/workflow-syntax-for-github-actions#usage-limits

You can click each version of builds for details.
This time ansible-lint threw some errors so the status is failed.

### Until test success

ansible-lint threw errors so fixing with this commit.
Removing trailing space and omit the error about shell modules with .ansible-lint file as I needed them.

https://github.com/koh-sh/macbook-playbook/commit/577519c6213c4a1e7a3c047808ef146ca2d67f86

I pushed to the master branch and the tests run automatically.  
![Alt Text](https://thepracticaldev.s3.amazonaws.com/i/kgbmxhvesjgnz1dk3qo2.png)

https://github.com/koh-sh/macbook-playbook/commit/577519c6213c4a1e7a3c047808ef146ca2d67f86/checks

Tests are completed without problems.
![Alt Text](https://thepracticaldev.s3.amazonaws.com/i/xmv68ix5hp917rzxn5w7.png)

Also, you can see the results of tests for each commit with symbols.

### Trying Pull Requests

How about pull requests?
Let's see how they work.
{% github https://github.com/koh-sh/macbook-playbook/pull/1 %}

By opening a pull request, tests run automatically and the results are available at PR summary.
![Alt Text](https://thepracticaldev.s3.amazonaws.com/i/cr65dm0pm3kwxpsljfyd.png)

And this repository is integrated into my slack workspace and the result was notified too.
https://slack.github.com 

![Alt Text](https://thepracticaldev.s3.amazonaws.com/i/uhyegnl7oympon5sogtd.png)
But when I pushed to master, the test result was not notified.
Another setting might be necessary but I haven't checked yet.

### Testing with multiple version of Ansible

Currently, these tests are run with the latest version of Ansible and 4 versions of python.
Let's change it to 2.7.x, 2.8.x of Ansible and 2.x and 3.x of python matrix.

I modified the workflow file as below.

```
name: Ansible lint

on: [push]

jobs:
  build:

    runs-on: macOS-latest
    strategy:
      max-parallel: 4
      matrix:
        python-version: [2.7, 3.7]
        ansible-version: [2.7.13, 2.8.4]

    steps:
    - uses: actions/checkout@v1
    - name: Set up Python ${{ matrix.python-version }}
      uses: actions/setup-python@v1
      with:
        python-version: ${{ matrix.python-version }}
    - name: Install Ansible ${{ matrix.ansible-version }}
      run: |
        python -m pip install --upgrade pip
        pip install ansible-lint ansible==${{ matrix.ansible-version }}
    - name: Lint playbook
      run: |
        ansible-playbook site.yml --syntax-check
        ansible-lint site.yml

```

After a push, the test setting was updated and run as I intended.
![Alt Text](https://thepracticaldev.s3.amazonaws.com/i/3r8irds6o0cokepf7rvk.png)

https://github.com/koh-sh/macbook-playbook/commit/0ffab4e73391ab8f3d39d5c149307bab9c06714f/checks

## Conclusion

With Github Actions, I can ansible-lint automatically for each commit.
All of the settings in this article took only 1 hour since these are very simple and easy to use.
Also, Github Actions are available not only tests but also deploys too so I will keep trying them out.