Automatiser le flux de travail de votre projet Java avec un modèle de branchement Gitflow modifié
Principales conclusions
- Gitflow est un modèle de branchement collaboratif qui tente d'exploiter la puissance, la vitesse et la facilité de branchement de Git. Cette méthode a bien fonctionné pour la situation que nous décrivons ici, mais d'autres ont noté que l'utilisation de Gitflow a ses propres problèmes.
- La documentation sur l'utilisation de Gitflow dans la publication est au mieux floue.
- Les fonctions sont isolées au sein des branches. Vous pouvez gérer vos propres modifications de fonctionnalités de manière isolée. Cette approche diffère du développement basé sur le tronc, où chaque développeur s'engage sur la ligne principale au moins une fois toutes les 24 heures.
La séparation des fonctionnalités à l'aide de branches isolées vous permet de décider des fonctionnalités à inclure dans chaque version. Le compromis ici peut être des fusions complexes.
Mise à jour du 13 février 2019: la conception initiale de cet article a reçu de nombreux commentaires, principalement positifs et parfois moins. Le principal point de discorde était notre utilisation du terme «livraison continue» dans un environnement de version manuelle. Si vous faites partie d'une équipe qui déploie des centaines de versions par jour, notre structure peut ne pas fonctionner pour vous. Cependant, si vous travaillez comme nous dans un secteur hautement réglementé comme la finance, où les versions sont plus contrôlables et que vous souhaitez tirer le meilleur parti des capacités de branchement, d'auto-intégration, d'hébergement automatique et de versionnage, cette solution peut également fonctionner pour vous. quant à nous
, «Git». , , : , SVN? . Git, .
Gitflow — , , Git. InfoQ, , , , . Gitflow 2010 « Git». Gitflow , , , . , , , , , .
Gitflow , , . , . — master, development, feature .., , , Snapshot, Dev, UAT, Prod ..?
, , , .
Java Maven, , . GitLab CI , Jenkins GitHub CI; Jira , IntelliJ IDEA IDE, Nexus , Ansible , .
, «» «» — , , ., . , , , « ». « », « »; , . - Thoughtworks , CI.
Gitflow
Gitflow feature . , , Git.
Git, «master»; «trunk», Git Git. Gitflow, , , .
Gitflow
Gitflow, , master «develop». develop , , , «».
, develop, master. Master — «» , , , , . - , .
develop "". , — , , ; . , , , , , "".
, ? :
Jira, . , , , master:
, «feat-», Jira. ( Jira, Epic Parent , .) , «feat-SDLC-123-add-name-field». «feat-» , CI- , . , . SDLC-123 — Jira, , .
: , , , . , , « (merge hell)».
, Snapshots
. , Sonatype Nexus. . «SNAPSHOT» semver ( ), «-SNAPSHOT» (, 1.2.0-SNAPSHOT). , «-SNAPSHOT» (, 1.2.0). Snapshot , , Snapshot, . ; , , , , Nexus.
, X, Y. , POM (, 1.2.0-SNAPSHOT). , Nexus, Nexus. , Nexus, 1.2.0-SNAPSHOT , ( , !) .
GitLab CI
, ! , ? GitLab CI, , Nexus, feat- Maven ( ), Maven ( Snapshot Nexus).
GitLab CI ( .gitlab-ci.yml) , CI / CD. , , .
GitLab CI , :
feature-build:
stage:
build
script:
- mvn clean verify sonar:sonar
only:
- /^feat-\w+$/
, , , , .
,
. IntelliJ «», ( , ) , , . ( ) Maven (, Jacoco), . IDE, , , .
[ — , , , , . , ; , -, , . , .]
Maven. Maven ( , Test-something.java Test.java, Tests.java TestCase.java). Maven verifyphase ( Maven Failsafe) . mvn verify , , . SonarQube Maven SonarQube . .
Gitflow. , , «», . , , .
, GitLab, :
SDLC - , . , . , , , , . , , Nexus , POM, , . 0.0.0-SNAPSHOT POM, .
, , , , . , , SNAPSHOT Nexus.
develop. Gitflow ; . , , ( ), () , () , , . , 1.2.0, 1.2.1, Snapshot pom 1.2.1-SNAPSHOT. , 1.2.1.
GitLab CI , ( semver , ; : \d+\.\d+\.\d+
). CI/CD POM, SNAPSHOT, (1.2.1-SNAPSHOT ).
release-build:
stage:
build
script:
- mvn versions:set -DnewVersion=${CI_COMMIT_REF_NAME}-SNAPSHOT
# now commit the version to the release branch
- git add .
- git commit -m "create snapshot [ci skip]"
- git push
# Deploy the binary to Nexus:
- mvn deploy
only:
- /^\d+\.\d+\.\d+$/
except:
- tags
[ci skip]
. , !
, CI POM, pom.xml ( , ). POM SNAPSHOT .
GitLab CI, (/^\d+\.\d+\.\d+$/
, 1.2.1) , , push. GitLab mvn deploy SNAPSHOT Nexus. Ansible , . . , , -, SNAPSHOT, SNAPSHOT Nexus SNAPSHOT .
Ansible, . , , , cron . Ansible .
, , master, Git semver , Nexus .
, GitLab CI , , . jar Ansible, GitLab CI.
master-branch-build:
stage:
build
script:
# Remove the -SNAPSHOT from the POM version
- mvn versions:set -DremoveSnapshot
# use the Maven help plugin to determine the version. Note the grep -v at the end, to prune out unwanted log lines.
- export FINAL_VERSION=$(mvn --non-recursive help:evaluate -Dexpression=project.version | grep -v '\[.*')
# Stage and commit the binaries (again using [ci skip] in the comment to avoid cycles)
- git add .
- git commit -m "Create release version [ci skip]"
# Tag the release
- git tag -a ${FINAL_VERSION} -m "Create release version"
- git push
- mvn sonar:sonar deploy
artifacts:
paths:
# list our binaries here for Ansible deployment in the master-branch-deploy stage
- target/my-binaries-*.jar
only:
- master
master-branch-deploy:
stage:
deploy
dependencies:
- master-branch-build
script:
# "We would deploy artifacts (target/my-binaries-*.jar) here, using ansible
only:
- master
. , . (Develop , .)
, , . Master GitLab, , . GitLab master, SNAPSHOT . GitLab Maven : removeSnapshot. «-SNAPSHOT» POM, runner GitLab master, , POM SNAPSHOT Nexus. UAT QA UAT. , . ( Ansible, .)
hotfix
, . , , , . Hotfix . , . , , master.
. , hotfix Nexus SNAPSHOT UAT. , , master . Master Nexus.
:
, Gitflow. . , :
- Feature . Feature , Feature, Feature,
- Feature, , Feature . — , Feature, Feature.
- , , .
- , , .
Gitflow , , , .
Gitflow Atlassian Bamboo BitBucket . .
Gitflow Maven, , , Maven Gitflow. Gitflow.
Nomura Securities . Oracle Java, Java InfoQ Java.
Brian Gardner est récemment diplômé du Stevens Institute of Technology, où il a obtenu son baccalauréat et sa maîtrise en informatique. Brian travaille actuellement chez Nomura en tant qu'ingénieur logiciel au sein du groupe de développement d'infrastructure. Il passe principalement sa journée à travailler sur les services back-end Spring Boot ou les pipelines Big Data à l'aide d'Apache Spark.