全部产品
Search
文档中心

Container Registry:Gunakan Jenkins untuk membuat alur kerja CI/CD citra

更新时间:Oct 01, 2025

Untuk mengotomatiskan proses mulai dari pembuatan kode sumber, penekanan citra hingga penerapan aplikasi, Anda dapat menggunakan Jenkins untuk membuat alur kerja integrasi berkelanjutan atau pengiriman berkelanjutan (CI/CD) citra. Setelah melakukan commit kode sumber ke GitLab, Container Registry secara otomatis membangun citra dari kode tersebut. Kemudian, Container Service for Kubernetes (ACK) menarik citra tersebut untuk menerapkan aplikasi, dan Container Registry mengirimkan notifikasi peristiwa ke grup DingTalk.

Prasyarat

  • Git, GitLab, dan Jenkins telah diinstal.

    Catatan

    JDK8, bukan JDK11, diinstal pada GitLab karena beberapa plugin GitLab tidak kompatibel dengan JDK11.

  • Sebuah instans Edisi Perusahaan Container Registry telah dibuat, dan akses Internet telah diaktifkan. Untuk informasi lebih lanjut, lihat Buat instans Edisi Perusahaan Container Registry dan Konfigurasikan akses melalui Internet.

  • Sebuah kluster ACK yang berada di wilayah yang sama dengan instans Edisi Lanjutan Container Registry Enterprise Edition telah dibuat. Untuk informasi lebih lanjut, lihat Buat kluster ACK yang dikelola.

  • Sebuah chatbot DingTalk telah dibuat. URL webhook dan token rahasia dari chatbot DingTalk telah dicatat. Untuk informasi lebih lanjut, lihat Langkah 1: Buat chatbot DingTalk.

  • Untuk menggunakan fitur alur kerja Container Registry, Anda harus meningkatkan instans ke Edisi Lanjutan. Untuk informasi lebih lanjut, lihat Aturan penagihan.

Gunakan Jenkins untuk membuat alur kerja CI citra

Setelah melakukan commit kode sumber ke GitLab, Container Registry secara otomatis membangun sebuah citra dari kode tersebut. Setelah pemindaian citra selesai, Container Registry mengirimkan notifikasi peristiwa ke grup DingTalk.

  1. Buat proyek di GitLab.

    1. Masuk log ke GitLab.

    2. Di bilah navigasi atas konsol GitLab, pilih Projects > Your projects.

    3. Pada halaman Your projects, klik New Project di pojok kanan atas lalu pilih Create blank project.

    4. Pada halaman Create blank project, konfigurasikan parameter Project name, Project URL, dan Project slug. Atur Visibility Level ke Private, lalu klik Create project.

      Membuat Proyek

    5. Buat file Dockerfile, pom.xml, DemoApplication.java, dan HelloController.java di komputer lokal Anda.

      • Dockerfile

        FROM registry.cn-hangzhou.aliyuncs.com/public-toolbox/maven:3.8.3-openjdk-8-aliyun AS build
        COPY src /home/app/src
        COPY pom.xml /home/app
        RUN ["/usr/local/bin/mvn-entrypoint.sh","mvn","-f","/home/app/pom.xml","clean","package","-Dmaven.test.skip=true"]
        
        FROM registry.cn-hangzhou.aliyuncs.com/public-toolbox/openjdk:8-jdk-alpine
        COPY --from=build /home/app/target/demo-0.0.1-SNAPSHOT.jar /usr/local/lib/demo-0.0.1-SNAPSHOT.jar
        EXPOSE 8080
        ENTRYPOINT ["java","-jar","/usr/local/lib/demo-0.0.1-SNAPSHOT.jar"]
      • pom.xml

        <?xml version="1.0" encoding="UTF-8"?>
        <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
            <modelVersion>4.0.0</modelVersion>
            <parent>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-parent</artifactId>
                <version>2.6.1</version>
                <relativePath/> <!-- lookup parent from repository -->
            </parent>
            <groupId>com.example</groupId>
            <artifactId>demo</artifactId>
            <version>0.0.1-SNAPSHOT</version>
            <name>demo</name>
            <description>Demo project for Spring Boot</description>
            <properties>
                <java.version>1.8</java.version>
            </properties>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-freemarker</artifactId>
                </dependency>
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-web</artifactId>
                </dependency>
        
                <dependency>
                    <groupId>org.projectlombok</groupId>
                    <artifactId>lombok</artifactId>
                    <optional>true</optional>
                </dependency>
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-test</artifactId>
                    <scope>test</scope>
                </dependency>
                <dependency>
                    <groupId>org.apache.logging.log4j</groupId>
                    <artifactId>log4j-core</artifactId>
                    <version>2.13.2</version>
                </dependency>
            </dependencies>
        
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-maven-plugin</artifactId>
                        <configuration>
                            <excludes>
                                <exclude>
                                    <groupId>org.projectlombok</groupId>
                                    <artifactId>lombok</artifactId>
                                </exclude>
                            </excludes>
                        </configuration>
                    </plugin>
                </plugins>
            </build>
        
        </project>
      • DemoApplication.java

        package com.example.demo;
        
        import org.springframework.boot.SpringApplication;
        import org.springframework.boot.autoconfigure.SpringBootApplication;
        
        import java.util.TimeZone;
        
        @SpringBootApplication
        public class DemoApplication {
        
            public static void main(String[] args) {
                TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));
                SpringApplication.run(DemoApplication.class, args);
            }
        
        }
      • HelloController.java

        package com.example.demo;
        
        import lombok.extern.slf4j.Slf4j;
        import org.springframework.web.bind.annotation.RequestMapping;
        import org.springframework.web.bind.annotation.RestController;
        
        import javax.servlet.http.HttpServletRequest;
        import java.text.SimpleDateFormat;
        import java.util.Date;
        
        @RestController
        @Slf4j
        public class HelloController {
        
            @RequestMapping({"/hello", "/"})
            public String hello(HttpServletRequest request) {
                return "Hello World at " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
            }
        }
    6. Jalankan perintah berikut untuk mengunggah file bangunan ke GitLab:

      cd java-web  # Pergi ke direktori tempat file bangunan berada.
      git remote set-url origin http://8.218.20*.***/shoppingmall/java-web.git
      git push origin master
      * [new branch]      master -> master
  2. Buat alur kerja untuk membangun citra di Jenkins.

    1. Konfigurasikan pasangan kunci Secure Shell (SSH) GitLab di Jenkins.

      1. Masuk log ke Jenkins.

      2. Di bilah navigasi kiri dasbor Jenkins, klik Manage Jenkins.

      3. Di bagian Security, klik Manage Credentials.

      4. Di bagian Stores scoped to Jenkins, klik Jenkins di kolom Store, lalu klik Global credentials.

      5. Di bilah navigasi kiri, klik Add Credentials.

      6. Atur parameter Kind ke SSH Username with private key, masukkan nilai untuk parameter Description dan Username, pilih Enter directly, lalu klik OK.

        Pada halaman Global credentials, ID kredensial akan dibuat secara otomatis. Catat ID tersebut.

    2. Buat alur kerja.

      1. Di bilah navigasi kiri dasbor Jenkins, klik New Item.

      2. Masukkan nama untuk alur kerja, pilih Pipeline, lalu klik OK.

      3. Klik tab Build Triggers, pilih Build when a change is pushed to GitLab, lalu pilih Push Events.

        Catat URL webhook di sebelah kanan Build when a change is pushed to GitLab.

      4. Klik Advanced lalu klik Generate di pojok kanan bawah Secret token.

        Catat token rahasia yang dihasilkan oleh Jenkins.

      5. Klik tab Pipeline, dan ganti nilai parameter dalam templat berikut dengan nilai aktual Anda. Salin konten yang telah Anda modifikasi ke editor kode, lalu klik Save.

        def git_auth_id = "6d5a2c06-f0a7-43c8-9b79-37b8c266****" # ID kredensial.
        def git_branch_name = "master" # Nama cabang.
        def git_url = "git@172.16.1*.***:shoppingmall/java-web.git" # Alamat repositori GitLab.
        def acr_url = "s*****-devsecops-registry.cn-hongkong.cr.aliyuncs.com" # Titik akhir repositori citra.
        def acr_username = "acr_test_*****@test.aliyunid.com" # Nama pengguna citra kontainer.
        def acr_password = "HelloWorld2021" # Kata sandi citra kontainer.
        def acr_namespace = "ns" # Nama namespace.
        def acr_repo_name = "test" # Nama repositori citra.
        def tag_version = "0.0.1" # Tag citra kontainer.
        node {
        
            stage('checkout git repo') {
                checkout([$class: 'GitSCM', branches: [[name: "*/${git_branch_name}"]], extensions: [], userRemoteConfigs: [[credentialsId: "${git_auth_id}", url: "${git_url}"]]])
            }
            stage('build image') {
                sh "sudo docker build -t java-web:${tag_version} ."
                sh "sudo docker tag java-web:${tag_version} ${acr_url}/${acr_namespace}/${acr_repo_name}:${tag_version}"
            }
            stage('push image') {
                sh "sudo docker login --username=${acr_username} --password=${acr_password} ${acr_url}"
                sh "sudo docker push ${acr_url}/${acr_namespace}/${acr_repo_name}:${tag_version}"
            }
        }
  3. Tambahkan URL webhook ke GitLab.

    1. Masuk log ke GitLab.

    2. Pada halaman Projects, klik nama proyek yang Anda buat.

    3. Di bilah navigasi kiri, pilih Settings > Webhooks. Masukkan URL webhook dan token rahasia, hapus centang Enable SSL verification, lalu klik Add webhooks.

  4. Buat aturan notifikasi peristiwa.

    1. Masuk log ke Konsol Container Registry.

    2. Di bilah navigasi atas, pilih wilayah.

    3. Di bilah navigasi kiri, klik Instances.

    4. Pada halaman Instances, klik instans Edisi Perusahaan yang ingin Anda kelola.

    5. Di bilah navigasi kiri halaman detail instans, pilih Instances > Event Notification.

    6. Pada tab Event Rules, klik Create Rule.

    7. Pada langkah Event Scope wizard Buat Aturan, masukkan nilai untuk parameter Rule Name, atur parameter Event Type ke The image is scanned, pilih Scan Completed, atur Effective Scope ke Namespace, pilih ns sebagai nama namespace, lalu klik Next.

    8. Pada langkah Event Notification, atur Notification Method ke DingTalk, masukkan URL webhook dan token rahasia dari chatbot DingTalk, lalu klik Save.

  5. Pemicu pembuatan citra.

    Jalankan perintah berikut dan ganti nilai parameter dalam file HelloController.java dengan nilai aktual Anda. Commit file ke GitLab untuk memicu pembuatan citra.

    vim java/com/example/demo/HelloController.java # Ganti nilai parameter dalam file HelloController.java dengan nilai aktual Anda.
    git add . && git commit -m 'commit' && git push origin # Commit file ke GitLab.

    Tunggu sejenak. Di bilah navigasi kiri halaman detail instans Edisi Perusahaan Container Registry, pilih Repository > Repositories. Di sisi kanan halaman yang muncul, klik repositori test. Di bilah navigasi kiri halaman manajemen repositori, klik Tags. Sebuah citra dihasilkan pada halaman Tags.

  6. Konfigurasikan pemindaian keamanan.

    1. Pada halaman Tag, klik Security Scan di kolom Tindakan citra.

    2. Pada halaman Pemindaian Keamanan, klik Scan Now.

      Setelah citra dipindai, Container Registry mengirimkan notifikasi ke grup DingTalk.

Gunakan Jenkins untuk membuat alur kerja CD citra

Setelah melakukan commit kode sumber di GitLab, Container Registry secara otomatis membangun sebuah citra dari kode tersebut. Setelah citra dibangun, rantai pengiriman dipicu secara otomatis. Setelah rantai pengiriman dieksekusi, permintaan HTTP dikirim secara otomatis ke Jenkins. Lalu, Deployment di ACK dipicu untuk menarik citra lagi guna menerapkan aplikasi.

  1. Buat aplikasi.

    1. Masuk log ke Konsol ACK.

    2. Di bilah navigasi kiri konsol ACK, klik Clusters.

    3. Pada halaman Clusters, temukan kluster yang ingin Anda kelola dan klik nama kluster atau klik Details di kolom Actions. Halaman detail kluster muncul.

    4. Di bilah navigasi kiri halaman detail, pilih Workloads > Deployments.

    5. Pada halaman Deployments, pilih nilai untuk Namespace, lalu klik Create from YAML.

    6. Pada halaman Create, pilih Custom dari daftar drop-down Sample Template, salin konten berikut ke templat, lalu klik Create.

      Catatan

      Jika Anda tidak mengaktifkan fitur menarik citra tanpa rahasia di ACK dan Container Registry, Anda harus mengaktifkan fitur akses melalui Internet di Container Registry dan mengatur tipe citra ke publik. Untuk informasi lebih lanjut, lihat Konfigurasikan akses melalui Internet.

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        creationTimestamp: null
        labels:
          app: demo
        name: demo
      spec:
        replicas: 3
        minReadySeconds: 5
        progressDeadlineSeconds: 60
        revisionHistoryLimit: 5
        selector:
          matchLabels:
            app: demo
        strategy:
          rollingUpdate:
            maxUnavailable: 1
          type: RollingUpdate
        template:
          metadata:
            annotations:
              prometheus.io/port: "9797"
              prometheus.io/scrape: "true"
            creationTimestamp: null
            labels:
              app: demo
          spec:
            containers:
            - image: s*****-devsecops-registry.cn-hongkong.cr.aliyuncs.com/ns/test:0.0.1 
              imagePullPolicy: Always
              name: demo
              ports:
              - containerPort: 8080
                name: http
                protocol: TCP
              readinessProbe:
                initialDelaySeconds: 5
                tcpSocket:
                  port: 8080
                timeoutSeconds: 5
              resources:
                limits:
                  cpu: "2"
                  memory: 512Mi
                requests:
                  cpu: 100m
                  memory: 64Mi
      status: {}
      ---
      apiVersion: v1
      kind: Service
      metadata:
        name: demo-svc
      spec:
        selector:
          app: demo
        ports:
          - protocol: TCP
            port: 80
            targetPort: 8080
      ---
      apiVersion: extensions/v1beta1
      kind: Ingress
      metadata:
        name: demo
        labels:
          app: demo
      spec:
        rules:
          - host: app.demo.example.com
            http:
              paths:
                - backend:
                    serviceName: demo-svc
                    servicePort: 80
      ---
                                      
    7. Pada halaman Deployments, klik nama aplikasi demo. Klik tab Access Method.

      Peroleh titik akhir eksternal pada tab Access Method.

    8. Masukkan konten berikut untuk host lokal.

      <Titik akhir eksternal> app.demo.example.com
    9. Masukkan app.demo.example.com di bilah alamat browser.

      AplikasiJika halaman muncul seperti yang ditunjukkan pada gambar sebelumnya, aplikasi telah diterapkan.

  2. Buat pemicu aplikasi.

    1. Pada halaman Deployment, klik nama aplikasi demo.

    2. Pada halaman detail aplikasi, klik tab Triggers. Lalu, klik Create Trigger.

    3. Di kotak dialog Create Trigger, atur Action ke Redeploy dan klik OK.

      Peroleh URL webhook pada tab Triggers.

  3. Buat alur kerja.

    1. Masuk log ke Jenkins.

    2. Di bilah navigasi kiri, klik New Item.

    3. Masukkan nama untuk alur kerja dan klik Pipeline.

    4. Klik tab Build Trigger dan pilih Generic Webhook Trigger.

      Di bagian Generic Webhook Trigger, Anda dapat memperoleh URL webhook dari permintaan HTTP, yaitu JENKINS_URL/generic-webhook-trigger/invoke. Pada contoh ini, token webhook generik diatur sebagai helloworld2021. Dengan demikian, URL webhook menjadi JENKINS_URL/generic-webhook-trigger/invoke?token=helloworld2021.

    5. Klik tab Pipeline, dan ganti token webhook generik dan URL webhook dalam templat berikut dengan nilai aktual Anda. Salin konten yang telah Anda modifikasi ke editor kode, lalu klik Save.

      pipeline {
        agent any
        triggers {
          GenericTrigger(
           genericVariables: [
            [key: 'InstanceId', value: '$.data.InstanceId'],   
            [key: 'RepoNamespaceName', value: '$.data.RepoNamespaceName'],
            [key: 'RepoName', value: '$.data.RepoName'],
            [key: 'Tag', value: '$.data.Tag']
           ],
           causeString: 'Dipicu pada $ref',
           token: 'helloworld2021', # Token webhook generik. Ganti token dengan nilai aktual Anda.
           tokenCredentialId: '',
           printContributedVariables: true,
           printPostContent: true,
           silentResponse: false,
           regexpFilterText: '$ref'
          )
        }
        stages {
          stage('Beberapa langkah') {
            steps {
              sh "echo 'akan mencetak konten post'"
              sh "echo $InstanceId"
              sh "echo $RepoNamespaceName"
              sh "echo $RepoName"
              sh "echo $Tag"
              sh "echo 'redeploy ke ACK atau Anda bisa menerapkan ke platform lain menggunakan pesan sebelumnya'"
              sh "curl 'https://cs.console.alibabacloud.com/hook/trigger?token=g****' # Ganti URL webhook dengan nilai aktual Anda.
              sh "echo 'selesai'"
            }
          }
        }
      }
  4. Buat alur kerja. Untuk informasi lebih lanjut, lihat Buat rantai pengiriman.

  5. Buat aturan notifikasi peristiwa.

    1. Di bilah navigasi kiri halaman manajemen instans Edisi Perusahaan Container Registry, pilih Instances > Event Notification.

    2. Pada tab Event Rules, klik Create Rule.

    3. Pada langkah Event Scope wizard Buat Aturan, masukkan nama untuk parameter Rule Name, atur Event Type ke The delivery chain is processed, pilih Success, atur Effective Scope ke Namespace, pilih ns dari daftar drop-down Namespace, lalu klik Next.

    4. Pada langkah Event Notification, atur parameter Notification Method ke HTTP, masukkan URL webhook yang Anda peroleh di Langkah 3, lalu klik Save.

  6. Jalankan perintah berikut dan ganti nilai parameter dalam file HelloController.java dengan nilai aktual Anda. Commit kode ke GitLab untuk memicu pembuatan citra.

    vim java/com/example/demo/HelloController.java # Ganti nilai parameter dalam file HelloController.java dengan nilai aktual Anda.
    git add . && git commit -m 'add update' && git push origin   # Commit file ke GitLab.

    Setelah citra dibangun, rantai pengiriman dipicu. Setelah rantai pengiriman dieksekusi, Deployment di ACK dipicu untuk menarik citra lagi guna menerapkan aplikasi.

  7. Jalankan perintah berikut untuk memeriksa apakah aplikasi diterapkan ulang.

    curl app.demo.example.com

    Jika keluaran perintah berubah, aplikasi diterapkan ulang.