Build a CI/CD workflow with Github Actions - Sesi 3

Build a CI/CD workflow with Github Actions - Sesi 3

Github Actions Login to Docker Hub

Syncronize terlebih dahulu vscode kita ke github, nanti ada tambahan file YAML yang terbentuk dari membuat workflow Go di Github Actions.

Edit file go.yaml

Dokumentasi nya di ambil dari sini Docker Build Push Action.

......

- name: Test
      run: go test -v ./...

- name: Login ke Docker Hub
  uses: docker/login-action@v2
  with:
    username: ${{ secrets.DOCKER_USERNAME }}
    password: ${{ secrets.DOCKER_HUB }}

pada bagian variable username kita belum simpan ke github secret, untuk variable password sudah kita simpan dengan nama DOCKER_HUB cek materi sebelum nya,

jadi kita kembali ke github > settings > Secrets and variables > Actions

jika sudah add secret

kembali ke vscode lakukan git commit.

lihat di github ke bagian menu actions ada proses build. cek apakah sukses untuk login ke docker hub.

Pada proses jobs build Login Success Ke Docker Hub

Github Actions Build and Push Docker Image

edit file go.yaml kembali

.....

- name: Build and push docker image
  uses: docker/build-push-action@v3
  with:
    push: true
    tags: cehamot/golang-apiserver:${{ github.run_number }}

pada bagian tags kita coba ikuti number dari github actions karena jika menggunakan latest nanti akan error. oke lakukan commit and push kembali

cek docker hub apakah sudah ada docker image.

Terlihat sudah ada image dengan Tag 5 yang berarti hasil dari proses job Build Github Actions.

sampai sini sukses untuk automate build and push docker image ke docker hub.

Provisioning Docker Image to Server Instance AWS EC2

Pada tahap ini kita akan menyiapkan server untuk menjalankan image docker yang sudah kita letakkan di Docker Hub.

edit file go.yaml kembali.

Di sini akan di buatkan jobs baru dengan nama provisioning-server.

......

jobs:
  build:
   .....

  provisioning-server:

untuk dapat terkoneksi antara github actions ke server instance berarti kita memerlukan SSH server, cara untuk konfigurasinya ada di dokumentasi SSH for GitHub Actions.

.......
provisioning-server:
    runs-on: ubuntu-latest
    needs: build    
    steps:
    - name: Login ke Docker Hub
      uses: docker/login-action@v2
      with:
        username: ${{ secrets.DOCKER_USERNAME }}
        password: ${{ secrets.DOCKER_HUB }}
    - name: executing remote ssh deploy container
      uses: appleboy/ssh-action@v0.1.7
      with:
        host: ${{ secrets.SSH_IP }}
        username: ${{ secrets.SSH_USER }}
        key: ${{ secrets.SSH_KEY }}
        script: |
          docker pull cehamot/golang-apiserver:${{ github.run_number }}
          docker rm -f apiserver
          docker run --name apiserver -d -p 80:8144 cehamot/golang-apiserver:${{ github.run_number }}

pada bagian variable script merupakan command docker untuk

  • mengambil (pull) image dari Docker Hub

  • menghapus jika ada duplicate container (rm)

  • dan jalankan (run).

oke lakukan commit and push untuk melihat apakah sukses proses Job Provisioning Server

cek ke server instance AWS EC2 apakah sudah running docker container nya.

cek menggunakan browser

oke sukses

Resize Docker Image

Docker image sekarang yang kita build memiliki size yang cukup besar ya mengakibatkan proses waktu deploy lumayan cukup lama.

Bagaimana kalau kita resize Docker image nya? cara nya kita modify Dockerfile nya.

FROM golang:alpine3.16 AS build
WORKDIR /app
COPY go.mod ./
COPY go.sum ./
RUN go mod download
COPY *.go ./
RUN go build -o /aplikasi

FROM alpine:latest
WORKDIR /
COPY --from=build /aplikasi /aplikasi
EXPOSE 8144
ENTRYPOINT ["/aplikasi"]

check docker hub repository,

berkurang sangat jauh yang tadi nya 100an MB menjadi 8.66 MB

Create Branch Staging Github Actions

Biasa nya kalau di lapangan kan gak mungkin tuh langsung push ke branch master/main, biasanya ke branch staging atau development dahulu coba kita lakukan seperti itu ya.

edit file main.go terserah yang penting bisa kita commit dan buat branch baru kasih nama staging.

sampai di github terdeteksi ada notification ada branch baru yang di buat.

biasa nya kita review dulu tuh apa yang di push di branch staging baru kita merge ke branch main.

hasil nya yang sudah kita edit.

DONE !!