「CICD实践」基于Jenkins-pipeline的python-Flask应用自动构建Docker镜像、运行容器

1、背景

在之前的文章里面我们实现了基于job风格的流程, 来实现拉取python代码, 根据Dockerfile生成镜像,运行容器.传送门: https://www.cnblogs.com/code4fs/articles/17376661.html

但是在日常使用中, 其实jenkins的 pipeline流水线模式是对于这种多节点操作的复杂度简化具有更清晰的一种展现方式.这篇文章, 主要目的就是将之前的Job自由风格改造成流水线.

2、pipeline脚本语法简介

语法我们在这里就不细讲, 百度上面的资料也比较详尽.
详情可以查看传送门:
英文: https://www.jenkins.io/doc/book/pipeline/syntax/
中文: https://www.jenkins.io/zh/doc/book/pipeline/syntax/

2.1、声明式

2.2、脚本式

3、涉及插件

3.1、Pipeline: pipeline的核心插件

3.2、Pipeline: Stage View Plugin:目的是为了在传统洁面查看pipline stage

3.3、Blue Ocean:新的用户界面体验,为pipeline设计,并与自由风格job兼容, 减少了杂乱.

4、方式一: Jenkins页面创建pipeline

4.1、创建pipeline: techpractisebypy37pipelinem1

4.2、使用自动生成的helloworld pipeline script

这里我们先尝试下官方提供的Hello World Demo.
立即构建:

4.3、查看阶段视图

4.4、修改pipline script

pipeline {
    agent any

    stages {
        stage('Hello') {
            steps {
                echo 'Hello World'
            }
        }
        
        stage('bye') {
            steps {
                echo 'bye bye!'
            }
        }
    }
    
}

立即构建

5、方式二: Blue Ocean页面创建pipeline

5.1、创建pipeline: : techpractisebypy37pipelinem2

5.2、配置github access token

这里我们选择Github, 直接页面创建一个access token

5.3、 新增stage

创建stage: hello

点击保存

5.4、立即构建

在仓库中可以看到多了一个Jenkinsfile文件

5.5、修改stage

通过页面直接修改stage

保存自动启动:

5.6、立即构建

github中Jenkinsfile已经变更:

详情可以查看传送门: https://www.jenkins.io/doc/book/blueocean/getting-started/

6、方式三: Git-Jenkinsfile方式创建pipeline

6.1、创建pipeline: : techpractisebypy37pipelinem3

6.2、pipeline script from SCM配置

需要仓库中提前存在Jenkinsfile文件.

6.3、立即构建

7、「实践最终版」techpractisebypy37 方式三的Pipeline方式[声明式]

Jenkinsfile修改为以下内容:

7.1、声明式

pipeline {
  parameters {
        string defaultValue: '1.0.0', description: '镜像主版本', name: 'TEST_TAG', trim: true
        string defaultValue: '/Users/kenwu/Documents/TechSet/logs', description: '宿主机日志路径', name: 'HOST_LOGS_PATH', trim: true
        string defaultValue: '8102', description: '宿主机服务暴露端口', name: 'HOST_PORT', trim: true
        string defaultValue: 'techpractisebypy37', description: '镜像名称', name: 'PACKAGE_NAME', trim: true
    }

  agent any
  stages {
    stage('清理历史镜像及容器'){
      steps {
        sh '''
            CONTAINER_ID=`docker ps |grep ${PACKAGE_NAME} |awk \'{print $1}\'`
            IMAGE_ID=`docker images |grep ${PACKAGE_NAME} |awk \'{print $3}\'`
            echo "CONTAINER_ID : $CONTAINER_ID"
            echo "IMAGE_ID : $IMAGE_ID"
            if [ "$IMAGE_ID" !=  "" ] ; then
                if [ "$CONTAINER_ID" !=  "" ] ; then
                    CONTAINER_INFO=`docker ps |grep ${PACKAGE_NAME} |awk \'{print $0}\'`
                    echo "删除容器 $CONTAINER_INFO"
                    docker rm -f $CONTAINER_ID
                    fi
                    IMAGE_INFO=`docker images |grep ${PACKAGE_NAME} |awk \'{print $0}\'`
                    echo "删除镜像 $IMAGE_INFO"
                    docker rmi -f $IMAGE_ID
            fi
        '''
      }
    }

    stage('编译镜像') {
      steps {
        sh '''
        docker build -t ${PACKAGE_NAME}:${TEST_TAG}.${BUILD_NUMBER} .
        echo ${TEST_TAG}
        echo ${WORKSPACE}
        echo ${HOST_LOGS_PATH}
        echo ${HOST_PORT}
        echo ${PACKAGE_NAME}
        '''
      }
    }

    stage('启动容器') {
      steps {
        sh 'docker run --user=kenwu:kenwu --name ${PACKAGE_NAME} -v ${WORKSPACE}:/kenwu/app  -v ${HOST_LOGS_PATH}:/logs/app -p ${HOST_PORT}:8002  --privileged=true -itd ${PACKAGE_NAME}:${TEST_TAG}.${BUILD_NUMBER}'
      }
    }

  }
}

posted @ 2023-05-15 18:41  kenwu_code4fs  阅读(313)  评论(0)    收藏  举报