본문 바로가기
Coding

변경 로그를 만들고 업데이트하기 위해 Bash 스크립트를 작성하는 방법

by Emily Blunt 2022. 4. 21.
반응형

변경 로그를 만들고 업데이트하기 위해 Bash 스크립트를 작성하는 방법

 

더 이상 생성기, 로그 또는 종속성이 없습니다.

Unsplash의 Christopher Gower 사진

변경 로그는 다른 기여자와 사용자에게 프로젝트에 어떤 업데이트가 수행되었는지, 언제 업데이트가 수반되는지를 보여주는 유용한 도구입니다. 변경 로그를 유지하는 것이 지루하거나 시간이 많이 걸린다고 생각할 수도 있지만 장기적으로 더 많은 정보를 제공하고 책임을 개선할 수 있습니다.

즉, 가능하다면 변경 로그에 소요되는 시간을 줄이는 것이 좋습니다. 이것이 내가 내 변경 로그를 만들고 업데이트하기 위한 나만의 bash 스크립트를 만들 때 하고 싶었던 것입니다.

변경 로그를 생성하는 몇 가지 기존 방법이 있지만 명확성 측면에서 내가 찾던 것과 완전히 일치하지 않았거나(예: git 태그 지정에서 제공한 버전 번호 포함) 너무 많이 정보. 정보가 너무 많다는 것은 이러한 다른 생성 방법이 git 로그에서 모든 커밋을 가져와 본질적으로 더 조직적인 방식으로 나열한다는 것입니다.

이것은 알아두면 좋은 트릭이지만 다양한 커밋을 단순히 재구성하는 것이 아니라 보다 신중한 변경 로그를 만들고 싶었습니다.

"변경 로그 항목의 목적은 종종 여러 커밋에 걸쳐 주목할만한 차이점을 문서화하여 최종 사용자에게 명확하게 전달하는 것입니다."

— 변경 로그 유지

변경 로그

변경 로그를 생성하기 위한 자체 스크립트를 사용하면 포함된 정보와 표시 방법을 유연하게 결정할 수 있습니다. 이 포스트에서는 다음과 같은 기본 구조를 가진 변경 로그를 생성할 것입니다.

프로젝트의 변경 로그는 다음과 같아야 하는 것은 아니지만 Keep A Changelog 규칙을 따르고 압도적이지 않으면서 많은 양의 정보를 제공하기 때문에 마음에 듭니다. 변경 로그의 각 지점에는 버전 번호와 ISO 형식의 날짜가 포함됩니다. 각 아래에는 추가됨, 수정됨 및 제거됨과 같은 변경 사항과 관련된 섹션이 있습니다(이는 개인적으로 가장 많이 사용하는 변경 유형입니다). 이러한 규칙에 대한 자세한 내용은 Keep A Changlog 이니셔티브를 참조하세요.

이제 bash를 사용하여 첫 번째 Changelog를 생성해 보겠습니다.

프로젝트 디렉터리의 루트에서 변경 로그 논리에 대한 bash 셸 스크립트 파일을 만듭니다.

root:~ > touch changelog.sh

이제 쉘 스크립트 파일이 있으므로 터미널에서 이 명령을 실행하기만 하면 실행 가능하게 만들 수 있습니다.

root:changelog-script > chmod u+x changelog.sh

이 행이 하는 일은 단순히 명령행에 파일 이름을 입력하고 Enter 키를 누르고 포함된 스크립트를 실행할 수 있도록 하는 것입니다. 이제 논리 작업을 시작할 수 있습니다. 우리는 세 가지 함수를 작성할 것입니다: new_changelog, new_changelog_item그리고 init.

new_changelog()
{
echo 'new changelog'
}new_changelog_item()
{
echo 'adding changelog item'
}init()
{
echo 'initiate script'
}

스크립트의 목표는 쉘 스크립트를 실행할 때(사용자 유형 ./changelog.sh 입력)을 클릭하면 스크립트는 항목을 추가하기 전에 변경 로그를 생성해야 하는지 여부를 결정합니다. 변경 로그가 존재하지 않으면 생성한 다음 첫 번째 항목을 추가합니다. 존재하는 경우 새 변경 로그 항목을 추가하기만 하면 됩니다. 현재 버전에 대한 변경 로그 항목이 아직 존재하지 않는 경우에만 해당됩니다.

나중에 자세히 설명합니다.

먼저 중요한 변수를 초기화해 보겠습니다. changelog. 이 변수는 스크립트 상단에 있으며 이름에서 알 수 있듯이 변경 로그 파일을 참조합니다. 추가하다 changelog=CHANGELOG.md 파일 상단으로 이동합니다. 스크립트 파일에 있으면 업데이트할 수 있습니다. init 파일이 존재하는지 확인하는 함수. 그렇다면 새 항목을 추가하기만 하면 됩니다. 그렇지 않은 경우 먼저 생성한 다음 새 항목을 추가해야 합니다. 어떻게 말할 수 있습니까? 만약 우리 프로젝트에 파일이 있습니까?

우리는 구현할 수 있습니다 if 우리의 진술 init 기능.

우리가 확인할 조건은 if test -f "$changelog". 이 라인은 내장 test 파일의 속성을 테스트하고 다른 작업을 수행하는 데 사용되는 명령입니다. 그만큼 -f 연산자는 단순히 파일을 찾고 일반 파일(디렉토리 또는 외부 장치가 아님)인지 확인하도록 조건을 지시합니다. 업데이트된 내용을 살펴보겠습니다. init 이제 우리는 파일이 존재하는지 확인하는 방법을 알게 되었습니다.

init()
{
if test -f "$changelog" ; then
echo "$changelog exists."
else
echo "$changelog does not exist."
fi
}

굉장합니다. 1부가 끝났습니다. 이제 이러한 기능을 대체할 다른 기능을 작업해야 합니다. echo 윤곽. 첫 번째는 new_changelog. 우리가 해야 할 일은 파일을 만드는 것뿐이므로 최소한의 노력이 필요합니다. bash에서 어떻게 파일을 만들 수 있습니까? 그것을 위해 우리가 해야 할 일은 사용하는 것입니다. echo 그런 다음 이 반향 출력이 새 파일로 지정되어야 함을 나타냅니다. 우리는 이것을 사용하여 >, 이는 파일 설명자 리디렉션입니다. 실제로 이것을 봅시다.

new_changelog()
{
echo "here is my changelog" > CHANGELOG.md
}

그러면 프로젝트 디렉토리에 변경 로그 파일이 생성됩니다. 저는 개인적으로 Changelog 파일에 Keep A Changelog 헤더를 포함하는 것을 좋아합니다. 그래서 우리는 교체할 수 있습니다 'here is my changelog' 아래 코드로.

"# Changelog
All notable changes to this project will be documented in this file.The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).## [Unreleased]"

완벽한. 만약 우리의 init 조건은 변경 로그가 ~ 아니다 존재, 우리의 new_changelog 함수는 하나를 만들 것입니다. 거의 끝났지만 개발자를 추가 단계로 저장해야 한다고 생각합니다. 내 말은, 여기서 스크립트를 끝내고 개발자가 스크립트를 실행하게 하는 대신 다시 새로운 변경 로그 항목을 추가하기 위해 new_changelog_item 끝에 new_changelog. 이것은 우리가 작업을 시작해야 함을 의미합니다 new_changelog_item.

이 함수에서 가장 먼저 해야 할 일은 프로젝트의 현재 버전을 찾는 것입니다. 이렇게 하려면 다음 줄에서 다음을 수행할 수 있습니다. changelog 변하기 쉬운.

version="$(git describe --long)"

이렇게 하면 태그가 지정된 버전이 다음과 같이 인쇄됩니다.

1.2.1-2-gabc12d34

여기에 있는 것은 프로젝트 버전(1.2.1), 이 버전에 대한 커밋 수(-2), 마지막으로 커밋 자체의 약어(-gfa17e39). 전체 버전을 더 읽기 쉬운 버전으로 압축할 수 있는 방법이 있지만(예: 위를 1.2.3으로 표현) 여기에 대해서는 다루지 않겠습니다.

git tagging에 대한 자세한 내용은 이 게시물을 확인하세요.

이제 버전이 있으므로 날짜를 가져와야 합니다. 이것은 바로 아래에 추가할 수 있는 또 다른 변수입니다. version. Bash에서는 다음을 사용하여 간단히 날짜를 얻을 수 있습니다. date. 그러나 이것은 우리에게 아래 결과를 줄 것입니다.

Tue Mar 29 13:10:19 EDT 2022

이 변경 로그에서 우리는 기본적으로 연도, 월, 일 순인 ISO 형식을 따를 것입니다. 시간을 포함할 수 있지만 이 스크립트에서는 년-월-일 형식만 사용합니다. ISO 형식을 준수하도록 날짜 형식을 지정하려면 아래 코드를 사용할 수 있습니다.

today="$(date '+%Y-%m-%d')"

이제 날짜 형식이 올바르게 지정되었으므로 스크립트의 가장 어려운 부분에 도달할 수 있습니다. 실제로 변경 로그 파일의 특정 줄에 한 줄을 추가하는 것입니다. 이렇게 하려면 변경 로그를 읽어야 합니다.

while read line; do
echo $line
done < CHANGELOG.md

위의 코드는 각 라인을 반복합니다( $line) 변경 로그 및 echo명령줄에 있습니다. 이제 각 줄을 읽을 수 있으므로 newS 변경 로그 항목을 뒤에 추가하려는 줄이 어느 줄인지 찾아야 합니다. 을 고려하면 ## [Unreleased] 변경 로그의 일반적인 고정 장치이며 그 아래에 릴리스된 변경 사항이 있습니다. 이것은 새 변경 로그 항목을 추가할 때 찾아볼 수 있는 좋은 라인입니다.

이후 ## [Unreleased] 변경 사항(현재 날짜 또는 버전과 연결되지 않음)은 어쨌든 릴리스 시 제거되므로 릴리스되지 않은 변경 사항을 확인하기 위한 지원을 추가하는 것은 현재 우선 순위가 아닙니다.

다음은 행을 확인하는 if 문입니다. ## [Unreleased].

if [[ $line == "## [Unreleased]"* ]]; then
echo "LINE FOUND"
fi

완벽한. 이제 새 변경 로그 항목을 삽입할 줄을 알 수 있습니다. 다음 질문은 무엇입니까? 실제로 변경 로그 항목을 삽입하는 방법은 무엇입니까? 이를 위해 우리는 sed.

sed 은 많은 용도가 있는 텍스트 스트림 편집기이지만 지금은 파일에서 텍스트를 찾고 변경하는 데만 사용하고 있습니다. 우리는 사용할 수 있습니다 sed 명령 -i 파일을 제자리에서 편집하는 플래그입니다. 이것은 단순히 표준 출력으로 인쇄하는 것이 아니라 기존 파일을 실제로 편집하기를 원하기 때문에 좋습니다.

사용하기 위해서는 sed 텍스트를 삽입하려면 아래 형식을 따라야 합니다.

sed -i "" "s/old_line/new_line" FILE.ext

이를 분해하려면 먼저 다음을 포함해야 합니다. "" ~ 후에 -i 행이 구문 분석되는 방식 때문에(적어도 Mac OS X에서는 필요합니다. 다른 운영 체제에서는 필요하지 않을 수 있습니다.). 그런 다음 이전 줄을 제공하고 그 뒤에 대체하고 파일 자체를 제공할 수 있습니다. 그만큼 s 해당 문자열의 시작 부분은 "대체"를 나타내므로 명령은 old_line ~와 함께 new_line.

우리의 경우 위의 내용을 다음과 같이 다시 작성할 수 있습니다.

sed -i "" "s/$newvar/## [Unreleased]\n\n## [$version] - $date\n### Added\n - ADD CHANGE HERE!/" CHANGELOG.md

이제 눈치채셨을 수도 있습니다. $newvar 대신에 $line. 이는 원래 줄에 대괄호([]). 이들은 대괄호 표현식용으로 예약되어 있으므로 일반 텍스트와 동일하게 평가되지 않습니다. 따라서 이 문제를 해결하려면 본질적으로 대괄호를 다음으로 대체하는 새 변수를 만들어야 합니다. 탈출 괄호. 일반 대괄호가 있는 줄을 찾을 수 있지만 대괄호를 이스케이프해야 합니다. sed 올바르게 교체하라는 명령. 보다 $newvar 아래에.

newvar=$(<<<"$line" sed 's/[].*[]/\\&/g')

이 게시물과 간결함을 위해 이 구문의 구조에 대해 너무 깊이 설명하지 않겠습니다. 이 행이 괄호를 대체한다는 것을 알아두십시오. $line 이스케이프된 대괄호를 사용하여 텍스트의 일부로 처리되고 ~ 아니다 대괄호 식으로.

업데이트된 내용은 다음과 같습니다. new_changelog_item 기능:

엄청난! 거의 완료되었습니다.

대부분의 코드가 제자리에 있습니다. 이제 우리가 해야 할 일은 현재 버전과 일치하는 줄이 이미 있는지 확인하는 것입니다. 그렇게 하려면 변경 로그에 아래와 같은 줄이 있는지 간단히 확인할 수 있습니다.

## [$version] - $date

이를 위해 아래 조건문을 추가할 수 있습니다. new_changelog_item.

item="## [$version] - $date"
if grep -Fxq "$item" CHANGELOG.md; then
echo "Changelog item already exists for $item."
else
# rest of function

-Fxq 고정 문자열, 정확히 일치 또는 자동 출력으로 제공된 패턴(이 경우 변경 로그 항목 헤더)을 확인할 수 있는 플래그입니다. 기본적으로 유형에 관계없이 패턴을 잡는 데 도움이 되는 매우 철저한 플래그입니다. 일단 이것이 있으면 이전 기능의 나머지 부분을 else 성명. 이는 이 버전/날짜 조합에 대한 변경 로그 항목이 존재하지 않는 경우 새 항목을 추가해야 하기 때문입니다.

그리고 당신은 그것을 가지고 있습니다! ㅏ 순수한 변경 로그를 생성하고 변경 로그 항목을 추가하기 위해 앱에 통합할 bash 스크립트, 그리고 형식 및 변경 로그 콘텐츠 측면에서 유연성 제공 없이 생성기, 로그 또는 기타 종속성이 필요합니다. 전체 코드는 GitHub에 있습니다.

https://linuxize.com/post/bash-check-if-file-exists

반응형

댓글