Automatización del control de versiones semántico con Maven (SemVer GitFlow Maven)

¿Está utilizando un enfoque semántico para el control de versiones? ¿Estás usando gitflow? Lo más probable es que esté familiarizado con el proceso de ajustar versiones, crear ramas, fusionar desde master / dev, reajustar versiones, lidiar con conflictos de fusión, ...



En este artículo, explicaré brevemente el proceso de lanzamiento que usamos esencialmente para nuestras bibliotecas y cómo lo hemos automatizado. Usualmente usamos un enfoque CI / CD usando números de compilación, pero para nuestras bibliotecas elegimos usar versiones semánticas. Me encontré con el tedioso proceso de lanzamiento que acompaña a esto en varias empresas y ahora finalmente encontré una solución.



Este artículo trata sobre Maven, pero existen muchas alternativas a Gradle .



Puede encontrar un proyecto de muestra en nuestra página de GitHub .



Control de versiones semántico y Git



El control de versiones semántico es el sistema de clasificación de sus lanzamientos. Estoy seguro de que ha visto números de versión como 1.6.4, 1.7.10, 1.12.2 y otros. Estos números representan PRINCIPAL.MINOR.PATCH (PRINCIPAL.MINOR.PATCH)



Además, hay versiones de SNAPSHOT que tienen el mismo aspecto, pero con la adición de "-SNAPSHOT" al final, como 1.14.4-SNAPSHOT.



Un proceso de lanzamiento típico consta de los siguientes pasos:



  1. Cree una rama de lanzamiento desde la rama de desarrollo (en adelante, la rama de desarrollo).
  2. Cambie la versión en todos los archivos pom.xml de SNAPSHOT (1.2.3-SNAPSHOT) a no SNAPSHOT (1.2.3) en la rama de lanzamiento.
  3. Actualice la versión SNAPSHOT en la rama de desarrollo (1.2.4-SNAPSHOT).
  4. Cuando todo esté listo para el lanzamiento, combine la rama de lanzamiento en la rama principal. Esta es la versión actual.
  5. Fusionar la rama maestra o la rama de lanzamiento de nuevo a la rama de desarrollo.


/ , : , , .



, , . , 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.








All Articles