All Products
Search
Document Center

Container Service for Kubernetes:Bangun pipeline CI Golang pada kluster alur kerja

Last Updated:May 13, 2026

Kluster alur kerja menyediakan Argo Workflows yang sepenuhnya dikelola berdasarkan proyek open-source Argo Workflows. Kluster ini sangat elastis, melakukan penskalaan otomatis, serta tidak memerlukan operasi atau pemeliharaan, sehingga Anda dapat membangun pipeline CI yang lebih sederhana, hemat biaya, dan efisien. Topik ini menjelaskan cara membangun pipeline CI untuk proyek Golang menggunakan kluster alur kerja.

Ikhtisar solusi

Saat membangun pipeline CI dengan kluster alur kerja, Anda terutama menggunakan BuildKit untuk membangun dan mendorong gambar kontainer serta BuildKit Cache untuk mempercepat pembuatan gambar. Menyimpan cache Go mod pada NAS mempercepat perintah go test dan go build, sehingga secara signifikan mempercepat seluruh pipeline CI.

Template alur kerja preset

Kluster alur kerja mencakup template alur kerja CI preset (ClusterWorkflowTemplate) bernama ci-go-v1. Template ini memanfaatkan BuildKit Cache dan menyimpan cache Go mod pada NAS untuk mempercepat pipeline CI secara signifikan.

Anda dapat langsung menggunakan template preset ini atau menyesuaikannya untuk membuat template alur kerja CI sendiri.

Template alur kerja CI preset mencakup langkah-langkah berikut:

  1. Git clone & checkout

    • Meng-clone repositori Git dan melakukan checkout branch target.

    • Mengambil ID commit dan menambahkannya sebagai akhiran pada tag gambar selama proses build.

  2. Jalankan go test

    • Menjalankan semua kasus uji di repositori Git (proyek Go) secara default.

    • Anda dapat menggunakan parameter alur kerja enable_test untuk mengontrol apakah langkah ini dijalankan atau tidak.

    • Cache Go mod disimpan dalam direktori /pkg/mod pada NAS untuk mempercepat perintah go test dan perintah go build berikutnya.

  3. Build & push image

    • Menggunakan BuildKit untuk membangun dan mendorong gambar kontainer, serta memanfaatkan cache jenis registri dari BuildKit Cache untuk mempercepat pembuatan gambar.

    • Secara default, tag gambar menggunakan format {container_tag}-{commit_id}. Anda dapat mengontrol penambahan ID commit melalui parameter saat mengirimkan alur kerja.

    • Ketika gambar baru didorong, gambar dengan tag latest juga didorong, menimpa gambar yang ada sebelumnya.

Konten lengkap template alur kerja CI preset

apiVersion: argoproj.io/v1alpha1
kind: ClusterWorkflowTemplate
metadata:
  name: ci-go-v1
spec:
  entrypoint: main
  volumes:
  - name: run-test
    emptyDir: {}
  - name: workdir
    persistentVolumeClaim:
      claimName: pvc-nas
  - name: docker-config
    secret:
      secretName: docker-config
  arguments:
    parameters:
    - name: repo_url
      value: ""
    - name: repo_name
      value: ""
    - name: target_branch
      value: "main"
    - name: container_image
      value: ""
    - name: container_tag
      value: "v1.0.0"
    - name: dockerfile
      value: "./Dockerfile"
    - name: enable_suffix_commitid
      value: "true"
    - name: enable_test
      value: "true"
  templates:
    - name: main
      dag:
        tasks:
          - name: git-checkout-pr
            inline:
              container:
                image: alpine:latest
                command:
                  - sh
                  - -c
                  - |
                    set -eu
                    
                    apk --update add git
          
                    cd /workdir
                    echo "Start to Clone " {{workflow.parameters.repo_url}}
                    git -C "{{workflow.parameters.repo_name}}" pull || git clone {{workflow.parameters.repo_url}} 
                    cd {{workflow.parameters.repo_name}}
          
                    echo "Start to Checkout target branch" {{workflow.parameters.target_branch}}
                    git checkout --track origin/{{workflow.parameters.target_branch}} || git checkout {{workflow.parameters.target_branch}}
                    git pull
                    
                    echo "Get commit id" 
                    git rev-parse --short origin/{{workflow.parameters.target_branch}} > /workdir/{{workflow.parameters.repo_name}}-commitid.txt
                    commitId=$(cat /workdir/{{workflow.parameters.repo_name}}-commitid.txt)
                    echo "Commit id is got: "$commitId
                                        
                    echo "Git Clone and Checkout Complete."
                volumeMounts:
                - name: "workdir"
                  mountPath: /workdir
                resources:
                  requests:
                    memory: 1Gi
                    cpu: 1
              activeDeadlineSeconds: 1200
          - name: run-test
            when: "{{workflow.parameters.enable_test}} == true"
            inline: 
              container:
                image: golang:1.22-alpine
                command:
                  - sh
                  - -c
                  - |
                    set -eu
                    
                    if [ ! -d "/workdir/pkg/mod" ]; then
                      mkdir -p /workdir/pkg/mod
                      echo "GOMODCACHE Directory /pkg/mod is created"
                    fi
                    
                    export GOMODCACHE=/workdir/pkg/mod
                    
                    cp -R /workdir/{{workflow.parameters.repo_name}} /test/{{workflow.parameters.repo_name}} 
                    echo "Start Go Test..."
                    
                    cd /test/{{workflow.parameters.repo_name}}
                    go test -v ./...
                    
                    echo "Go Test Complete."
                volumeMounts:
                - name: "workdir"
                  mountPath: /workdir
                - name: run-test
                  mountPath: /test
                resources:
                  requests:
                    memory: 4Gi
                    cpu: 2
              activeDeadlineSeconds: 1200
            depends: git-checkout-pr    
          - name: build-push-image
            inline: 
              container:
                image: moby/buildkit:v0.13.0-rootless
                command:
                  - sh
                  - -c
                  - |         
                    set -eu
                     
                    tag={{workflow.parameters.container_tag}}
                    if [ {{workflow.parameters.enable_suffix_commitid}} == "true" ]
                    then
                      commitId=$(cat /workdir/{{workflow.parameters.repo_name}}-commitid.txt)
                      tag={{workflow.parameters.container_tag}}-$commitId
                    fi
                    
                    echo "Image Tag is: "$tag
                    echo "Start to Build And Push Container Image"
                    
                    cd /workdir/{{workflow.parameters.repo_name}}
                    
                    buildctl-daemonless.sh build \
                    --frontend \
                    dockerfile.v0 \
                    --local \
                    context=. \
                    --local \
                    dockerfile=. \
                    --opt filename={{workflow.parameters.dockerfile}} \
                    --opt build-arg:GOPROXY=http://goproxy.cn,direct \
                    --output \
                    type=image,\"name={{workflow.parameters.container_image}}:${tag},{{workflow.parameters.container_image}}:latest\",push=true,registry.insecure=true \
                    --export-cache mode=max,type=registry,ref={{workflow.parameters.container_image}}:buildcache \
                    --import-cache type=registry,ref={{workflow.parameters.container_image}}:buildcache
                    
                    echo "Build And Push Container Image {{workflow.parameters.container_image}}:${tag} and {{workflow.parameters.container_image}}:latest Complete."
                env:
                  - name: BUILDKITD_FLAGS
                    value: --oci-worker-no-process-sandbox
                  - name: DOCKER_CONFIG
                    value: /.docker
                volumeMounts:
                  - name: workdir
                    mountPath: /workdir
                  - name: docker-config
                    mountPath: /.docker
                securityContext:
                  seccompProfile:
                    type: Unconfined
                  runAsUser: 1000
                  runAsGroup: 1000
                resources:
                  requests:
                    memory: 4Gi
                    cpu: 2
              activeDeadlineSeconds: 1200
            depends: run-test

Tabel berikut menjelaskan parameter yang dikonfigurasi dalam template.

Parameter

Deskripsi

Contoh

entrypoint

Menentukan template entrypoint.

main

repo_url

URL repositori Git.

https://github.com/ivan-cai/echo-server.git

repo_name

Nama repositori.

echo-server

target_branch

Branch target repositori.

Nilai default: main.

main

container_image

Gambar yang akan dibuat. Gunakan format berikut:

<ACR EE domain>/<ACR EE namespace>/<nama repositori>.

test-registry.cn-hongkong.cr.aliyuncs.com/acs/echo-server

container_tag

Tag gambar yang akan dibuat.

Nilai default: v1.0.0.

v1.0.0

dockerfile

Jalur ke Dockerfile, relatif terhadap direktori root proyek.

Nilai default: ./Dockerfile.

./Dockerfile

enable_suffix_commitid

Menentukan apakah ID commit ditambahkan ke tag gambar.

  • true: Menambahkan ID commit.

  • false: Tidak menambahkan ID commit.

Nilai default adalah true.

true

enable_test

Menentukan apakah langkah Go Test dijalankan.

  • true: Menjalankan langkah tersebut.

  • false: Tidak menjalankan langkah tersebut.

Nilai default adalah true.

true

Prasyarat

Langkah 1: Buat kredensial akses Container Registry

  1. Dapatkan file kubeconfig untuk kluster dan gunakan kubectl untuk terhubung ke kluster.

  2. Konfigurasikan kredensial akses untuk instans Container Registry Enterprise Edition. Jika Anda menggunakan nama domain VPC untuk akses, pastikan kluster dan repositori Container Registry berada dalam VPC yang sama. Jika Anda menggunakan nama domain publik, konfigurasikan kontrol akses publik.

  3. Ganti USER_NAME:PASSWORD dalam perintah berikut dengan kredensial akses instans Container Registry Enterprise Edition Anda. Kemudian, jalankan perintah tersebut untuk membuat Secret di kluster alur kerja agar dapat digunakan oleh BuildKit.

    Secret dan volume NAS yang dimount harus berada dalam namespace yang sama dengan alur kerja yang Anda kirimkan.
    kubectl create secret generic docker-config --from-literal="config.json={\"auths\": {\"<span class="hljs-variable">$repositoryDomain\": {\"auth\": \"$(echo -n <span class="var-span" contenteditable="true" data-var="USER_NAME">USER_NAME:PASSWORD|base64)</span>\"}}}"</span>

Langkah 2: Mount volume NAS

Gunakan volume NAS untuk berbagi data antar tugas alur kerja, seperti informasi repositori yang telah di-clone, serta untuk menyimpan cache Go mod, sehingga mempercepat perintah go test dan go build.

  1. Masuk ke Konsol NAS.

  2. Pada panel navigasi kiri, pilih File System > File System List.

  3. Pada halaman File System List, temukan sistem file target lalu klik Manage di kolom Actions.

  4. Pada halaman detail sistem file, klik tab Mount Targets. Di bagian Mount Target, lihat dan catat titik mount NAS.

  5. Simpan kode contoh berikut sebagai pv-nas.yaml. Ganti MOUNT_POINT dengan titik mount NAS Anda. Lalu, jalankan perintah kubectl apply -f pv-nas.yaml untuk membuat volume.

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv-nas
      labels:
        alicloud-pvname: pv-nas
    spec:
      capacity:
        storage: 100Gi
      accessModes:
        - ReadWriteMany
      csi:
        driver: nasplugin.csi.alibabacloud.com
        volumeHandle: pv-nas   # Harus sama dengan nama PV.
        volumeAttributes:
          server: MOUNT_POINT
          path: "/"
      mountOptions:
      - nolock,tcp,noresvport
      - vers=3
    ---
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: pvc-nas
    spec:
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 100Gi
      selector:
        matchLabels:
          alicloud-pvname: pv-nas

Langkah 3: Mulai alur kerja

Konsol

  1. Masuk ke Konsol Kluster Argo Workflow.

  2. Pada halaman Cluster Information, klik tab Basic Information. Di bagian Common Operations, klik Workflow Console (Argo).

  3. Pada panel navigasi kiri UI Argo, klik Cluster Workflow Templates, lalu klik nama template preset, ci-go-v1.

    image

  4. Di pojok kiri atas halaman detail template, klik + SUBMIT. Pada panel yang muncul, masukkan parameter yang diperlukan, lalu klik + SUBMIT di bagian bawah panel.

    Untuk informasi tentang parameter, lihat deskripsi parameter. Atur parameter sesuai nilai spesifik Anda.

    image

    Setelah pengiriman, Anda dapat melihat status alur kerja di halaman Workflows:

    image

Argo CLI

  1. Instal Argo CLI.

  2. Perbarui nilai parameter sesuai konfigurasi Anda berdasarkan deskripsi parameter. Simpan kode contoh berikut sebagai workflow.yaml. Lalu, jalankan perintah argo submit workflow.yaml untuk mengirimkan alur kerja.

    apiVersion: argoproj.io/v1alpha1
    kind: Workflow
    metadata:
      generateName: ci-go-v1-
      labels:
        workflows.argoproj.io/workflow-template: ackone-ci
    spec:
      arguments:
        parameters:
        - name: repo_url
          value: https://github.com/ivan-cai/echo-server.git
        - name: repo_name
          value: echo-server
        - name: target_branch
          value: main
        - name: container_image
          value: "test-registry.cn-hongkong.cr.aliyuncs.com/acs/echo-server"
        - name: container_tag
          value: "v1.0.0"
        - name: dockerfile
          value: ./Dockerfile
        - name: enable_suffix_commitid
          value: "true"
        - name: enable_test
          value: "true"
      workflowTemplateRef:
        name: ci-go-v1
        clusterScope: true