git 브랜치에서 Maven 아티팩트 버전 파생
우리는 본질적으로 git의 현재 분기에서 외부 적으로 정의 된 모듈의 아티팩트 버전이 필요하다는 것을 의미하는 워크 플로 요구 사항이 있습니다.
즉, git의 마스터 브랜치에있는 <version>master-...</version>
경우 필요 하고 bugfixX 브랜치에있는 경우이 <version>bugfixX-....</version>
pom.xml에 대해 생성 된 아티팩트 가 필요 합니다.
이전에 https://github.com/koraktor/mavanagaiata 가 SHA-1 해시를 속성으로 제공 할 수 있으며 문서에서 브랜치를 제공 할 수있는 것으로 나타났습니다. 따라서 충분히 일찍 실행할 수있는 경우 속성을 설정 <version>${our.version}</version>
하고 pom에 넣을 수있는 프로세스 입니다. 이것이 가능하다면 pom.xml이 작동하는 것을보고 싶습니다 (그리고 500 포인트 현상금도 보상).
만약 그렇지 않다면, 나는 우리가 전처리 또는 "git checkout"중 일부 후크로 추가 마법을 수행하고 있다고 생각합니다 (아직 시도하지 않은 작업 코드도 훌륭 할 것입니다).
내가 요청한이 기능이 필요한 모듈을 빌드하기 전에 ".."에서 속성 파일을 생성하기 위해 실행할 수있는 최상위 pom이 있습니다.
이 문제를 해결하는 방법에 대한 제안이 있습니까?
실제로 Maven은 다른 목표와 함께 한 번에 자체 프로젝트의 버전을 변경할 수 없습니다. 게다가 내가 아는 한 Maven은 <version>
태그 에서 임의의 속성을 지원하지 않습니다 . 따라서 POM 버전을 변경하는 목표를 실행하려면 별도의 실행이 필요합니다. 이를 수행 할 수있는 다양한 플러그인이 있습니다.이 경우 플러그인 의 versions:set
목표를 사용할 수 있습니다 versions
-http: //mojo.codehaus.org/versions-maven-plugin/set-mojo.html
예를 들어 다음과 같이 실행할 수 있습니다.
mvn versions:set -DgenerateBackupPoms=false -DnewVersion=$branch-SNAPSHOT
여기서 $branch
변수는 현재 힘내 지점 이름을 포함한다; 다음과 git rev-parse
같이 로 추출 할 수 있습니다 .
branch=$(git rev-parse --abbrev-ref HEAD)
하지만 그래도 어떻게 든 실행해야합니다. 수동으로 할 수 있지만 번거 롭습니다. 그래서 제 생각에는 실제로 가장 강력한 솔루션은 Git 측에서 접근하는 것입니다. 즉, Git 후크입니다. 다음은 post-checkout
작업을 수행 할 완전한 Git 후크입니다 (개별 파일이 아닌 분기가 체크 아웃 된 경우에만 후크를 실행하는 일부 필터링이있는 위와 동일한 코드).
#!/bin/bash
echo 'Will change the version in pom.xml files...'
# check if the checkout was to checkout a branch
if [ $3 != '1' ]
then echo 'git checkout did not checkout a branch - quitting';exit
fi
# get current branch name
branch=$(git rev-parse --abbrev-ref HEAD)
version=$branch-SNAPSHOT
# run maven versions plugin to set new version
mvn versions:set -DgenerateBackupPoms=false -DnewVersion=$version
echo 'Changed version in pom.xml files to $version'
이 내용을 파일 PROJECTDIR\.git\hooks\post-checkout
파일에 넣습니다 . 후크 파일을 실행하려면 실행 가능해야합니다 ( chmod +x post-checkout
).
versions
플러그인 에 대한 몇 가지 참고 사항 -매우 유연하고 많은 옵션을 지원하며 프로젝트 구조에 따라 도움이 될 수있는 다른 목표가 거의 없습니다 (부모 poms를 사용하는지 여부, 자녀가 자신의 버전을 가지고 있거나 부모로부터 파생됩니까? 등). 따라서 위의 후크는 versions
플러그인의 다른 목표를 사용하거나 추가 매개 변수를 지정 하여 특정 경우를 지원하도록 약간 수정 될 수 있습니다 .
장점 :
- 건장한
- 이 작업을 수행하기 위해 pom.xml 파일 자체에서 아무것도 변경할 필요가 없습니다.
- 이 "기능"은 단순히 후크를 비활성화 (제거 또는 실행 안 함)하여 끌 수 있습니다. 다시 말하지만 pom.xml에서 변경할 필요가 없습니다.
단점 :
- 다른 사람이 후크를 사용하도록 강요 할 수는 없습니다. 리포지토리가 복제 된 후 수동으로 설치해야합니다 (또는 Git 사용자가 .git 디렉토리 내의 항목을 만지는 것을 두려워하는 경우 후크를 설치하는 스크립트를 제공 할 수 있습니다).
최신 정보
다음은 더 복잡한 버전의 후크로, 버전을 분기 이름으로 설정할뿐만 아니라 이전 버전의 접미사도 유지합니다. 예를 들어, 이전 버전이 제공된 경우 분기로 master-1.0-SNAPSHOT
전환 feature1
하면 프로젝트 버전이 feature1-1.0-SNAPSHOT
. 이 bash 스크립트는 몇 가지 문제 (이름에 대시 기호 ( -
)가 없는 브랜치 이름이 필요 하고 루트 pom의 버전 만 취함)가 있지만 후크가 확장 될 수있는 방법에 대한 아이디어를 제공 할 수 있습니다. mvn 및 bash 명령은 POM에서 많은 정보를 추출하고 업데이트 할 수 있습니다.
#!/bin/bash
echo 'Will change the version in pom.xml files...'
# check if the checkout was to checkout a branch
if [ $3 != '1' ]
then echo 'git checkout did not checkout a branch - quitting';exit
fi
# get current branch name
branch=$(git rev-parse --abbrev-ref HEAD)
# get current version of the top level pom
current_version=$(mvn help:evaluate -Dexpression=project.version | grep -v '\[.*')
# extract version suffix
suffix=$(echo $current_version | cut -d \- -f 2)
# build new version
version=$branch-$suffix
# run maven versions plugin to set new version
mvn versions:set -DgenerateBackupPoms=false -DnewVersion=$version
echo 'Changed version in pom.xml files to $version'
이 질문을 되 살리고 매우 최근에 다른 솔루션을 게시하게되어 유감이지만 실제로 maven 버전을 동적으로 변경하고 일부 git 기능을 사용할 git describe
수 있습니다.
이를 수행하는 프로젝트는 jgitver-maven-plugin (면책 조항, 저자입니다) , jgitver jgit 기반 라이브러리를 사용하여 git 정보에서 maven 프로젝트 버전을 도출합니다.
Maven 확장으로 사용하기가 매우 쉽습니다.
...
<build>
<extensions>
<extension>
<groupId>fr.brouillard.oss</groupId>
<artifactId>jgitver-maven-plugin</artifactId>
<version>0.1.0</version>
</extension>
</extensions>
...
</build>
...
확장은 플러그인 확장으로도 사용할 수 있으며, 예를 들어 SNAPSHOTS를 사용하지 않으려는 경우 더 많은 구성을 허용합니다. 전체 사용 시나리오에 대한 설명은 프로젝트 페이지를 참조하십시오 .
거의 동일하게 작동 하는 gradle 플러그인도 있습니다.
[편집 1] : Thorbjørn Ravn Andersen 코멘트에 대한 답변
The plugin does not modify the original pom files or the build.gradle files.
For the maven plugin, modifications are done both in memory in the maven Object Model and written to a temporary file in temp directory. The calculation is based on the git metadata only (tags, commits, ...).
This non modification allows to not pollute the git history. WHen your are satisfied with a git commit, tag it git tag -a x.y.z
and mvn deploy
: that's all.
The version in your project files, is now useless and can be set to 0 for example.
As of today, and due to IDEA-155733 only recent EAP versions of IntelliJ work with the maven plugin. Eclipse & Netbeans have no problem.
Disclaimer: I am the author
My maven core extension will virtually set the version based on the current branch or tag. You can config custom version format patterns as you like.
https://github.com/qoomon/maven-branch-versioning-extension
If it is sufficient to set the git tag and version information in the artifact file name, you can use maven-jgit-buildnumber-plugin:
<build>
<finalName>${artifactId}-${git.buildnumber}</finalName>
<plugins>
<plugin>
<groupId>ru.concerteza.buildnumber</groupId>
<artifactId>maven-jgit-buildnumber-plugin</artifactId>
<version>1.2.7</version>
<executions>
<execution>
<id>git-buildnumber</id>
<goals>
<goal>extract-buildnumber</goal>
</goals>
<phase>prepare-package</phase>
</execution>
</executions>
</plugin>
<!-- more plugins -->
</plugins>
</build>
Have you tried using this plugin?: https://github.com/ktoso/maven-git-commit-id-plugin. You can configure it to generate a properties file with all the relevant info about your repo state:
- branch
- describe
- commitId
- buildUserName
- buildUserEmail
- buildTime
- commitUserName
- commitUserEmail
- commitMessageShort
- commitMessageFull
- commitTime
Have you checked the buildnumber-maven-plugin which gives you the opportunity to use the revision number of git. But you needed something different. Furthermore i would suggest to do a thing like:
1.0.0-SNAPSHOT
1.0.0-SNAPSHOT
beeing on master
on a branch you can simple change the version to
1.0.0-BF-SNAPSHOT
From maven-3.5.0 on there is support for ${revision}, ${sha1} and ${changelist} properties within the version tag. This feature may be sufficient for your purpose if, for example you want to incorporate the Git branchname into the version for a CI build job. See Maven CI Friendly Versions
Basically, in your pom.xml replace the fixed version by:
<version>${revision}${changelist}</version>
Set default values for revision and changelist in the project root dir by creating a file .mvn/maven.config
containing:
-Drevision=1.2.3
-Dchangelist=-SNAPSHOT
Check this file into version control, update it when you bump your project revision.
In your CI system you can then override the changelist variable using a cleaned-up representation of the Git branch name, eg.
BRANCHNAME=$(git rev-parse --abbrev-ref HEAD | sed -E -e 's@[^0-9A-Za-z.-]+@-@g')
mvn clean install -Dchangelist="-${BRANCHNAME}"
(You may prefer git symbolic-ref --short HEAD
for fetching the branchname, YMMV)
Your artifact built by the CI system for branch feature/branchname
will then have a versioned-branch suffix like:
yourproject-1.2.3-feature-branchname.jar
whilst developers who do not use any overrides will still build it as:
yourproject-1.2.3-SNAPSHOT.jar
참고URL : https://stackoverflow.com/questions/13583953/deriving-maven-artifact-version-from-git-branch
'Programing' 카테고리의 다른 글
Google 크롬 "window.open"해결 방법? (0) | 2020.12.09 |
---|---|
Arduino는 C 또는 C ++를 사용합니까? (0) | 2020.12.09 |
기본 클래스에서 인터페이스 메서드를 구현할 수있는 이유는 무엇입니까? (0) | 2020.12.09 |
Android Studio 2.3의 독립 실행 형 SDK 관리자 옵션 (0) | 2020.12.09 |
Safari에서 교차 도메인 쿠키 설정 (0) | 2020.12.09 |