Você está usando uma abordagem semântica para controle de versão? Você está usando o gitflow? Você provavelmente está familiarizado com o processo de ajuste de versões, criação de branches, fusão de master / dev, reajuste de versões, lidar com conflitos de fusão, ...
Neste artigo, vou explicar brevemente o processo de lançamento que basicamente usamos para nossas bibliotecas e como o automatizamos. Normalmente usamos uma abordagem CI / CD usando números de compilação, mas para nossas bibliotecas optamos por usar o controle de versão semântico. Corri para o tedioso processo de lançamento que acompanha isso em várias empresas e agora finalmente encontrei uma solução.
Este artigo é sobre o Maven, mas também existem muitas alternativas para o Gradle .
Um projeto de amostra pode ser encontrado em nossa página GitHub .
Versão semântica e Git
O controle de versão semântico é o sistema de classificação de seus lançamentos. Tenho certeza que você viu números de versão como 1.6.4, 1.7.10, 1.12.2 e outros. Esses números representam MAJOR.MINOR.PATCH (MAJOR.MINOR.PATCH)
Além disso, existem versões de SNAPSHOT que têm a mesma aparência, mas com a adição de "-SNAPSHOT" no final, como 1.14.4-SNAPSHOT.
Um processo de liberação típico consiste nas seguintes etapas:
- Crie um branch de lançamento do branch de desenvolvimento (doravante o branch de desenvolvimento).
- Altere a versão em todos os arquivos pom.xml de SNAPSHOT (1.2.3-SNAPSHOT) para não-SNAPSHOT (1.2.3) no branch de lançamento.
- Atualize a versão SNAPSHOT na ramificação de desenvolvimento (1.2.4-SNAPSHOT).
- Quando tudo estiver pronto para o lançamento, mescle o branch de lançamento no branch master. Esta é a versão atual.
- Mescle o branch master ou release branch de volta ao branch de desenvolvimento.
/ , : , , .
, , . , merge .
?
- , .
- master SNAPSHOT.
- CI, .
- merge .
- hotfixes ( master ).
gitflow-maven
, maven, pom.xml. . , .
, , . , . , : gitflow-maven-plugin.
, :
- .
- release .
- hotfix.
- (Merging) .
, . , CI/CD, , .
, (goals) maven. , .
:
, .
$ mvn gitflow:release-start -B
release (-B
Batch Mode)
$ mvn gitflow:release
. master .
, , .
$ mvn gitflow:hotfix-start -B
$ mvn gitflow:hotfix-finish -B -DhotfixVersion=1.8.9b
hotfix master , 1.8.9b . . - , .
, poms:
<build>
<plugins>
<plugin>
<groupId>com.amashchenko.maven.plugin</groupId>
<artifactId>gitflow-maven-plugin</artifactId>
<version>1.13.0</version>
<configuration>
<!-- optional configuration -->
</configuration>
</plugin>
</plugins>
</build>
GitHub maven central.
GitHub. :
<configuration>
<!-- We use maven wrapper in all our projects instead of a local maven installation -->
<mvnExecutable>./mvnw</mvnExecutable>
<!-- Don’t push to the git remote. Very useful for testing locally -->
<pushRemote>true</pushRemote>
<!-- Set to true to immediately bump the development version when creating a release branch -->
<commitDevelopmentVersionAtStart>false</commitDevelopmentVersionAtStart>
<!-- Which digit to increas in major.minor.patch versioning, the values being 0.1.2 respectively.
By default the rightmost number is increased.
Pass in the number via parameter or profile to allow configuration,
since everything set in the file can't be overwritten via command line -->
<versionDigitToIncrement>${gitflowDigitToIncrement}</versionDigitToIncrement>
<!-- Execute mvn verify before release -->
<preReleaseGoals>verify</preReleaseGoals>
<preHotfixGoals>verify</preHotfixGoals>
<!-- Configure branches -->
<gitFlowConfig>
<productionBranch>master</productionBranch>
<!-- default is develop, but we use development -->
<developmentBranch>development</developmentBranch>
</gitFlowConfig>
</configuration>
, , . , Gitlab CI.
Gitlab CI
CI/CD Gitlab CI , commit snapshot, merge master — release.
, — , master merge , hotfixes.
Gitlab CI, . :
release. , release, release, snapshot, (merge) master snapshot. - .
git Gitlab CI
git Gitlab CI, : , CI git.
write_repository. , , .
GITLAB_TOKEN, protected, development
, release/*
hotfix/*
(protected). , .
git remote runner, CI . , Gitlab, :
$ git remote set-url --push origin "https://oauth2:${GITLAB_TOKEN}@${CI_SERVER_HOST}/${CI_PROJECT_PATH}.git"
git . Git «», git. , git , . :
$ git config user.name "Gitlab CI"
$ git config user.email gitlab-ci@viesure.io
git, CI. .
, git CI, gitflow. .
, , :
· MINOR
· PATCH hotfixes
.
(goals) -B
, , .
Release
$ ./mvnw gitflow: release -B -DgitflowDigitToIncrement = $RELEASE_DIGIT
. master SNAPSHOT , . (goal ) maven , .
$ ./mvnw gitflow: release-start -B -DgitflowDigitToIncrement = $RELEASE_DIGIT
$ git push origin HEAD
. , , , (, , ). , , .
$ git symbolic-ref refs/heads/$CI_COMMIT_REF_NAME refs/remotes/origin/$CI_COMMIT_REF_NAME
$ ./mvnw gitflow:release-finish -B -DgitflowDigitToIncrement=$RELEASE_DIGIT
release . Git ( ref) HEAD . Gitlab CI . HEAD . , , HEAD.
master , .
(Hotfix)
, , , , .
$ ./mvnw gitflow:hotfix-start -B -DgitflowDigitToIncrement=$HOTFIX_DIGIT
$ git push origin HEAD
Hotfix-start hotfix, .
$ export CURRENT_VERSION=${CI_COMMIT_REF_NAME/hotfix\/}
$ git symbolic-ref refs/heads/$CI_COMMIT_REF_NAME refs/remotes/origin/$CI_COMMIT_REF_NAME
$ ./mvnw gitflow:hotfix-finish -B -DgitflowDigitToIncrement=$HOTFIX_DIGIT -DhotfixVersion=$CURRENT_VERSION
Hotfix-finish master . : . , , . .
, hotfix-start , . , .
. , .
. , - !
, git CI runners . , , .
, . CI .
Gitlab CI GitHub.
- Viesure GitHub Repository
- Semantic Versioning
- gitflow-maven-plugin
- gitflow-maven-plugin Documentation
- Gitlab Access Tokens Documentation