jenkins中使用Pipeline script 和Pipeline script from SCM的区别

Pipeline script from SCM

Pipeline script from SCM是从git上拉取Dockerfile,使用Dockerfile中的script去执行,但是要注意的是,当Dockerfile和代码在一个repo的时候,拉取Dockerfile其他代码也会一同拉取下来,因此脚本要把git credentialsId: 'admin', url: 'ssh://git@192.168.1.156:7999/aut/locust_test.git'给注释掉,举个例子:
比如Dockerfile中的脚本是这样的:

pipeline {
    agent {
        docker { image 'docker.io/beck123/locust:v1'}
    }
    
    
    
    stages {
        stage("Git checkout") {
            steps {
                // sh '''
                //     if [ -d locust_test ]
                //     then
                //       rm -f locust_test
                //     fi
                //    '''
                sh '''
                echo "拉取代码前容器内部的文件:"
                ls -l
                '''
                //git credentialsId: 'admin', url: 'ssh://git@192.168.1.156:7999/aut/locust_test.git'
            }
        }
            
        stage('Test') {
            steps {
                sh '''
                    echo "拉取代码后容器内部的文件:"
                    ls -l
                    locust -f src/locustfile.py --headless -u 100 -r 5 -t 120s -H http://192.168.1.2:8099
                   '''
            }
        }
    }
}

如果把jenkins workshop下的locust_test文件删了,会发现拉取前和拉取后的文件时间都一样

实际上开始拉取Dockerfile的时候,其他代码就一起拉下来了

Pipeline script

使用Pipeline script,就需要在jenkins pipline的脚本里定义git credentialsId: 'admin', url: 'ssh://git@192.168.1.156:7999/aut/locust_test.git',不能注释掉,否则代码不会拉下来

pipeline {
    agent {
        docker { image 'docker.io/beck123/locust:v1'}
    }
    
    
    
    stages {
        stage("Git checkout") {
            steps {
                // sh '''
                //     if [ -d locust_test ]
                //     then
                //       rm -f locust_test
                //     fi
                //    '''
                sh '''
                echo "拉取代码前容器内部的文件:"
                ls -l
                '''
                git credentialsId: 'admin', url: 'ssh://git@192.168.1.156:7999/aut/locust_test.git'
            }
        }
            
        stage('Test') {
            steps {
                sh '''
                    echo "拉取代码后容器内部的文件:"
                    ls -l
                    locust -f src/locustfile.py --headless -u 100 -r 5 -t 120s -H http://192.168.1.2:8099
                   '''
            }
        }
    }
}

一个发现

如果仔细看jenkins home下的workspace,会发现即使容器销毁了,这里也会保留一个代码目录,我猜测这可能是docker容器的数据卷,容器创建后自动挂载到这个目录上,本身容器内也就相当于有了一份代码数据,如果代码有更新,那么只拉取更新部分的

[root@k8s-master workspace]# cd /var/lib/jenkins/workspace/
[root@k8s-master workspace]# pwd
/var/lib/jenkins/workspace
[root@k8s-master workspace]# ls
locust_test  locust_test@tmp
[root@k8s-master workspace]# ls locust_test
Dockerfile  Jenkinsfile  README.md  requirements.txt  src
[root@k8s-master workspace]# ls -l locust_test
总用量 16
-rw-r--r-- 1 jenkins jenkins  178 12月 24 18:35 Dockerfile
-rw-r--r-- 1 jenkins jenkins  938 12月 24 18:44 Jenkinsfile
-rw-r--r-- 1 jenkins jenkins  109 12月 24 18:35 README.md
-rw-r--r-- 1 jenkins jenkins 1045 12月 24 18:35 requirements.txt
drwxr-xr-x 3 jenkins jenkins   65 12月 24 18:35 src
[root@k8s-master workspace]# 

感觉极有可能就是这里面的两行

可以做个实验,只更新Jenkinsfile,把运行时间设置长点,在运行时间内进入容器,查看对应目录下的文件,需要验证的是:
1.文件名和jenkins的workspace目录下文件名是否一致
2.更新时间是否一致
3.未更新的文件是否和前次的workspace目录下文件是否同一个(主要看更新时间)

更新前的jenkins workspace目录文件

beck@beckdeMacBook-Pro workspace % pwd
/Users/beck/.jenkins/workspace
beck@beckdeMacBook-Pro workspace % ls -l
total 0
drwxr-xr-x  9 beck  staff  288 12 24 20:27 locust_test
drwxr-xr-x  2 beck  staff   64 12 24 20:29 locust_test@tmp
beck@beckdeMacBook-Pro workspace % cd locust_test
beck@beckdeMacBook-Pro locust_test % ls -l
total 32
-rw-r--r--  1 beck  staff   178 12 24 20:27 Dockerfile
-rw-r--r--  1 beck  staff   940 12 24 20:27 Jenkinsfile
-rw-r--r--  1 beck  staff   109 12 24 20:27 README.md
-rw-r--r--  1 beck  staff  1045 12 24 20:27 requirements.txt
drwxr-xr-x  5 beck  staff   160 12 24 20:27 src

运行时容器内部的文件,需要加+8H,可以看到只有Dockerfile时间更新了

beck@beckdeMacBook-Pro locust_test % docker ps
CONTAINER ID   IMAGE               COMMAND   CREATED          STATUS         PORTS     NAMES
9cb7d9950cd7   beck123/locust:v1   "cat"     10 seconds ago   Up 7 seconds             confident_volhard
beck@beckdeMacBook-Pro locust_test % docker exec -it 9cb /bin/bash

I have no name!@9cb7d9950cd7:/Users/beck/.jenkins/workspace$ ls -l
total 0
**drwxr-xr-x 9 501 dialout 288 Dec 24 14:10 locust_test  **
drwxr-xr-x 3 501 dialout  96 Dec 24 14:11 locust_test@tmp
I have no name!@9cb7d9950cd7:/Users/beck/.jenkins/workspace$ cd locust_test
I have no name!@9cb7d9950cd7:/Users/beck/.jenkins/workspace/locust_test$ ls -l
total 16
-rw-r--r-- 1 501 dialout  178 Dec 24 12:27 Dockerfile
**-rw-r--r-- 1 501 dialout  343 Dec 24 14:10 Jenkinsfile**
-rw-r--r-- 1 501 dialout  109 Dec 24 12:27 README.md
-rw-r--r-- 1 501 dialout 1045 Dec 24 12:27 requirements.txt
drwxr-xr-x 5 501 dialout  160 Dec 24 12:27 src
I have no name!@9cb7d9950cd7:/Users/beck/.jenkins/workspace/locust_test$ pwd
/Users/beck/.jenkins/workspace/locust_test

更新后的jenkins workspace目录文件,可以看到也是只有Dockerfile的时间更新了

 beck@beckdeMacBook-Pro workspace % pwd
/Users/beck/.jenkins/workspace
beck@beckdeMacBook-Pro workspace % ls -l
total 0
drwxr-xr-x  9 beck  staff  288 12 24 22:10 locust_test
drwxr-xr-x  2 beck  staff   64 12 24 22:16 locust_test@tmp
beck@beckdeMacBook-Pro workspace % cd locust_test
beck@beckdeMacBook-Pro locust_test % ls -l
total 32
-rw-r--r--  1 beck  staff   178 12 24 20:27 Dockerfile
-rw-r--r--  1 beck  staff   343 12 24 22:10 Jenkinsfile
-rw-r--r--  1 beck  staff   109 12 24 20:27 README.md
-rw-r--r--  1 beck  staff  1045 12 24 20:27 requirements.txt
drwxr-xr-x  5 beck  staff   160 12 24 20:27 src
posted @ 2022-12-24 21:50  cnhkzyy  阅读(953)  评论(0编辑  收藏  举报