dart 및 Lefthook를 사용하여 커밋 메시지 유효성 검사



한동안 Flutter 프로젝트를 위해 해결하려고 했던 것은 커밋 메시지의 유효성을 검사하는 것이었습니다. 처음에는 commit-msg-validate를 사용했지만 Flutter/Dart 프로젝트에서 노드 종속성을 갖는 것이 옳지 않은 것 같고 팀이 성장했을 때 나 자신을 넘어 JS로 작성한 모든 자동화 스크립트를 dart로 옮기는 작업을 했습니다. 아직 몇 개의 노드 종속성이 남아 있지만 순전히 CI 파이프라인에서 사용하기 위한 것입니다.

팀 전체에서 git-hooks를 실행하기 위해 프로젝트에 Lefthook을 추가하고 처음에는 테스트 스크립트를 실행하기 위해 pre-push만 사용했지만 최근에서야 commit-msg 후크를 실행하는 방법에 대한 아이디어를 얻었습니다.

후크



커밋 메시지가 ./git 폴더 내의 일반 텍스트 파일 COMMIT_EDITMSG에 저장되어 있다는 것을 알았습니다. Dart 내에서 문자열로 쉽게 읽을 수 있습니다.

나는 나중에 Lefthook에서 실행할 수 있는 commit_message.dart 파일이 있는 git_hook 폴더를 추가했습니다.

우리 프로젝트 내에서 현재 많은 사람들이 시맨틱 커밋 메시지 접근 방식을 따르고 있다고 생각합니다. 이에 대해 자세히 읽을 수 있습니다HERE.

커밋 메시지 파일은 다음과 같습니다.

_import_ 'dart:io';

_dynamic_ main() {
_final_ rootDir = Directory._current_;
_final_ commitFile = File(rootDir.path + "/.git/COMMIT\_EDITMSG");
_final_ commitMessage = commitFile.readAsStringSync();

_final_ regExp = RegExp(
    r'(fix|feat|wip|none|chore|refactor|doc|style|test)\(\w+\):\s?(\[\DEV-\d+])?.+',
  );

_final_ valid = regExp.hasMatch(commitMessage);
_if_ (!valid) exitCode = 1;
}


그것을 분해하자




_final_ rootDir = Directory._current_;
_final_ commitFile = File(rootDir.path + "/.git/COMMIT\_EDITMSG");
_final_ commitMessage = commitFile.readAsStringSync();


처음 몇 줄은 매우 간단합니다. 여기서는 현재 디렉토리를 가져오고 COMMIT_EDITMSG에 대한 파일 참조를 생성한 다음 다음 정규식으로 유효성을 검사할 수 있는 문자열까지 읽습니다.

_final_ regExp = RegExp(
    r'(fix|feat|wip|none|chore|refactor|doc|style|test)\(\w+\):\s?(\[\DEV-\d+])?.+',
  );


이는 접두사로 시작하는 커밋 메시지 형식의 유효성을 검사하며 버전 번호와 변경 로그를 생성하는 데 사용되는 자동화 스크립트에 가장 중요합니다.

표현식




(fix|feat|wip|none|chore|refactor|doc|style|test)


각 메시지는 위의 문자열 중 하나로 시작해야 하며 그 후에 범위가 있습니다.

\(\w+\)


이것은 일반적으로 변경이 발생하는 위치에 대한 작은 컨텍스트를 제공하기 위해 모듈 또는 기능 참조로 사용됩니다.

그런 다음 선택적 공간과 Jira 티켓 참조가 있고 모든 Jira 문제는 DEV에서 시작됩니다.

\s?(\[\DEV-\d+])


마지막으로 그 이후의 모든 캐릭터는

.+


우리의 경우 유효한 커밋 메시지는 다음과 같습니다.

feat(video): [DEV-1223] added support for leading text
feat(video): added support for leading text


검증



그런 다음 다음을 사용하여 정규 표현식에 대해 커밋 메시지를 검증할 수 있습니다.

_final_ valid = regExp.hasMatch(commitMessage);
_if_ (!valid) exitCode = 1;


유효하지 않은 경우 단순히 exitCode를 1로 설정합니다. 0 이외의 모든 것은 오류이며, 이는 스크립트를 종료하고 잘못된 메시지로 커밋하는 것을 방지합니다.

Lefthook에 추가



이제 스크립트가 완성되었으므로 Lefthook을 업데이트하여 우리 중 한 명이 git 커밋을 시도할 때마다 이 스크립트를 실행할 수 있습니다.

commit-msg:
  commands:
    validate:
      run: flutter pub run ./git\_hooks/commit\_message.dart


위의 스니펫을 lefthook.yaml에 추가한 후 lefthook install을 실행하여 후크를 활성화하기만 하면 됩니다.

Lefthook v0.7.2
RUNNING HOOKS GROUP: commit-msg

EXECUTE > validate
The message: none(lefthook): added commit validation

SUMMARY: (done in 1.13 seconds)
✔️ validate


모든 것이 제대로 작동했다면 다음 커밋 후 메시지가 필수 형식을 충족한다고 가정하면 위의 메시지와 유사한 메시지가 표시되어야 합니다.

이 내용이 흥미로웠기를 바랍니다. 질문, 의견 또는 개선 사항이 있으면 언제든지 의견을 남겨주세요.

읽어 주셔서 감사합니다.
  • Improving User Experience through simple OTA updates in flutter


  • About Wyzetalk

    Founded in South Africa and headquartered in The Netherlands, Wyzetalk is a leading global employee experience company that offers a mobile-first digital solution connecting large organisations with their dispersed, frontline workforce to improve communication, unleash innovation, and boost business performance. Since launching in 2012, the company has grown in revenue by more than 100% per annum. With a presence in 18 countries across five continents, today there are 650 000 employees making use of the Wyzetalk platform through clients in the Mining, Retail, FMCG, Manufacturing, Energy, Automotive and Shipping sectors.

    Website: https://www.wyzetalk.com/

    좋은 웹페이지 즐겨찾기