Post

Jenkins 로 핫픽스 브랜치 자동 생성하기

배포 시 발생 가능한 휴먼 에러를 줄여보자

Jenkins 로 핫픽스 브랜치 자동 생성하기

배경 설명

핫픽스(hotfix) 배포를 위한 git 브랜치(branch) 생성 시 간혹 개발자의 실수가 발생하곤 한다. 이전에 배포된 마일스톤 버전이 v1.1.1 이고, 현재 배포 대기중인 공식 마일스톤 배포 버전이 v1.2.0 이고, master 브랜치에 머지된 상태라고 예를 들자. 핫픽스 브랜치는 v1.1.1 에서 따와야한다.

개발자의 실수가 없다면 가장 좋고, 더블 체크, 트리플 체크까지 해서 사고를 막아야 한다. 하지만 사람이 하는 일이기에, 간혹 핫픽스 브랜치를 master 에서 따서 사고가 생긴 적이 있다. 아직 QA팀의 테스트가 완료되지 않는 feature 들이 production 환경에 배포돼버리는 것이다.

핫픽스 생성을 코드로 자동화하자

Ruby 스크립트를 활용하여 핫픽스 브랜치를 만들어보자. 참고로, backtick(`)은 쉘(Shell) 명령어를 Ruby 코드 내에서의 실행할 수 있게 해주는 문법이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
tag_list_text = `cd 레일즈 프로젝트 && git fetch origin 'refs/tags/*:refs/tags/*' && git tag`
versions = tag_list_text.split("\n").select {|v| v.start_with?('v')}.sort.reverse
latest_major_version = versions[0].match(/v(\d)\./)[1]
versions.select! {|v| v.start_with?("v#{latest_major_version}")}
latest_minor_version = versions.map {|v| v.match(/\.(\d+)\./)[1]}.map(&:to_i).max
versions.select! {|v| v.start_with?("v#{latest_major_version}.#{latest_minor_version}")}

latest_version = versions.sort.reverse[0]
hotfix_version = latest_version.match(/v\d+\.\d+\.(\d+)/)[1].to_i + 1

new_branch = "release/v#{latest_major_version}.#{latest_minor_version}.#{hotfix_version}"

`git checkout #{latest_version} && git checkout -b #{new_branch}`
`git push origin #{new_branch}`

# Slack 에 노티

모든 git tag 목록을 tag_list_text 에 받아오고, 정규표현식을 활용해 v{메이저}.{마이너}.{핫픽스} 와 같이 메이저/마이너/핫픽스 버전을 얻어온다. 핫픽스 버전에 +1 한다음 새로운 브랜치를 git 에 push 한다.

Jenkins 에서 Ruby 스크립트 호출

로컬 콘솔에서 Ruby 스크립트 실행해도 무관한데, Jenkins 를 통해 스크립트 실행 시 생길 수 있는 휴먼 에러도 피해보자.

  1. ‘Create Hotfix Branch’ 와 같은 프로젝트를 만들고
  2. ‘This project is parameterized’ 체크박스 선택
  3. ‘Multi-line String Parameter’ 에 Name RUBY_SCRIPT, Default Value 에는 위 Ruby 스크립트 추가
    1. 이 때 backtick(`)은 backslash()로 escape 하도록 수정 필요
  4. ‘SSH Server’ 에서 아래 쉘 스크립트 실행하도록 ‘Exec command’ 등록
1
2
3
4
5
6
source ~/.bash_profile && cd ~/crema && read -r -d '' SCRIPT << EOM
$RUBY_SCRIPT
EOM

echo "$SCRIPT" >> create_hotfix_branch.rb
ruby create_hotfix_branch.rb

위 코드는 등록해둔 Ruby 스크립트를 $SCRIPT 변수에 넣고, 새로운 Ruby 파일을 만들어 그 파일을 실행한다.

결론

이렇게 구성해두면 젠킨스 실행만으로 자동으로 핫픽스 브랜치가 git repository 에 push 된다. git fetch 를 통해 생성한 브랜치로 checkout 하여 핫픽스가 필요한 커밋들을 cherry-pick 하면 된다.


This post is licensed under CC BY 4.0 by the author.