2016-09-21 7 views
7

마스터 브랜치에 GitHub 브랜치 보호가 설정되어있을 때 프로젝트의 버전 번호를 관리하는 좋은 프로세스를 찾고 있습니다.GitHub 보호 지점에서 버전 번호를 늘리는 방법은 무엇입니까?

"릴리스"분기에 병합 할 때 연속 통합 서버가 테스트를 실행하면 자동으로 프로젝트의 버전 번호가 증가하고 SCM 시스템으로 다시 커밋됩니다.

그러나 브랜치 보호를 사용하면 풀 요청없이 브랜치를 커밋 할 수 없으므로 버전 번호 업데이트를 시도 할 때 CI 서버가 보호 분기로 푸시 할 수없는 catch-22가 있습니다. 하위 최적 모두 내가 몇 가지 작업 방법을 생각할 수

:

  1. 조작까지하는 시스템은 그래서 당신의 CI 서버는 버전을 업데이트하는 PR을 만들 것입니다. 나는 GitHub로도 그렇게 할 수있을 지 확신하지 못하지만, 그것이 실제로 "모든"PR에 대한 두 개의 Pull Request를 작성하게된다고해도, 어색하다.
  2. 지점 보호를 제거 - 지금 누군가가 나뭇 가지에 아무것도 밀어 수 있으며, 당신이 수동 프로세스
  3. 업데이트 끌어 오기 요청하기 전에 수동으로 버전을 통해 개발자를 관리 할 수 ​​있습니다. 이것은 # 2보다 약간 낫지 만 새로운 버전 번호를 선택하거나 올바른 버전 번호를 잘못된 분기에 병합 할 때 개발자가 실수 할 수있는 문을 엽니 다.

내가 생각하지 못한 다른 옵션이 있기를 바랍니다.

우리는 자바 스크립트와 npm을 사용하고 있습니다.하지만이 문제는 언어에 무관심합니다. 예를 들어 Java와 Maven에서 확실히 동일한 문제가 존재할 것입니다.

답변

1

나는 젠크를 사용하여 버전 관리를 자동화하기 위해 git tags을 사용했습니다. 그래서 작업이 실행될 때마다 마지막으로 tag을 가져 와서 증가 시켰습니다. 태그가 커밋과 다르므로 태그를 추가해도 지점 보호와 충돌하지 않습니다.

# get last tag 
last=$(git describe --abbrev=0 --tags) 
# increment and tag again 
git tag $(($last + 1)) 
git push origin $(($last + 1)) 

이 스크립트는 단순한 정수 버전 번호이지만 원하는 경우 semver를 따라갈 수 있습니다. 이것은 안드로이드 프로젝트를위한 것이므로 마지막 태그를 꺼내고 건물 동안 버전 번호를 사용한다면 gradle 함수를 추가했습니다.

/* 
* Gets the version name from the latest Git tag 
*/ 
def getVersionName = { -> 
    def stdout = new ByteArrayOutputStream() 
    exec { 
     commandLine 'git', 'describe', '--tags' 
     standardOutput = stdout 
    } 
    return stdout.toString().trim() 
} 

자바 스크립트와 비슷한 설정을 사용할 수 있습니다.

+0

그러나 이것은 버전 ID를 프로젝트에 다시 적용하지 않습니다. – JBCP

+0

버전 정보가 프로젝트에 전혀 없습니다. 젠킨스가 마스터 브랜치 (master branch)에서 업데이트를 볼 때마다 넣는'git tag '에 있습니다. 이 프로젝트는 단지 마지막 '태그'에서 버전 정보를 가져 오는 방법을 알고 있습니다. 그래서 예, 다시 커밋되지 않습니다. –

+0

@JBCP 그것이 도움이된다면 받아 들인 답을 표시해주십시오. –