简单的CI/CD流程

125 阅读2分钟

1. 镜像仓库搭建harbor

  1. 安装包下载v2.10.0下载地址

    企业微信截图_17038152077227.png

  2. 项目配置

    tar -xzvf harbor-offline-installer-v2.10.0.tgz
    cp harbor.yml.tmpl harbor.yml
    vim harbor.yml // 修改配置如下图
    
    ./install.sh 
    

    harbor.yml可以改以下几个部分就可以,如果只使用http,可以将https配置注释。 image.png

  3. 登录试用

    浏览器登录,用户名和密码为 harbor.yml 配置文件中默认设置的 admin,Harbor12345。 image.png 创建测试项目仓库 image.png

3. jenkins流水线构建

  1. 创建流水线任务 image.png

    image.png 流水线脚本有两种方式,直接写脚本和从远程地址拉取jenkins pipeline脚本,本文采用从git仓库拉取脚本test.jenkinsfile

    image.png

  2. gitlab编写jenkinsfile

    pipeline {
        agent any //执行节点
    
        environment { // 环境变量配置
            BRANCH = 'dev'
            HARBOR_HOST = 'xxx.xxx.xxx.xxx' // 镜像仓库地址
            HARBOR_PROJECT = 'xxxx' // 项目名称
            BUILD_VERSION = createVersion() // 本次构建版本号
        }
    
        options{
            timestamps() // 日志会有时间
            skipDefaultCheckout() // 删除隐式checkout scm语句
            disableConcurrentBuilds() // 禁止并行
            timeout(time:1,unit:'HOURS') //流水线超时设置
        }
    
        stages{
    
            stage('GetCode'){ // gitlab获取代码
                steps{
                    script{
                        checkout scmGit(branches: [[name: '*/'+"${BRANCH}"]], extensions: [], userRemoteConfigs: [[credentialsId: 'xxxx', url: 'xxxx']])
                    }
                }
            }
    
            stage('build'){ // 镜像打包
                steps{
                    script{
                        sh '''
                                            docker build -t ${HARBOR_PROJECT}_${BRANCH}:$BUILD_VERSION .
                                            docker tag ${HARBOR_PROJECT}_${BRANCH}:$BUILD_VERSION ${HARBOR_HOST}/${HARBOR_PROJECT}/${HARBOR_PROJECT}_${BRANCH}:$BUILD_VERSION
                        '''
                        sh "docker login -u admin -p xxxxx ${HARBOR_HOST}"
                        sh "docker push ${HARBOR_HOST}/${HARBOR_PROJECT}/${HARBOR_PROJECT}_${BRANCH}:$BUILD_VERSION"
                    }
                }
            }
    
            stage('clean'){  // 清除镜像
                steps{
                    script{
                                            sh "docker rmi ${HARBOR_PROJECT}_${BRANCH}:$BUILD_VERSION"
                                            sh "docker rmi ${HARBOR_HOST}/${HARBOR_PROJECT}/${HARBOR_PROJECT}_${BRANCH}:$BUILD_VERSION"
                    }
                }
            }
    
            stage('start_server'){ // 下载镜像拉起服务,这部分可以改成sh脚本远程执行,本文资源有限改成在本地执行sh脚本
                 steps{
                    script{
                        sh '''
                                            ./deploy.sh ${HARBOR_HOST} ${HARBOR_PROJECT} ${HARBOR_PROJECT}_${BRANCH} ${BUILD_VERSION} 8089
                        '''
                    }
                }
            }
        }
    
        post{
            always{
                script{
                    println('always')
                }
            }
    
            success{
                script{
                    currentBuild.description += "\n 构建成功"
                }
            }
    
            failure{
                script{
                    currentBuild.description += "\n 构建失败"
                }
            }
    
            aborted{
                script{
                    currentBuild.description += "\n 构建取消"
                }
            }
        }
    }
    
    def createVersion() {
        return "${env.BUILD_ID}"
    }
    
  3. 拉起服务脚本 deploy.sh

    #! /bin/sh
    #接收外部参数
    harbor_url=$1
    harbor_project_name=$2
    project_name=$3
    tag=$4
    port=$5
    
    imageName=$harbor_url/$harbor_project_name/$project_name:$tag
    imageRespo=$harbor_url/$harbor_project_name/$project_name
    
    echo "$imageName"
    
    #查询容器是否存在,存在则删除
    containerId=`docker ps -a | grep -w ${imageRespo}  | awk '{print $1}'`
    
    if [ "$containerId" !=  "" ] ; then
        #停掉容器
        docker stop $containerId
    
        #删除容器
        docker rm $containerId
    
            echo "成功删除容器"
    fi
    
    #查询镜像是否存在,存在则删除
    imageId=`docker images | grep -w $imageRespo  | awk '{print $3}'`
    
    if [ "$imageId" !=  "" ] ; then
    
        #删除镜像
        docker rmi -f $imageId
    
            echo "成功删除镜像"
    fi
    
    # 登录Harbor
    docker login -u admin -p xxxxxx $harbor_url
    
    # 下载镜像
    docker pull $imageName
    
    # 启动容器
    docker run -di -p $port:8089 $imageName
    
    echo "容器启动成功"
    
    

3. 项目dockerfile

以nodejs nestjs项目为例

FROM node:18
WORKDIR /app
COPY . .
RUN npm install
EXPOSE 8089
CMD ["npm","start"]