Motivation

다른 부서와 긴밀히 협업을 하다보면 요청에 의해 버전코드(versionCode) 및 버전명(versionName)을 빈번하게 바꿀 필요가 있다. 개발중에 이런 요청을 받으면 작업하던 내용을 Stashing하고, 버전코드를 수정하고 커밋&푸시한 뒤 다시 Unstashing…

“아.. 어디까지 했더라?”

개발자들은 공감할 것이라 의심치 않는다.
개발중에 인터럽트가 들어오면 컨텍스트 스위칭 비용이 발생하게 되고, 이는 결국 생산성 저하 및 퇴근시간 늦어짐으로 귀결한다.

방해받는게 싫다면 시간을 조금 투자해서 생산성을 높일 수 있지 않을까?

그래서 이런 작업들을 젠킨스(Jenkins)를 통해 자동화하기로 결정했다.

젠킨스 프로젝트 만들기

Note : 기본적인 젠킨스 설치 및 사용법은 다루지 않습니다.

먼저 젠킨스 프로젝트를 Freestyle project로 만든다.

프로젝트를 만들었으니 프로젝트 설정 메뉴로 Go!Go!

자동화에 필요한 매개변수를 다음과 같이 선언했다.
Git Parameter를 사용할 때는 젠킨스 빌드시 브랜치 목록화를 위해 고급… 항목에서
적당한 설정을 하도록 하자. 예) branch Filter, Use repository 등

매개변수로 입력받은 branch변수로 원하는 브랜치를 Checkout 할 수 있도록 한다.

쉘 스크립트

젠킨스 파이프라인 프로젝트로 만들어서 스크립트를 작성해도 되지만, 쉘 스크립트가 더 편해서 쉘스크립트로 작성했다.

#Variables defined
echo "branch = $branch"
echo "versionName = $versionName"
echo "versionCode = $versionCode"

#Define build.gradle path
build_gradle_file_name="로컬프로젝트경로/app/build.gradle"
echo "build.gradle path = $build_gradle_file_name"

#Retrieve current versionCode from build.gradle file
oldVersionCode="$(grep "versionCode .\d*" $build_gradle_file_name | awk '{ print $2 }')"

#Add versionCode
newVersionCode=$(expr $oldVersionCode + 1) 
if [ "$versionCode" != "" ]; then
    newVersionCode=$versionCode
fi
echo "oldVersionCode = $oldVersionCode"
echo "newVersionCode = $newVersionCode"

#Change versionCode
sed -i "s/versionCode $oldVersionCode/versionCode $newVersionCode/g" $build_gradle_file_name

#Change versionName if it's not empty
if [ ! -z "$versionName" ]; then
    oldVersionName="$(grep -o "versionName\s\".*\"" $build_gradle_file_name | awk '{ print $2 }')"
    newVersionName="$versionName"
    echo "oldVersionName = $oldVersionName"
    echo "newVersionName = $newVersionName"
    sed -i "s/versionName $oldVersionName/versionName \"$newVersionName\"/g" $build_gradle_file_name

    currentVersionName="$(grep -o "versionName\s\".*\"" $build_gradle_file_name | awk '{ print $2 }')"
    echo "currentVersionName = $currentVersionName"
fi

#Commit changes
git --git-dir "$로컬프로젝트경로/.git" add .
DIFF_STRING=$(git status --porcelain)
DIFF_STRING=$(echo "$DIFF_STRING" | sed -e 's/^ *//g' -e 's/ *$//g')

if [ ! -z "$DIFF_STRING" ]; then
    echo "versionName!!! = $versionName"
    if [ ! -z "$versionName" ]; then
        git --git-dir "로컬프로젝트경로/.git" commit -m "commit versionName $versionName, versionCode $newVersionCode from $BUILD_USER"
    else
        git --git-dir "로컬프로젝트경로/.git" commit -m "commit versionCode $newVersionCode from $BUILD_USER"
    fi
fi

#Remove "origin/"
branchToPush=$(echo "$branch" | sed -e "s/origin\///g")

echo "ready to push = $branchToPush"
git push 원격리퍼지토리경로.git HEAD:"$branchToPush"
echo "finished pushing"

스크립트 내용은 어렵지 않으니 설명은 생략한다.

대충 요약하자면,

모듈/build.gradle 파일에서 버전코드와 버전명을 파싱하고, 매개변수로 받은 새로운 버전코드와 버전명으로 replace 한다. 변경된 내용을 커밋 & 푸시한다.

실행하기

항목을 적당히 입력하고 빌드하기를 누른다.

git fetch&pull 해보면 다음과 같이 젠킨스에서 커밋한 내용들이 나온다. 의심된다면(?) build.gradle 파일을 열어 직접 변경사항을 확인해보자

Conclusion

이제 다른 부서에서 버전코드 변경 요청이 온다면 Jenkins 권한부여와 사용법을 안내해주면 된다. 

사실 현재 사용하고 있는 프로젝트는 조금 더 복잡하다. 모든 부분을 공개할 수 없기 때문에 일부만 발라내었다. 작업이 성공 또는 실패하면 Slack 이나 업무용 메신저로 알림을 보낼수도 있고, 메신저 봇을 빌드 트리거로 활용 할 수도 있다. 만약 봇을 활용한다면 다른 부서원은 Jenkins 조차 몰라도 된다. 그냥 봇으로 요청하면 되기 때문이다.

카테고리: etc

0개의 댓글

답글 남기기

Avatar placeholder

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.