Category: CI/CD

Automated checks and deployments with GitHub Actions, so every change is tested before it goes live.

  • What My First CI Pipeline Caught

    What My First CI Pipeline Caught

    After my lab was running, I put the code on GitHub and set up a CI (continuous integration) pipeline with GitHub Actions. My very first pull request failed. Here’s what happened.

    What my pipeline checks

    Every pull request automatically runs:

    • terraform fmt: is the code formatted correctly?
    • terraform validate: is the configuration valid?
    • TFLint: common Terraform mistakes
    • Checkov: a security scan of the infrastructure code
    • ansible-lint: Ansible best practices

    What failed

    All the Terraform checks passed. The last step, ansible-lint, failed with two errors like this:

    fqcn[canonical]: You should use canonical module name
    `ansible.mysql.mysql_db` instead of `community.mysql.mysql_db`.

    The MySQL modules I used have a newer official name. The linter wanted the new one.

    The decision

    The obvious fix was to rename the modules. But first I checked whether my own Ansible had the new names:

    ansible-galaxy collection list ansible.mysql

    It printed nothing. My laptop only had the older names, and that version was the one I had tested and knew worked. Renaming would have passed the linter but broken my actual deployments.

    So instead, I added the rule to my lint config as a documented exception, and kept the working code. I’ll switch to the new names once my local setup supports them.

    A second fix

    I also noticed every check ran twice: once for the push and once for the pull request. I changed the pipeline to run only on pull requests.

    The result

    All checks were successful
    0 cancelled, 0 failing, 1 successful, 1 skipped, and 0 pending checks

    What I learned

    CI didn’t just catch a problem. It made me read the log and make a real trade-off between following a rule and keeping working code.