Mengotomatiskan alur kerja proyek Java Anda dengan model percabangan Gitflow yang dimodifikasi
Temuan Utama
- Gitflow adalah model percabangan kolaboratif yang mencoba memanfaatkan kekuatan, kecepatan, dan kemudahan percabangan Git. Metode ini bekerja dengan baik untuk situasi yang kami gambarkan di sini, tetapi yang lain telah mencatat bahwa menggunakan Gitflow memiliki masalahnya sendiri.
- Dokumentasi untuk menggunakan Gitflow dalam posting tidak jelas.
- Fungsi diisolasi di dalam cabang. Anda dapat mengelola perubahan fitur Anda sendiri secara terpisah. Pendekatan ini berbeda dari pengembangan berbasis trunk, di mana setiap pengembang berkomitmen pada jalur utama setidaknya sekali setiap 24 jam.
Memisahkan fitur menggunakan cabang terisolasi memungkinkan Anda memutuskan fitur mana yang akan disertakan dalam setiap rilis. Pengorbanan di sini bisa menjadi penggabungan yang rumit.
Perbarui 13 Feb 2019: Desain awal artikel ini telah menerima banyak umpan balik, kebanyakan positif dan terkadang tidak begitu banyak. Poin utama dari perselisihan adalah penggunaan istilah "pengiriman berkelanjutan" dalam lingkungan rilis manual. Jika Anda adalah bagian dari tim yang menerapkan ratusan rilis per hari, struktur kami mungkin tidak berfungsi untuk Anda. Namun, jika Anda, seperti kami, bekerja di industri yang diatur dengan ketat seperti keuangan, di mana rilis lebih dapat dikontrol, dan Anda ingin memanfaatkan kapabilitas percabangan, integrasi otomatis, hosting otomatis, dan pembuatan versi secara maksimal, solusi ini juga dapat bekerja untuk Anda. untuk kami
, «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 adalah lulusan baru dari Stevens Institute of Technology, di mana dia memperoleh gelar Sarjana dan Magister Ilmu Komputer. Brian saat ini bekerja di Nomura sebagai Insinyur Perangkat Lunak di Grup Pengembangan Infrastruktur. Dia sebagian besar menghabiskan waktunya untuk mengerjakan layanan back-end Spring Boot atau pipeline data besar menggunakan Apache Spark.