자바스크립트를 활성화 해주세요

p054 Githooks Pre-Commit으로 Powershell Script검사하기

 ·  ☕ 3 min read

git 자동처리안

git에서 어떤 엑션이 일어나면, 그 이벤트를 처리하게 하는 방법으로 크게 3가지 방법이 있는 것 같습니다.

  • githooks
  • webhook
  • CI runner

githooks

기본적으로 개발자의 환경에서 git commit 이라던지, git push등을 수행할 때의 이벤트를 처리하게 하는 방법입니다. .git 디렉토리 안에 Hooks 디렉토리게 있는데 이 안에 스크립트 파일을 만들어 두는 방법입니다.

webhook

github이나 gitlab등에 merge등이 발생했을 때, 어떤 url을 실행하도록 설정할 수 있습니다. API라면 powershell의 podeserver등을 사용하여 만드는 방법도 있습니다.

CI runner

webhook는 github이나 gitlab서버가 알 수 있는 (접근할 수 있는) endpoint가 필요합니다만, API를 만들기가 곤란한 경우, 또는 굉장히 복잡한 처리를 해야하는 경우에는 해당 repository가 제공하는 runner를 실행함으로써 이벤트 수행을 할 수 있습니다.

벤더 고유의 매우 세부적인 설정작업이 필요하므로 자주 사용하지는 않지만, git과 연동하는 고급 서비스를 만든다면 이를 활용해야 할 것 같습니다.

githooks

.git 디렉토리 아래에는 Hooks 라는 디렉토리가 있는데, 특정 action이 수행된 다음에 실행되는 스크립트 파일들이 있습니다. 이를 이용하여 여러가지 액션을 연동시키는 것이 가능한데, 가장 기본적으로든

  • python에서 80컬럼까지만 사용하는 python언어의 경우 포맷을 맞추게 한다던지,
  • 스크립트파일의 경우 error가 있는 지 검사한다거나,
  • push한 후에 어떤 api를 호출한다던지
    하는 것들이 있습니다.

제게도 한동안 githooks와 연동하여 Lint나 Syntax Error를 검사하곤 하다가도, IDE를 연동해 사용하면 중복되거나, 충돌하는 경우가 있어서 또 사용하지 않다가 하곤 했습니다.

이번 포스트는 powershell의 PSScriptAnalyzer를 이용해서 commit하기 전에 변경된 파일들을 검사하도록 합니다.

githooks 스크립트는 .git 의 아래에 존재하기 때문에, 커밋할 수가 없기 때문에, 이 설정을 사용하도록 강제하는 것이 불가능합니다. 따로 wiki라던지 방법을 공유해 각자 설정하도록 하는 것이 우선은 최선인 것 같습니다. (모두 같은 IDE를 사용하지 않는 한.)

윈도우즈에서 hooks 디렉토리의 내용은 다음과 같습니다.

p054_hooks_directory.png

이중에 이번 포스트에서 작업할 것은 두가지, 다음 파일입니다.

  • pre-commit
  • pre-commit.ps1

pre-commit

파일의 내용은 다음과 같습니다.

#!/bin/sh
c:/Windows/System32/WindowsPowerShell/v1.0/powershell.exe -ExecutionPolicy RemoteSigned -Command '.git\hooks\pre-commit.ps1'
  • shebang의 인터프리터가 정확한 path가 아니더라도 작동합니다.
  • linux의 pwsh이라면 경로를 수정하시면 됩니다.

pre-commit.ps1

기본적인 아이디어는 변경된 파일을 찾아서 검사하도록 합니다. 만일 문제가 있다면 exit 1을 함으로써 commit동작을 중지 시킵니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
write-output "This is a pre-commit powershell call"
write-output "======================================="

Import-Module -Name PSScriptAnalyzer

$changes = git diff --name-only
$output = @()

foreach ($change in $changes)
{
    write-output "Running ScriptAnalyzer against: $change"
    $winPath = $change.replace("/", "\")
    $winPath = ".\$winPath"
    $out = Invoke-ScriptAnalyzer -Path $winPath -Severity Error
    $output += $out
}

write-output "======================================="
$output.Count
if ($output.Count -ne 0)
{
    Write-Output "Basic scripting errors were found in updated scripts. fix or use git commit –no-verify"
    $output.Message
    exit 1
}

-Severity Error 를 붙이는 것은 문법에러만 표시하기 위해서 입니다. Write-Host가 경고를 내도록 되어 있어서 이를 회피하는 방법을 찾고 있었습니다만, 가장 손쉬운 솔루션은 이 옵션을 사용하는 것이었습니다.

시험삼아서 하나의 파일을 commit 해보도록 합니다.

test.ps1

1
2
3
4
5
6
7
8
function myfunction  {
    param (
        [string]$text
    )
 
    [int]$test
    Write-Host "You wrote: $text ."
}

커밋하면 다음과 같이 powershell script가 실행된 것을 확인할 수 있습니다.

p054_hooks_commit.png

기타 활용안

  • headless CMS인 hugo를 사용한다면, md파일을 push하고 난 뒤에 통계치를 보이도록 하는 것도 좋은 이아디어라고 생각합니다.

reference

공유하기

tkim
글쓴이
tkim
Software Engineer