zoukankan      html  css  js  c++  java
  • 通过jenkins流水线(pipeline)实现持续发布

    ===============================================

     2021/1/14_第2次修改                       ccb_warlock

     

    更新说明:

    2021/1/14:

    1.修改jenkinsfile脚本,ssh命令中增加取消检查主机密钥的参数“-o StrictHostKeyChecking=no”;

    ===============================================

    最近根据领导的要求,要改用jenkins的流水线来部署项目,同时要求部署的修改可以通过在jenkins上进行操作来实现。

    由于其他项目使用流水线的方案和我们项目的差异较大(1.我们的jenkins使用docker运行;2.我们的项目编译构建不是在jenkins服务器而是在开发服务器上),经过摸索试验,最终实现了一个可行的版本供参考。

     

    PS.通过"构建一个自由风格的软件项目",请参考:https://www.cnblogs.com/straycats/p/14065719.html

    本篇就依据上次持续发布的文章(https://www.cnblogs.com/straycats/p/14065719.html)进行改写,如果只想了解流水线如何部署可以直接看这篇文章。

     

    部署完jenkins(https://www.cnblogs.com/straycats/p/14033405.html)后,接着就是使用jenkins实现持续发布.net项目,下面架构图是基于《京东基础架构建设之路》的解决方案做了些调整。

    1.提交源码

    2.触发Jenkins任务

    3.远程执行shell脚本,操作构建服务器

    4.构建服务器拉取源码构建打包

    5.将包和Dockerfile发给镜像构建节点

    6.在镜像构建节点生成镜像

    7.将镜像上传至仓库

    8.部署容器

     

    这里合并了构建功能到开发服务器,故接着就是配置开发服务器、jenkins服务器即可。

     


    一、选择镜像仓库

    可以选择一些免费的镜像仓库(dockerhub、阿里云等等)用于存放构建的镜像。如果需要搭私有仓库可以选择搭建harbor(https://www.cnblogs.com/straycats/p/8850693.html

    这里选择了阿里云(registry.cn-beijing.aliyuncs.com)作为镜像仓库

     


    二、部署builder服务器

    2.1 安装docker

    centos7上部署参考 https://www.cnblogs.com/straycats/p/10680502.html

     

    2.2 安装git

    sudo yum install -y git

    2.3 安装.net core

    centos7上部署参考https://docs.microsoft.com/zh-cn/dotnet/core/install/linux-centos

    2.4 创建rsa证书

    因为我拉取git常用ssh,故需要在builder服务器上创建rsa证书,通过公钥拉源码。

    sudo ssh-keygen -t rsa

    1. 生成的过程中提示输入密钥对保存位置,直接回车,接受默认值就行了。

    2. 因为之前已经有/root/.ssh/id_rsa 文件存在,因此提示你是否覆盖,输入y表示覆盖 。

    3. 接着会提示输入一个密码,直接回车,让它空着。当然,也可以输入一个密码。

    4. 接着输入确认密码,输入完之后,回车密钥对就生成完了。

     

    接着将公钥(/root/.ssh/id_rsa.pub)的内容贴到git账号中。

     

    2.5 拉取源码

    这里将dev分支的源码拷贝到目录/opt/src下。

    sudo mkdir -p /opt/src
    cd /opt/src
    sudo git clone -b dev <git项目地址>

    三、部署jenkins服务器

    3.1 部署jenkins服务器

     参考:https://www.cnblogs.com/straycats/p/14033405.html

     

    3.2 在jenkins服务器上生成rsa证书

    sudo ssh-keygen -t rsa
    cd /root/.ssh
    sudo cp id_rsa.pub id_rsa.pub.jenkins

    这样,在/root/.ssh下生成id_rsa(私钥) 和 id_rsa.pub (公钥)两个文件。

     

    3.3 在builder服务器设置密钥配对

    1)在builder服务器的/root/.ssh下创建authorized_keys文件

    sudo mkdir -p /root/.ssh
    sudo touch /root/.ssh/authorized_keys

    2)将jenkins服务器的id_rsa.pub.jenkins拷贝到builder服务器的/root目录下

     

    3)通过 cat 命令 把id_rsa.pub追加到 authorized_keys 文件中

    cd /root/.ssh
    sudo cat id_rsa.pub.jenkins >> /root/.ssh/authorized_keys

     

    3.4 添加凭据

    1)"系统管理" - "Manage Credentials",进入凭据管理界面,点击“全局”旁边的箭头,点击“添加凭据”。

    2)由于使用ssh密钥对,故"类型"选择"SSH Username with private key",填写ID、Username,选中"Enter directly",填入私钥(id_rsa)的内容,点击"确定"。

    3.5 创建jenkins任务

    1)点击“新建任务”

    2)选择"Pipeline script",填写jenkinsfile脚本,点击“保存”。

    pipeline {
        agent any 
        
        stages {
            stage('1.Prepare & Upload script') {
                steps {
                    echo "=== Begin 1.Prepare & Upload script ==========="
                    
                    sh '''
                    pwd
                    
                    tee ./gitclone.sh <<-'EOF'
    #!/bin/bash
    source_dir="/opt/src/abc"
    
    cd $source_dir
    sudo git checkout dev
    sudo git pull
    
    EOF
    
                    tee ./build_src.sh <<-'EOF'
    #!/bin/bash
    source_dir="/opt/src/abc"
    publish_dir="/opt/publish/abc"
    
    sudo rm -rf $publish_dir"/published"
    sudo mkdir -p $publish_dir"/published"
    cd $source_dir
    sudo dotnet publish -o $publish_dir"/published"
    
    EOF
    
                    tee ./build_images.sh <<-'EOF'
    #!/bin/bash
    source_dir="/opt/src/abc"
    publish_dir="/opt/publish/abc"
    
    sudo yes| cp -rf $source_dir"/Server/Dockerfile" $publish_dir
    cd $publish_dir
    sudo docker build --rm -t registry.cn-beijing.aliyuncs.com/abc/abc:latest .
    sudo docker push registry.cn-beijing.aliyuncs.com/abc/abc:latest
    
    EOF
    
                    tee ./abc-stack.yml <<-'EOF'
    version: '3.7'
    services:
    
      abc:
        image: registry.cn-beijing.aliyuncs.com/abc/abc:latest
        environment:
          - TZ=Asia/Shanghai
          - ASPNETCORE_ENVIRONMENT=Production
        deploy:
          replicas: 1
          restart_policy:
            condition: any #on-failure
          resources:
            limits:
              cpus: "2"
              memory: 2048M
          update_config:
            parallelism: 1
            delay: 5s
            max_failure_ratio: 0.1
            order: start-first
        ports:
          - 35000:5000
        networks:
          - swarm-net
    
    networks:
      swarm-net:
        external: true
    
    EOF
    
                    tee ./deploy.sh <<-'EOF'
    #!/bin/bash
    
    cd /opt/docker/compose/abc
    sudo docker stack rm abc-stack
    sudo docker stack deploy -c abc-stack.yml abc-stack
    
    EOF
    
                    '''
                    
                    withCredentials([sshUserPrivateKey(credentialsId: 'mypk', keyFileVariable: 'keyfile', passphraseVariable: '', usernameVariable: 'user')]) {
                        sh "scp -o StrictHostKeyChecking=no -i ${keyfile} *.sh ${user}@192.168.1.1:/opt/jenkinsfiles/"
                        sh "scp -o StrictHostKeyChecking=no -i ${keyfile} abc-stack.yml ${user}@192.168.1.1:/opt/docker/compose/abc/"
                    }
                      
                    echo "=== End 1.Prepare & Upload script ==========="
                }
            }
            stage('2.Git clone') { 
                steps {
                    echo "=== Begin 2.Git clone ==========="
                    
                    withCredentials([sshUserPrivateKey(credentialsId: 'mypk', keyFileVariable: 'keyfile', passphraseVariable: '', usernameVariable: 'user')]) {
                        sh 'ssh -o StrictHostKeyChecking=no -i ${keyfile} ${user}@192.168.1.1 "cd /opt/jenkinsfiles/; sh ./gitclone.sh"'
                    }
                    
                    echo "=== End 2.Git clone ==========="
                }
            }
            stage('3.Build src') { 
                steps {
                    echo "=== Begin 3.Build src ==========="
                    
                    withCredentials([sshUserPrivateKey(credentialsId: 'mypk', keyFileVariable: 'keyfile', passphraseVariable: '', usernameVariable: 'user')]) {
                        sh 'ssh -o StrictHostKeyChecking=no -i ${keyfile} ${user}@192.168.1.1 "cd /opt/jenkinsfiles/; sh ./build_src.sh"'
                    }
                    
                    echo "=== End 3.Build src ==========="
                }
            }
            stage('4.Build images') { 
                steps {
                    echo "=== Begin 4.Build images ==========="
                    
                    withCredentials([sshUserPrivateKey(credentialsId: 'mypk', keyFileVariable: 'keyfile', passphraseVariable: '', usernameVariable: 'user')]) {
                        sh 'ssh -o StrictHostKeyChecking=no -i ${keyfile} ${user}@192.168.1.1 "cd /opt/jenkinsfiles/; sh ./build_images.sh"'
                    }
                    
                    echo "=== End 4.Build images ==========="
                }
            }
            stage('5.Deploy') { 
                steps {
                    echo "=== Begin 5.Deploy ==========="
                    
                    withCredentials([sshUserPrivateKey(credentialsId: 'mypk', keyFileVariable: 'keyfile', passphraseVariable: '', usernameVariable: 'user')]) {
                        sh 'ssh -o StrictHostKeyChecking=no -i ${keyfile} ${user}@192.168.1.1 "cd /opt/jenkinsfiles/; sh ./deploy.sh"'
                    }
                    
                    echo "=== End 5.Deploy ==========="
                }
            }
        }
    }

    3.6 执行任务

    1)点击任务进入任务界面。

    2)点击“立即构建”,该任务就会执行一次。

     

  • 相关阅读:
    MySQL中删除重复数据只保留一条
    js 的try catch应用
    jQuery中on()方法用法实例
    js老生常谈之this,constructor ,prototype
    spring自定义标签之 规范定义XSD
    jquery jgrid filterToolBar beforeSearch 修改postData
    Guava学习笔记:Optional优雅的使用null
    Java之Collections.emptyList()、emptySet()、emptyMap()的作用和好处以及要注意的地方
    Druid SQL 解析器概览
    访问者模式
  • 原文地址:https://www.cnblogs.com/straycats/p/14270115.html
Copyright © 2011-2022 走看看