My favorite technology that we have used on our project is GitHub Actions. Utilizing GitHub Actions has been very useful, and has become an essential part of our workflow that we all interact with. Without these tools, our code quality standards would be much harder to enforce.
For our team, one of the most important features provided by GitHub Actions is the ability to run specific workflows on a pull request. We have specific and strict code formatting and linting guidelines, and utilize GitHub Actions to ensure a PR meets all of these requirements. The workflow checks for any changes to source code files, and if any exist runs our linting and formatting tools. If the guidelines aren’t met, the pull request is rejected. These all run utilizing a custom Docker container we built.
Initially, we used a bot to make linting and formatting recommendations, but when a developer accepted the changes, it would kick off a new workflow run for every change accepted. This was inefficient and could be costly, so we removed this feature. You can instead perform linting and formatting locally automatically (for most changes) using a Docker container. This was implemented to reduce the number of billable minutes used by our project in GitHub Actions.
Our Actions workflow also builds the project, to ensure that the code actually compiles and builds. While developers should build locally, mistakes happen and this tool has caught issues that may have been missed otherwise. I have recently implemented automated runs of a test ROM as well, which will be useful for catching any CPU opcode regressions.