Automasi Git Tag untuk CI/CD dan Deployment

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.

CommitHasil versi
fix: bug XPATCH 0.2.1
feat: fitur baruMINOR 0.3.0
feat!: breaking change + BREAKING CHANGE: in bodyMAJOR 1.0.0

Disini saya akan mencoba share membuat tagging manual dan best practices dalam versioning melalui CI/CD atau Pipeline

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

Leave a Reply

Your email address will not be published. Required fields are marked *