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.
CatatanJDK8, 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.
Buat proyek di GitLab.
Masuk log ke GitLab.
Di bilah navigasi atas konsol GitLab, pilih .
Pada halaman Your projects, klik New Project di pojok kanan atas lalu pilih Create blank project.
Pada halaman Create blank project, konfigurasikan parameter Project name, Project URL, dan Project slug. Atur Visibility Level ke Private, lalu klik Create project.

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()); } }
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
Buat alur kerja untuk membangun citra di Jenkins.
Konfigurasikan pasangan kunci Secure Shell (SSH) GitLab di Jenkins.
Masuk log ke Jenkins.
Di bilah navigasi kiri dasbor Jenkins, klik Manage Jenkins.
Di bagian Security, klik Manage Credentials.
Di bagian Stores scoped to Jenkins, klik Jenkins di kolom Store, lalu klik Global credentials.
Di bilah navigasi kiri, klik Add Credentials.
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.
Buat alur kerja.
Di bilah navigasi kiri dasbor Jenkins, klik New Item.
Masukkan nama untuk alur kerja, pilih Pipeline, lalu klik OK.
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.
Klik Advanced lalu klik Generate di pojok kanan bawah Secret token.
Catat token rahasia yang dihasilkan oleh Jenkins.
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}" } }
Tambahkan URL webhook ke GitLab.
Masuk log ke GitLab.
Pada halaman Projects, klik nama proyek yang Anda buat.
Di bilah navigasi kiri, pilih . Masukkan URL webhook dan token rahasia, hapus centang Enable SSL verification, lalu klik Add webhooks.
Buat aturan notifikasi peristiwa.
Masuk log ke Konsol Container Registry.
Di bilah navigasi atas, pilih wilayah.
Di bilah navigasi kiri, klik Instances.
Pada halaman Instances, klik instans Edisi Perusahaan yang ingin Anda kelola.
Di bilah navigasi kiri halaman detail instans, pilih .
Pada tab Event Rules, klik Create Rule.
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.
Pada langkah Event Notification, atur Notification Method ke DingTalk, masukkan URL webhook dan token rahasia dari chatbot DingTalk, lalu klik Save.
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 . Di sisi kanan halaman yang muncul, klik repositori test. Di bilah navigasi kiri halaman manajemen repositori, klik Tags. Sebuah citra dihasilkan pada halaman Tags.
Konfigurasikan pemindaian keamanan.
Pada halaman Tag, klik Security Scan di kolom Tindakan citra.
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.
Buat aplikasi.
Masuk log ke Konsol ACK.
Di bilah navigasi kiri konsol ACK, klik Clusters.
Pada halaman Clusters, temukan kluster yang ingin Anda kelola dan klik nama kluster atau klik Details di kolom Actions. Halaman detail kluster muncul.
Di bilah navigasi kiri halaman detail, pilih .
Pada halaman Deployments, pilih nilai untuk Namespace, lalu klik Create from YAML.
Pada halaman Create, pilih Custom dari daftar drop-down Sample Template, salin konten berikut ke templat, lalu klik Create.
CatatanJika 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 ---Pada halaman Deployments, klik nama aplikasi demo. Klik tab Access Method.
Peroleh titik akhir eksternal pada tab Access Method.
Masukkan konten berikut untuk host lokal.
<Titik akhir eksternal> app.demo.example.comMasukkan app.demo.example.com di bilah alamat browser.
Jika halaman muncul seperti yang ditunjukkan pada gambar sebelumnya, aplikasi telah diterapkan.
Buat pemicu aplikasi.
Pada halaman Deployment, klik nama aplikasi demo.
Pada halaman detail aplikasi, klik tab Triggers. Lalu, klik Create Trigger.
Di kotak dialog Create Trigger, atur Action ke Redeploy dan klik OK.
Peroleh URL webhook pada tab Triggers.
Buat alur kerja.
Masuk log ke Jenkins.
Di bilah navigasi kiri, klik New Item.
Masukkan nama untuk alur kerja dan klik Pipeline.
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 sebagaihelloworld2021. Dengan demikian, URL webhook menjadiJENKINS_URL/generic-webhook-trigger/invoke?token=helloworld2021.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'" } } } }
Buat alur kerja. Untuk informasi lebih lanjut, lihat Buat rantai pengiriman.
Buat aturan notifikasi peristiwa.
Di bilah navigasi kiri halaman manajemen instans Edisi Perusahaan Container Registry, pilih .
Pada tab Event Rules, klik Create Rule.
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.
Pada langkah Event Notification, atur parameter Notification Method ke HTTP, masukkan URL webhook yang Anda peroleh di Langkah 3, lalu klik Save.
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.
Jalankan perintah berikut untuk memeriksa apakah aplikasi diterapkan ulang.
curl app.demo.example.comJika keluaran perintah berubah, aplikasi diterapkan ulang.