日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

使用Jenkins實(shí)現(xiàn)鏡像的CI/CD

更新時(shí)間:

若您期望實(shí)現(xiàn)從源代碼自動構(gòu)建、推送鏡像到最終部署應(yīng)用的一體化自動化操作。您可以使用Jenkins實(shí)現(xiàn)鏡像的CI/CD,只要您在GitLab中提交源代碼,容器鏡像會自動使用源代碼構(gòu)建鏡像,容器服務(wù)會自動拉取鏡像部署應(yīng)用,并自動發(fā)送事件通知到釘釘群。

前提條件

使用Jenkins實(shí)現(xiàn)鏡像的CI

只要您在GitLab中提交源代碼,容器鏡像會自動使用源代碼構(gòu)建鏡像,然后您可以對鏡像進(jìn)行漏洞掃描,鏡像掃描完成后,將自動發(fā)送事件通知到釘釘群。

  1. 在GitLab中創(chuàng)建項(xiàng)目。

    1. 登錄GitLab。

    2. 在頂部導(dǎo)航欄中,選擇Projects > Your projects

    3. Projects頁面單擊右上角的New Project,單擊Create blank project。

    4. Create blank project頁面設(shè)置Project nameProject URLProject slug,設(shè)置Visibility LevelPrivate,然后單擊Create project。

      創(chuàng)建Project

    5. 使用以下內(nèi)容,在本地創(chuàng)建Dockerfile、pom.xml、DemoApplication.javaHelloController.java文件。

      • 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. 執(zhí)行以下命令,上傳構(gòu)建文件至GitLab。

      cd java-web  #進(jìn)入構(gòu)建文件所在目錄。
      git remote set-url origin http://8.218.20*.***/shoppingmall/java-web.git
      git push origin master
      * [new branch]      master -> master
  2. 在Jenkins配置構(gòu)建鏡像的流水線。

    1. 在Jenkins配置GitLab的SSH Key。

      1. 登錄Jenkins。

      2. 在Jenkins左側(cè)導(dǎo)航欄單擊系統(tǒng)管理

      3. 安全區(qū)域單擊Manage Credentials。

      4. Stores scoped to Jenkins區(qū)域單擊存儲列下的Jenkins,然后單擊全局憑據(jù)。

      5. 在左側(cè)導(dǎo)航欄單擊添加憑據(jù)

      6. 設(shè)置類型為SSH Username with private key,然后輸入描述Username,選中Enter directly,然后單擊確定。

        全局憑據(jù)頁面會自動生成憑據(jù)ID,保存該憑據(jù)ID。

    2. 創(chuàng)建流水線。

      1. 在Jenkins左側(cè)導(dǎo)航欄單擊新建任務(wù)。

      2. 輸入任務(wù)名稱,選中流水線,單擊確定。

      3. 單擊構(gòu)建觸發(fā)器頁簽,選中Build when a change is pushed to GitLab,然后選中Push Events

        Build when a change is pushed to GitLab右側(cè)記錄Webhook的地址。

      4. 單擊高級,單擊Secret token右下角的Generate。

        Jenkins會生成一個(gè)Secret token,保存該Secret token。

      5. 單擊流水線頁簽,根據(jù)實(shí)際情況修改以下模板,然后將內(nèi)容復(fù)制到文本框中,然后單擊保存。

        def git_auth_id = "6d5a2c06-f0a7-43c8-9b79-37b8c266****"  #憑據(jù)ID
        def git_branch_name = "master" #分支名
        def git_url = "git@172.16.1*.***:shoppingmall/java-web.git"   #GitLab倉庫地址
        def acr_url = "s*****-devsecops-registry.cn-hongkong.cr.aliyuncs.com"  #鏡像倉庫地址
        def acr_username = "acr_test_*****@test.aliyunid.com"   #容器鏡像用戶名
        def acr_password = "HelloWorld2021"   #容器鏡像密碼
        def acr_namespace = "ns"    #命名空間
        def acr_repo_name = "test"   #鏡像倉庫名稱
        def tag_version = "0.0.1"   #鏡像版本
        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. 添加Webhook地址到GitLab中。

    1. 登錄GitLab。

    2. Projects頁面單擊上文創(chuàng)建的Project名稱。

    3. 在左側(cè)導(dǎo)航欄選擇Settings > Webhooks,輸入Webhook地址和Secret token,取消選中Enable SSL verification,然后單擊Add webhooks。

  4. 創(chuàng)建事件通知。

    1. 登錄容器鏡像服務(wù)控制臺。

    2. 在頂部菜單欄,選擇所需地域。

    3. 在左側(cè)導(dǎo)航欄,選擇實(shí)例列表。

    4. 實(shí)例列表頁面單擊目標(biāo)企業(yè)版實(shí)例。

    5. 在實(shí)例詳情頁面左側(cè)導(dǎo)航欄選擇實(shí)例管理 > 事件通知 。

    6. 事件規(guī)則頁簽下單擊創(chuàng)建規(guī)則。

    7. 事件范圍配置向?qū)е性O(shè)置規(guī)則名稱,事件類型鏡像掃描完成,選中掃描完成,設(shè)置生效范圍命名空間,選擇命名空間為ns,然后單擊下一步。

    8. 事件通知配置向?qū)е性O(shè)置通知方式釘釘,輸入釘釘?shù)腤ebhook地址和加簽密鑰,然后單擊保存。

  5. 觸發(fā)鏡像構(gòu)建。

    執(zhí)行以下命令,修改HelloController.java文件,提交文件到GitLab中,從而觸發(fā)鏡像構(gòu)建。

    vim java/com/example/demo/HelloController.java #根據(jù)實(shí)際情況在本地修改HelloController.java文件
    git add . && git commit -m 'commit' && git push origin #提交文件到GitLab

    稍等一段時(shí)間,在企業(yè)版實(shí)例詳情頁面左側(cè)導(dǎo)航欄選擇倉庫管理 > 鏡像倉庫,在右側(cè)頁面單擊目標(biāo)倉庫test,在倉庫管理頁面左側(cè)導(dǎo)航欄單擊鏡像版本,可以看到鏡像版本頁面生成一個(gè)鏡像。

  6. 設(shè)置漏洞掃描。

    1. 在鏡像版本頁面單擊目標(biāo)鏡像右側(cè)操作下的安全掃描。

    2. 安全掃描頁面,單擊立即掃描。

      待鏡像掃描完成后,您可以在釘釘群里收到通知。

使用Jenkins實(shí)現(xiàn)鏡像的CD

只要您在GitLab中提交源代碼,容器鏡像會自動用源代碼構(gòu)建鏡像,鏡像構(gòu)建成功后,自動觸發(fā)執(zhí)行交付鏈,待交付鏈運(yùn)行完成后,將自動發(fā)送HTTP請求至Jenkins,然后觸發(fā)ACK的Deployment重新拉取鏡像部署應(yīng)用。

  1. 創(chuàng)建應(yīng)用。

    1. 登錄容器服務(wù)管理控制臺。

    2. 在控制臺左側(cè)導(dǎo)航欄,單擊集群。

    3. 集群列表頁面,單擊目標(biāo)集群名稱或者目標(biāo)集群右側(cè)操作列下的詳情。

    4. 在集群管理頁左側(cè)導(dǎo)航欄,選擇工作負(fù)載 > 無狀態(tài)

    5. 無狀態(tài)頁面單擊右上角的使用YAML創(chuàng)建資源。

    6. 創(chuàng)建頁面頂部選擇命名空間,設(shè)置示例模板自定義,然后復(fù)制以下內(nèi)容到模板中,然后單擊創(chuàng)建

      說明

      沒有設(shè)置免密拉取鏡像,您需要在容器鏡像服務(wù)中開啟公網(wǎng)訪問,并設(shè)置鏡像為公開鏡像。具體操作,請參見配置公網(wǎng)的訪問控制

      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. 無狀態(tài)頁面單擊目標(biāo)應(yīng)用demo,單擊訪問方式頁簽。

      訪問方式頁簽下獲取外部端點(diǎn)地址。

    8. 在本地hosts綁定以下內(nèi)容。

      <外部端點(diǎn)地址> app.demo.example.com
    9. 在瀏覽器中輸入app.demo.example.com。

      應(yīng)用看到以上頁面,說明應(yīng)用部署成功。

  2. 創(chuàng)建觸發(fā)器。

    1. 在無狀態(tài)頁面單擊目標(biāo)應(yīng)用demo的名稱。

    2. 在應(yīng)用詳情頁面單擊觸發(fā)器頁簽,單擊創(chuàng)建觸發(fā)器

    3. 創(chuàng)建觸發(fā)器對話框設(shè)置觸發(fā)器行為重新部署,然后單擊確定

      觸發(fā)器頁簽下獲取觸發(fā)器鏈接。

  3. 創(chuàng)建流水線。

    1. 登錄Jenkins。

    2. 在左側(cè)導(dǎo)航欄單擊新建任務(wù)。

    3. 輸入任務(wù)名稱,單擊流水線

    4. 單擊構(gòu)建觸發(fā)器頁簽,選中Generic Webhook Trigger。

      Generic Webhook Trigger下可以獲取HTTP請求觸發(fā)地址為JENKINS_URL/generic-webhook-trigger/invoke,本文設(shè)置Generic Webhook tokenhelloworld2021,因此Webhook地址為JENKINS_URL/generic-webhook-trigger/invoke?token=helloworld2021。

    5. 單擊流水線頁簽,根據(jù)實(shí)際情況修改以下模板中的Generic Webhook token和觸發(fā)器鏈接,然后將內(nèi)容復(fù)制到文本框中,然后單擊保存。

      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: 'Triggered on $ref',
           token: 'helloworld2021',   #Generic Webhook token,請根據(jù)實(shí)際情況替換。
           tokenCredentialId: '',
           printContributedVariables: true,
           printPostContent: true,
           silentResponse: false,
           regexpFilterText: '$ref'
          )
        }
        stages {
          stage('Some step') {
            steps {
              sh "echo 'will print post content'"
              sh "echo $InstanceId"
              sh "echo $RepoNamespaceName"
              sh "echo $RepoName"
              sh "echo $Tag"
              sh "echo 'redeploy to ACK or you can deoloy to other platforms use before message'"
              sh "curl 'https://cs.console.aliyun.com/hook/trigger?token=g****'  #觸發(fā)器鏈接,請根據(jù)實(shí)際情況替換。
              sh "echo 'done'"
            }
          }
        }
      }
  4. 創(chuàng)建交付鏈。具體操作。請參見創(chuàng)建交付鏈。

  5. 創(chuàng)建事件規(guī)則。

    1. 在企業(yè)版實(shí)例管理頁面左側(cè)導(dǎo)航欄中選擇實(shí)例管理 > 事件通知。

    2. 事件規(guī)則頁簽下單擊創(chuàng)建規(guī)則。

    3. 事件范圍配置向?qū)е性O(shè)置規(guī)則名稱,事件類型交付鏈處理完成,選中成功,設(shè)置生效范圍命名空間,選擇命名空間為ns,然后單擊下一步。

    4. 事件通知配置向?qū)е性O(shè)置通知方式HTTP,輸入步驟3獲取的Webhook地址,然后單擊保存。

  6. 執(zhí)行以下命令,修改HelloController.java文件,提交代碼到GitLab中,從而觸發(fā)鏡像構(gòu)建。

    vim java/com/example/demo/HelloController.java #根據(jù)實(shí)際情況在本地修改HelloController.java文件。
    git add . && git commit -m 'add update' && git push origin   #提交文件到GitLab中。

    鏡像構(gòu)建成功后,觸發(fā)執(zhí)行交付鏈,交付鏈執(zhí)行完畢后,觸發(fā)ACK的Deployment重新拉取鏡像部署應(yīng)用。

  7. 執(zhí)行以下命令,驗(yàn)證應(yīng)用是否重新部署。

    curl app.demo.example.com

    可以看到輸出內(nèi)容發(fā)生了變化, 說明應(yīng)用重新部署成功。