Webhook juga dikenal sebagai "reverse API". Ini adalah alat yang memungkinkan satu sistem atau aplikasi untuk berkomunikasi dan mengirimkan pemberitahuan secara real-time tentang peristiwa tertentu ke sistem atau aplikasi lain..
Sebenarnya jika memiliki project di Gitlab.com maka Anda bisa langsung saja menggunakan Gitlab CI/CD nya. Namum memiliki batasan sehingga sampai 10 menit aja.
Artikel ini akan memandu Anda melalui proses konfigurasi pipeline Continuous Integration/Continuous Delivery (CI/CD) di GitLab, menggunakan contoh kode .gitlab-ci.yml yang telah kita bahas sebelumnya. Pipeline ini akan mengotomatisasi proses build Docker image, deployment ke lingkungan development dan production, serta pengiriman notifikasi.
Sebelum memulai, pastikan Anda memiliki hal-hal berikut:
Proyek GitLab: Repositori GitLab dengan kode sumber aplikasi Anda.
Dockerfile: Pastikan Anda memiliki Dockerfile yang valid di root direktori proyek Anda. Berikut adalah contoh Dockerfile untuk project golang yang sesuai dengan kode CI/CD ini:
# Build Stage
FROM golang:1.24.2-alpine AS build_base
ENV CGO_ENABLED=1
ENV GO111MODULE=on
RUN apk add --no-cache git gcc g++
WORKDIR /src
# Copy Go Modules files
COPY go.mod .
COPY go.sum .
RUN go mod download
# Copy the rest of the application source code
COPY . .
# Build the Go binary
RUN go build -o /app/webapi ./main.go
# Production Stage
FROM alpine:3.17.0
RUN apk add --no-cache ca-certificates tzdata chromium harfbuzz nss freetype ttf-freefont font-noto bash
ENV TZ=Asia/Jakarta
ENV ENV=development
# Default to development (override in production)
WORKDIR /app
# Copy the built binary
COPY /app/webapi /app/webapi
COPY /src/data /app/data
# Ensure executable permissions
RUN chmod +x /app/webapi
# Copy the correct config file at runtime
ENTRYPOINT ["/bin/sh", "-c", "cp /app/data/config.yml.$ENV /app/data/config.yml && exec /app/webapi server"]
EXPOSE 8080
Dockerfile ini menggunakan multi-stage build untuk membuat binary Go dan kemudian mengemasnya ke dalam image Alpine yang lebih kecil. Perhatikan bagaimana ia menyalin file konfigurasi berdasarkan variabel lingkungan ENV saat runtime, yang akan diatur oleh pipeline CI/CD kita.
Server Development & Production: Dua server (VM, VPS, dll.) yang dapat diakses melalui SSH, satu untuk development dan satu untuk production. Pastikan Docker sudah terinstal di kedua server tersebut.
Kunci SSH Privat: Sepasang kunci SSH (privat dan publik) yang akan digunakan oleh GitLab Runner untuk terhubung ke server Anda. Kunci publik harus ditambahkan ke file ~/.ssh/authorized_keys di server development dan production untuk user root (atau user lain yang Anda gunakan).
.gitlab-ci.ymlFile .gitlab-ci.yml adalah definisi pipeline Anda.
Pada proyek root directori GitLab Anda, buatlah sebuah file dengan nama .gitlab-ci.yml.
Copy paste kode pipeline berikut ke dalam file tersebut:
# .gitlab-ci.yml
image: docker:latest
stages:
- build
- deploy
- notify
variables:
DEV_SERVER: '192.168.111.2'
PROD_SERVER: '192.168.111.6'
build_image:
stage: build
script:
- docker build -t golang-docker:latest .
retry: 2
only:
- dev
- tags
send_notification:
stage: notify
before_script
image dan stagesimage: docker:latest: Ini menentukan bahwa semua job di pipeline akan berjalan di dalam container Docker yang berbasis docker:latest. Ini penting karena job kita akan menggunakan perintah Docker.stages: Ini mendefinisikan urutan tahapan dalam proses pipeline:
build: Tahap untuk membangun Docker image.deploy: Tahap untuk mendeploy aplikasi.notify: Tahap untuk mengirim notifikasi. Job akan berjalan secara paralel dalam satu stage, dan stage berikutnya hanya akan dimulai jika semua job di stage sebelumnya berhasil.Di bagian variables dalam file .gitlab-ci.yml, telah mendefinisikan alamat IP server development dan production.
DEV_SERVER: "192.168.111.2": Ganti dengan alamat IP server development yang sebenarnya.PROD_SERVER: "192.168.111.6": Ganti dengan alamat IP server production yang sebenarnya.Pastikan alamat IP ini dapat dijangkau oleh GitLab Runner.
Berikut ini merupakan langkah KRUSIAL untuk memungkinkan GitLab Runner terhubung ke server melalui SSH. Anda harus menyimpan kunci SSH privat Anda sebagai variabel rahasia di GitLab.
SSH_DEV_PRIVATE_KEY-----BEGIN OPENSSH PRIVATE KEY----- dan -----END OPENSSH PRIVATE KEY-----).File (atau Variable jika mengelola newline secara manual, tetapi File lebih disarankan untuk kunci SSH).SSH_PRD_PRIVATE_KEYFile
build_imagedev atau ketika membuat tag baru.docker build -t golang-docker:latest . akan membangun image dan memberinya tag golang-docker:latest. Pastikan Dockerfile ada di root proyek.deploy_dev dan deploy_prod)Kedua job ini bertanggung jawab untuk mendeploy Docker image yang telah dibangun ke server masing-masing.
deploy_dev (Deployment ke Development)dev.before_script): Menginstal openssh, memulai ssh-agent, menambahkan kunci SSH privat dari variabel SSH_DEV_PRIVATE_KEY, dan menambahkan host key server ke known_hosts.script): Image Docker golang-docker:latest disimpan ke file .tar dan disalin ke server development menggunakan scp.script): Melalui SSH, perintah Docker dijalankan di server development untuk:
docker rmi -f)..tar (docker load).docker rm -f).golang-docker, memetakan port 8080, dan mengatur variabel lingkungan ENV=development.deploy_prod (Deployment ke Production)v1.0.0). Ini adalah praktik terbaik untuk rilis produksi.deploy_dev, tetapi dengan beberapa perbedaan penting untuk keamanan dan keandalan produksi:
before_script): Menggunakan SSH_PRD_PRIVATE_KEY.script): Sebelum menyalin image baru, image .tar yang ada di server production akan di-backup (mv /root/golang-docker.tar /root/golang-docker.tar.bak). Ini memungkinkan rollback cepat jika ada masalah dengan deployment baru.script): Mirip dengan deploy_dev, tetapi dengan tambahan || true pada perintah rm dan rmi untuk memastikan pipeline tidak gagal jika file atau image tidak ada. Variabel lingkungan diatur ke ENV=production.send_notificationcurl (before_script): Memastikan curl tersedia untuk mengirim permintaan HTTP.script): Menggunakan curl untuk mengirim permintaan POST ke endpoint API notifikasi.
http://192.168.111.2:4000/api/sendText: Ganti alamat IP dan port ini dengan alamat server notifikasi yang sebenarnya.chatId: [email protected]: Ganti ini dengan ID chat grup atau individu yang ingin kirimi notifikasi.$CI_PIPELINE_STATUS), nama proyek ($CI_PROJECT_NAME), dan URL pipeline ($CI_PIPELINE_URL).Setelah semua konfigurasi selesai, saatnya menguji pipeline:
Untuk Deployment Development:
dev.build_image dan deploy_dev untuk memastikan semuanya berjalan lancar.http://<DEV_SERVER_IP>:8080) untuk memverifikasi deployment.Untuk Deployment Production & Notifikasi:
main atau master, lalu merge dev ke sana jika alur Anda seperti itu).v1.0.0). Anda bisa melakukannya dari UI GitLab (Repository > Tags > New tag) atau dari baris perintah (git tag v1.0.0 && git push origin v1.0.0).

build_image, deploy_prod, dan send_notification.deploy_prod dan send_notification.http://<PROD_SERVER_IP>:8080).Selamat! Anda kini telah berhasil mengkonfigurasi pipeline GitLab CI/CD yang komprehensif untuk mengotomatisasi build dan deployment aplikasi Docker. Dengan pipeline ini, Anda dapat merilis pembaruan dengan lebih cepat, lebih konsisten, dan dengan risiko kesalahan yang lebih rendah. Ingatlah untuk selalu menjaga keamanan kunci SSH dan variabel rahasia lainnya.
Commit file tersebut ke repositori.
Join the discussion below.
Sign in to leave a comment.
No comments yet. Be the first to comment.