diff --git a/git-hooks/README.md b/git-hooks/README.md new file mode 100644 index 000000000..aaca2da08 --- /dev/null +++ b/git-hooks/README.md @@ -0,0 +1,64 @@ +# Git Hooks + +This document aims to guide you through the benefits and utilities of implementing Git Hooks in your +development workflow + +## Introduction + +Git hooks are scripts that Git executes before or after events such as `commit` or `push`. This +document discusses the benefits of using a `push` hook for Fleet Developers. + +## Benefits + +### Reduced Waiting Time + +Imagine pushing a commit and then realizing that there was a minor issue (ie. `make +lint-go`), forcing you to restart the entire CI process, including tests that can take up to +~30 minutes to +complete + +### Streamlined Workflow + +Reduce the feedback loop and aid rapid development + +### Saving CI Resources + +By reducing the number of failed builds, you free up CI resources for other tasks + +## Getting Started + +1. Copy the `pre-push` to your fleet repo hooks directory + + ```bash + cp ./git-hooks/backend/setup/pre-push ./.git/hooks/ + chmod +x ./.git/hooks/pre-push + ``` + +2. Edit the `pre-push` file and specify the scripts you want to run. Filenames must match scripts in the +`./git-hooks/backend/hooks/` directory. This also specifies the order they run. + + ```bash + declare -a USED_HOOKS=( + "compile-go" + "db-schema" + "lint-go" + ) + ``` + +## Contributing + +All related code is located in the `./git-hooks` directory + +Scripts in the `hooks/` directory need to exit a non-zero code in order to fail properly. These +scripts do not need to be executable because we are calling it from the `pre-push` script as `bash +$SCRIPT_NAME` + +Make sure you promote your changes in Slack! + + +## Contributing Ideas + +- Update/Add a script to the `hooks` directory +- Build out `./git-hooks/frontend/` +- ?????? + diff --git a/git-hooks/backend/hooks/compile-go b/git-hooks/backend/hooks/compile-go new file mode 100644 index 000000000..1fd9226d2 --- /dev/null +++ b/git-hooks/backend/hooks/compile-go @@ -0,0 +1,3 @@ +#!/bin/bash + +make \ No newline at end of file diff --git a/git-hooks/backend/hooks/db-schema b/git-hooks/backend/hooks/db-schema new file mode 100644 index 000000000..a8d23fba9 --- /dev/null +++ b/git-hooks/backend/hooks/db-schema @@ -0,0 +1,11 @@ +#!/bin/bash + +## DB Schema Dump +if [[ $DB_SCHEMA_DUMP ]]; then + make dump-test-schema + if [[ $(git diff server/datastore/mysql/schema.sql) ]]; then + echo "❌ fail: uncommited changes in schema.sql" + echo "please run `make dump-test-schema` and commit the changes" + exit 1 + fi +fi \ No newline at end of file diff --git a/git-hooks/backend/hooks/lint-go b/git-hooks/backend/hooks/lint-go new file mode 100644 index 000000000..898c3251c --- /dev/null +++ b/git-hooks/backend/hooks/lint-go @@ -0,0 +1,3 @@ +#!/bin/bash + +make lint-go \ No newline at end of file diff --git a/git-hooks/backend/setup/pre-push b/git-hooks/backend/setup/pre-push new file mode 100755 index 000000000..ba0e3362f --- /dev/null +++ b/git-hooks/backend/setup/pre-push @@ -0,0 +1,32 @@ +#!/bin/bash + +# Move this file to the .git/hooks directory of the project + +# Define the directory containing the hooks +HOOK_DIRECTORY="./git-hooks/backend/hooks" + +# Define the list of hooks you want to execute +declare -a USED_HOOKS=( + "compile-go" + "db-schema" + "lint-go" + ) + +# Iterate over all files in the directory +for SCRIPT in "$HOOK_DIRECTORY"/*; do + # Extract just the filename from the path + FILENAME=$(basename "$SCRIPT") + + # Check if the filename is in the list + for TARGET in "${USED_HOOKS[@]}"; do + if [[ "$FILENAME" == "$TARGET" ]]; then + # Execute the script, even if it doesn't have execute permissions + bash "$SCRIPT" + if [[ $? -ne 0 ]]; then + # Exit if script fails + exit 1 + fi + break # Break inner loop since script was found and executed + fi + done +done \ No newline at end of file