Да ли сте икада случајно гурали тајне у складиште? или можда сте гурали неформатирани код, само да бисте морали да креирате накнадни "линтинг" компромис?Сви смо били тамо.Ове мале грешке могу довести до неуспелих ЦИ / ЦД цевовода и фрустрирајућих кашњења, све због провера које би могле бити покренуте локално.
Git hooks su moćan alat za sprečavanje ovih problema tako što ćete pokrenuti skripte pre nego što preuzmete odgovornost ili pritisnete.
Pre-commit је једноставан за коришћење оквир за управљање и дељење вишејезичних гит хакова, помажући вам да ухватите проблеме пре него што чак и напусте вашу радну станицу.
Početak: Pravo postavljanje
Pre nego što možete da iskoristite moć pre-komitovanja, morate da je instalirate i konfigurišete za svoje projekte.
инсталација
Постоји неколико начина да инсталирате пре-коммит:
- macOS и Linux:
brew install pre-commit
- Питон / Пип (преко платформе):
pip install pre-commit
- Остале методе: За инсталације користећи Цонда или на Виндовсу, молимо погледајте Службену документацију.
Специфично подешавање пројекта (Стандардни начин)
Ово је најчешћи приступ за омогућавање претходног ангажовања у одређеном пројекту:
-
Create a Configuration File: In the root of your repository, create a file named
.pre-commit-config.yaml
. This file will define the hooks pre-commit should run. (We’ll cover how to populate this file in the next section).
-
Install Hooks: Navigate to your repository’s root directory in your terminal and run:
pre-commit install
- Ова команда инсталира гит хаоке у .гит/хаокс директоријуму вашег репозиторија. Од сада, пре-коммит ће аутоматски покренути своје провере пре сваког коммиса који направите у овом одређеном репозиторијуму.
Глобално подешавање (метод "Подесите га и заборавите га")
Ако често покрећете нове пројекте или клонирате репозиторије и желите да пре-задатак буде активан подразумевано (ако постоји конфигурација), можете га поставити глобално.init.templateDir
Функција је
-
A Configuration File: All your repository must have a
.pre-commit-config.yaml
. This file will define the hooks that pre-commit should run. The best would be to use a template repository with a minimal pre-commit file.
-
Configure Git’s Template Directory: Tell Git to use a specific directory as a template for new repositories:
git config --global init.templateDir ~/.git-template
(Можете да изаберете другачији директоријум ако желите, само се уверите да је конзистентан у следећем кораку.)
Инициализирајте Пре-коммит у директоријуму шаблона: Покрените следећу команду:
pre-commit init-templatedir ~/.git-template
(Ако сте изабрали другачији директоријум у претходном кораку, замените~/.git-template
U skladu sa tim.)
Ово има велику предност: Са овим глобалним подешавањем, било који нови репозиториј који иницијализујете (git init
) или ће клон аутоматски имати инсталиран прикључак за пре-комитет..pre-commit-config.yaml
датотеке, пре-задатак једноставно неће учинити ништа, тако да је сигурно омогућити глобално.
Ипак, волим да идем још један корак додавањем подразумеваног кука~/.git-template/hooks/pre-commit
sistematski ne bi uspelo ako repozitorijum ne bi imao.pre-commit-config.yaml
Ево садржаја хоука.
#!/usr/bin/env bash
if [ -f .pre-commit-config.yaml ]; then
echo 'pre-commit configuration detected, but `pre-commit install` was never run' 1>&2
exit 1
fi
Изградња ваше конфигурације (.pre-commit-config.yaml)
Srce predkomiteja je.pre-commit-config.yaml
Ова датотека, постављена на корен вашег репозиторија, говори пре-коммит који проверава да се покрене.
# https://github.com/xNok/infra-bootstrap-tools/blob/main/.pre-commit-config.yaml
repos:
# Lint all yam files
- repo: https://github.com/adrienverge/yamllint.git
rev: v1.29.0
hooks:
- id: yamllint
# Runs Ansible lint
- repo: https://github.com/ansible/ansible-lint
rev: v24.7.0
hooks:
- id: ansible-lint
args:
- "ansible"
additional_dependencies:
- ansible
Основна структура објашњена
Типична конфигурација укључује листу репозиторија, од којих свака има одређене хакове:
- Репо: Ово је кључ на највишем нивоу који узима листу мапирања репозиторија. Свака ставка на листи одређује Гит репозиторијум који садржи пре-коммит хакове.
- Репо: УРЛ репозиторијума који хостује хакове (нпр. https://github.com/pre-commit/pre-commit-hooks). Ово је веома леп начин за управљање зависностима. Када знате више о алату, можете ићи у репозиторијум.
- рев: Она одређује верзију прикључака које треба користити, пинтинг на или Гит таг, СХА, или грана. али препоручује се да увек користите одређену ознаку или СХА (не грана попут мајстора) како бисте осигурали да ваш линтинг не неочекивано прекине када даљински репозиторијум ажурира.
- куки: Листа испод сваког репо уноса.Свака ставка овде дефинише одређени кук за употребу из тог репозиторија.
- id: Јединствени идентификатор кука (нпр. trailing-whitespace, check-yaml). Можете пронаћи доступне идентификаторе кука у документацији за складиштење кука. или једноставно .pre-commit-hooks.yaml на корену репо-а.
Практична почетна конфигурација
Ево једног основног.pre-commit-config.yaml
Za ovaj primer, savetujem vam da idete na GitHub i pogledatepre-commit
Тим је имплементирао, и где можете наћиid
од сваког од релевантних хаоса које можда желите користити.
Rekao bihtrailing-whitespace
иend-of-file-fixer
заиста корисни, тако да ће конфигурација изгледати овако.
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.6.0 # Check for the latest stable version on the pre-commit-hooks repo!
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
# Add other repositories and their specific hooks below
# - repo: ...
# rev: ...
# hooks:
# - id: ...
Напомена: Верзије за куке се мењају током времена. Добро је повремено провераватиpre-commit-hooks
репозиторијум (или било који други репозиторијум за причвршћивање који користите) за најновију ознаку стабилне верзије иrev
Или имати аутоматизацију на месту, као што је Реновате или Депендабот, да бисте их редовно ажурирали.
Можете наћи велику листу претходно постојећих хакова на.pre-commit-hooks.yaml
Погледајте да ли су хокеји доступни.
Добро је знати када користити пре-коммит
Jednom kada ste udobni sa osnovama, pre-komit nudi naprednije funkcije za fino podešavanje vašeg toka posla.
Ручно покретање хокеја
Док хоокс ради аутоматски наgit commit
, можда ћете желети да их покренете ручно у другим временима:
- Покрените одређени кук: Да бисте извршили један кук (нпр. да бисте тестирали његову конфигурацију или применили његове промене без обавеза), користите:
pre-commit run <hook_id>
Замена<hook_id>
са стварним ИД-ом из ваше конфигурационе датотеке.)
- Покрените све датотеке: Да бисте покренули све конфигурисане хакове преко сваке праћене датотеке у вашем репозиторијуму (не само фазиране промене), користите:
pre-commit run --all-files
Ово је корисно за почетно чишћење или приликом додавања нових кукова у постојећи пројекат.
Креирање сопствених локалних кукова
Ponekad možete da koristite skripte ili kontrole specifične za projekat koji nisu deo javnog skladišta konice. Pre-commit vam omogućava da definišete „lokalne“ konice.
- Напишите свој скрипт: Креирајте свој скрипт (нпр. скрипт за шкољку, Питон скрипт) у свом репозиторијуму. За овај пример, рецимо да сте креирали my_custom_script.sh.
- Дефинишите у .pre-commit-config.yaml: Додајте локални улаз за прикључак у вашу конфигурацију:
# .pre-commit-config.yaml
- repo: local
hooks:
- id: my-custom-check
name: My custom check
entry: ./my_custom_script.sh # Path to your script
language: script # Or python, node, etc.
files: \.(py)$ # Example: regex to run only on Python files
# verbose: true # Uncomment for more output
# args: [--custom-arg] # Optional arguments for your script
Ovo govori pre-komit da trčimy_custom_script.sh
за све промене у Питону (.py
датотеке, то јеlanguage: script
Тип је веома флексибилан; за специфична окружења као што су Пајтон или Ноде, можете одредити оне за управљање зависностима ако је потребно.bash
Hooks je.
Ipak, pre-komit je veoma pametan kada je u pitanju radno okruženje, jer stvara izolovano okruženje za radno vreme za alate i potrebne zavisnosti.
Нису сви кукови, нажалост, искористили функцију зависности, а можда ћете морати сами да инсталирате алате како бисте могли да покренете куку (мислим на терраформ, на пример)
Претходно посвећеност у тиму и ЦИ / ЦД окружењу
Док пре-коммит сјаји на појединачним програмерским машинама, његове предности се множе када се интегришу у тимске радне токове и ЦИ / ЦД цеви. Чак и са локално инсталираним пре-коммит куковима, неко може случајно да се ангажује без кукова (нпр.git commit --no-verify
) или имају застарелу конфигурацију кука. Ваш ЦИ / ЦД цевовод може да делује као крајњи врата.
Vođenjem kontrola pre preuzimanja obaveza u vašem CI kanalu, osiguravate da se kod koji krši standarde vašeg projekta ne spaja.
pre-commit run --all-files
Ова команда проверава све датотеке у репозиторијуму, а не само оне које су промењене, осигуравајући свеобухватну валидацију.
Концептуални корак ЦИ цевовода (нпр. ГитХуб акције):
# Example for a GitHub Actions workflow
# ... (other steps like checkout, setup python/node, etc.)
- name: Install pre-commit and dependencies
run: |
pip install pre-commit
# Install any other dependencies your hooks might need (e.g., linters)
# This might be minimal if your hooks install their own dependencies (common).
- name: Run pre-commit checks
run: pre-commit run --all-files
Лепо је имати концептуални цевовод који ради са било којим ЦИ системом, али ако користите ГитХуб акције, не морате се бринути; користитеЗванична акција.
jobs:
pre-commit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v3
- uses: pre-commit/action@v3.0.1
Са интеграцијом ЦИ, петља је завршена, а иста валидација се примењује у окружењу програмера као у окружењу ЦИ.
Закључак
Остваривање тамоimaда буде бољи начин од ручних провера и "оопс" обавеза, истражили смо како јеpre-commit
Transformirajte svoj razvojni tok posla.
Аутоматизацијом провера за све од грешака белог простора и тајног откривања до форматирања кода и линтинг-а, пре-коммит делује као ваш неуморни локални чувар квалитета кода који се чак може "бесмислено" интегрисати у ЦИ / ЦД цеви како би служио као коначна врата квалитета.