Check Changed Files Helper ✔️ | GitHub Actions
Tags: actionshackathon21, opensource, github, devops
Published: 2021-12-09 03:11:06

**Need a way to automate checks on files pushed to your repository?** This handy action provides a starting template for open source maintainers to get creative and perform customised checks on individual or multiple files changed on the repository. 

---

### My Workflow

Refer to repository README for full details.
{% github funbeedev/CheckChangedFilesHelper %}

**This project relies on the [`Get Changed Files`](https://github.com/marketplace/actions/get-changed-files) Action available on the GitHub marketplace**.
This Action provides all added, renamed and modified files as a JSON file within the runner filesystem. When a file or multiple files are changed on the repo, it will identify and list each in the JSON file.

`Check Changed Files Helper` provides a means to add powerful checks for files changed on a repo by providing a bash script called by the Workflow. This script scans each changed file and performs a desired check according to the file extension type. In the examples provided in the repo, the checks are to ensure the following file types are executable: `.c .py .js .sh`.

The power of bash provides numerous possibilities on how to perform checks. A handy way to automate checks of files submitted to your repository!


### Submission Category: 
Wacky Wildcards


### Yaml File - Code to run Workflow

**What you need to use this Workflow**
The files needed to run this workflow are placed under the repo path [`.github/workflows`](https://github.com/funbeedev/CheckChangedFilesHelper/tree/main/.github/workflows). Fork this repo or copy these files to start customising for your own use.

`auto-check-changed-files.yml`: YAML file containing the GitHub Actions workflow. This will setup any necessary dependencies and use the [`Get Changed Files`](https://github.com/marketplace/actions/get-changed-files) Action to generate a JSON containing all files changed on the repository with every push to the `main` branch. Following this, the `auto-check-changed-files.sh` bash script is executed.

`auto-check-changed-files.sh`: Bash script containing custom check instructions. It scans through each changed file pushed to the repository and performs a basic execution check on each file. Edit this script to extend the recognised file types and checks to be performed.


### Additional Resources / Info
**Sample workflow checks**

All checks successful:
```
Run echo "job: running script to check changed files:"
job: running script to check changed files:
run-sh: Inside auto-check-changed-files.sh
Content of files.json: [
    "hello-world.c",
    "hello-world.js",
    "hello-world.py",
    "hello-world.sh"
]
number of files to check = 4
checking file: hello-world.c
This is a .c file, executing
Hi from hello-world.c!
checking file: hello-world.js
This is a .js file, executing
Hi from hello-world.js!
checking file: hello-world.py
This is a .py file, executing
Hi from hello-world.py!
checking file: hello-world.sh
This is a .sh file, executing
Hi from hello-world.sh!
job: Done
```

Some failed checks:
```
Run echo "job: running script to check changed files:"
job: running script to check changed files:
run-sh: Inside auto-check-changed-files.sh
Content of files.json: [
    "hello-world.c",
    "hello-world.js"
]
number of files to check = 2
checking file: hello-world.c
This is a .c file, executing
hello-world.c: In function ‘main’:
hello-world.c:14:39: error: expected ‘;’ before ‘}’ token
   14 |     printf("Hi from hello-world.c!\n")
      |                                       ^
      |                                       ;
   15 | }
      | ~                                      
checking file: hello-world.js
This is a .js file, executing
/home/runner/work/CheckChangedFilesHelper/CheckChangedFilesHelper/hello-world.js:8
console.logg("Hi from hello-world.js!");
        ^

TypeError: console.logg is not a function
    at Object.<anonymous> (/home/runner/work/CheckChangedFilesHelper/CheckChangedFilesHelper/hello-world.js:8:9)
    at Module._compile (node:internal/modules/cjs/loader:1101:14)
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1153:10)
    at Module.load (node:internal/modules/cjs/loader:981:32)
    at Function.Module._load (node:internal/modules/cjs/loader:822:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
    at node:internal/main/run_main_module:17:47
Error: Process completed with exit code 1.
```
---

**Questions, suggestions and comments are welcome!**