Utilisez-vous une approche sémantique du contrôle de version? Utilisez-vous gitflow? Vous êtes probablement familier avec le processus d'ajustement des versions, de création de branches, de fusion à partir de master / dev, de réajustement des versions, de gestion des conflits de fusion, ...
Dans cet article, j'expliquerai brièvement le processus de publication que nous utilisons essentiellement pour nos bibliothèques et comment nous l'avons automatisé. Nous utilisons généralement une approche CI / CD utilisant des numéros de build, mais pour nos bibliothèques, nous avons choisi d'utiliser le versionnage sémantique. J'ai rencontré le processus de publication fastidieux qui l'accompagne dans plusieurs entreprises et maintenant j'ai enfin trouvé une solution.
Cet article concerne Maven, mais il existe également de nombreuses alternatives à Gradle .
Un exemple de projet peut être trouvé sur notre page GitHub .
Versionnage sémantique et Git
Le versionnage sémantique est le système de classification de vos versions. Je suis sûr que vous avez vu des numéros de version comme 1.6.4, 1.7.10, 1.12.2 et autres. Ces nombres représentent MAJOR.MINOR.PATCH (MAJOR.MINOR.PATCH)
De plus, il existe des versions de SNAPSHOT qui se ressemblent, mais avec l'ajout de "-SNAPSHOT" à la fin, par exemple 1.14.4-SNAPSHOT.
Un processus de publication typique comprend les étapes suivantes:
- Créez une branche de version à partir de la branche de développement (ci-après la branche de développement).
- Changez la version dans tous les fichiers pom.xml de INSTANTANÉ (1.2.3-INSTANTANÉ) à non-INSTANTANÉ (1.2.3) dans la branche de libération.
- Améliorez la version de SNAPSHOT sur la branche de développement (1.2.4-SNAPSHOT).
- Lorsque tout est terminé pour la publication, fusionnez la branche de publication dans la branche principale. Ceci est la version actuelle.
- Fusionnez la branche principale ou la branche de publication avec la branche de développement.
/ , : , , .
, , . , 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. :
<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, 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 .