Introduction: Kenapa Versioning Itu Penting?
Dalam pengembangan perangkat lunak, versioning atau penomoran versi adalah praktik penting untuk menandai perubahan pada aplikasi. Salah satu standar yang umum digunakan adalah Semantic Versioning (SemVer) dengan format:
MAJOR.MINOR.PATCH (contoh: 1.0.0)
Penjelasan:
- MAJOR: Perubahan besar yang tidak kompatibel dengan versi sebelumnya (breaking changes)
- MINOR: Fitur baru yang tetap kompatibel
- PATCH: Perbaikan bug atau perubahan kecil yang kompatibel
Dengan menggunakan Git Tag, kita bisa menandai versi rilis ini langsung dalam repositori Git, membuat proses deployment dan tracking versi menjadi jauh lebih mudah.
| Commit | Hasil versi |
|---|---|
fix: bug X | PATCH 0.2.1 |
feat: fitur baru | MINOR 0.3.0 |
feat!: breaking change + BREAKING CHANGE: in body | MAJOR 1.0.0 |
Disini saya akan mencoba share membuat tagging manual dan best practices dalam versioning melalui CI/CD atau Pipeline
- Repository Project Git tag ini : https://github.com/gunawan-d/git-tag
Flow

Step 1 – Versioning Manually
Yang pertama kita siapkan adalah , semisal mempunyai repository buat 1 file namanya app-version.properties kemudian kita input filenya sebagai berikut:
version_major=0 version_minor=0 version_patch=7
Mengacu kepada dokumentasi berikut https://semver.org/.
Step 2 – Combine with Pipeline
Selanjutnya kita buat CICD / Pipeline di Github , kenapa pakai ini? karena ini gratis hehehe.
jobs:
create-tag:
if: github.event.pull_request.merged == true
name: Create Version Tag
runs-on: ubuntu-latest
outputs:
tag_name: ${{ steps.tag.outputs.name }}
steps:
- name: Checkout repo
uses: actions/checkout@v4
- name: Set up Git identity
run: |
git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
- name: Generate Tag Name
id: tag
run: |
props=$(cat app-version.properties)
version_major=$(echo "$props" | grep -E "version_major=" | cut -d'=' -f2)
version_minor=$(echo "$props" | grep -E "version_minor=" | cut -d'=' -f2)
version_patch=$(echo "$props" | grep -E "version_patch=" | cut -d'=' -f2)
tag="v$version_major.$version_minor.$version_patch"
echo "Generated tag: $tag"
echo "name=$tag" >> "$GITHUB_OUTPUT"
- name: Push Git Tag
run: |
git fetch --tags
git tag ${{ steps.tag.outputs.name }}
git push origin ${{ steps.tag.outputs.name }}
Penjelasan mengenai gimana cara nya github membuat versionya adalah :
– Bot Github membuatkan otomatis versioning yang mana diambil dari file app-version.properties yang dimana sudah ada penjelasan tentang semantic versionya, jadi tiap kali kita akan PR / MR ke branch master atau production ini akan membantu kita, secara otomatis lewat pipeline.
Dan combine pipelinya dengan build and deploy example ada di link Github diatas.
Step 3 – Rollback
Dengan adanya tagging ini membuat Developer Team juga lebih mudah dalam melakukan rollback menyesuaikan dengan version sebelumnya atau di sesuaikan dengan rollback apps yang di perlukan, disini juga kita coba implementasikan menggunakan CICD sepert berikut contohnya:
name: Rollback by Tag
on:
workflow_dispatch:
inputs:
tag:
description: 'Tag version deploy (example : v0.0.5)'
required: true
jobs:
deploy:
runs-on: ubuntu-latest
environment: tencent-igunawan
steps:
- name: Checkout repo
uses: actions/checkout@v4
- name: Setup SSH
uses: webfactory/ssh-agent@v0.5.3
with:
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}
- name: SSH Deploy
run: |
ssh -o StrictHostKeyChecking=no -p ${{ secrets.PORT }} ${{ secrets.USERNAME }}@${{ secrets.HOST }} "
sudo docker pull gunawand/nodeapp:${{ github.event.inputs.tag }} &&
sudo docker stop backend-nodeapp || true &&
sudo docker rm backend-nodeapp || true &&
sudo docker run -d --name backend-nodeapp -p 3010:3000 gunawand/nodeapp:${{ github.event.inputs.tag }}
"
Di Actions/Pipelinya kita tinggal cocokan dengan tag atau version mana yang mau di rollback, bisa dilihat dari terminal maupun web Github, maka setelah di klik run workflow akan otomatis berubah.


Result :
- Before

- After rollback apps


Admin website igunawan.com, System Administrator, DevOps Engineer
