• Jenkins持续集成


    持续集成实战

    【GitLab仓库 192.168.87.100】

    1. 安装相关依赖

    yum -y install policycoreutils openssh-server openssh-clients postfix

    1. 启动ssh服务&设置为开机启动
      systemctl enable sshd && sudo systemctl start sshd

    2. 设置postfix开机自启,并启动,postfix支持gitlab发信功能
      yum install postfix
      systemctl enable postfix && systemctl start postfix

    3. 开放ssh以及http服务,然后重新加载防火墙列表
      firewall-cmd --add-service=ssh --permanent
      firewall-cmd --add-service=http --permanent
      firewall-cmd --reload

    如果关闭防火墙就不需要做以上配置

    1. 下载gitlab包,并且安装在线下载安装包:
      wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el6/gitlab-ce-12.4.2-ce.0.el6.x 86_64.rpm

    2. 安装:
      rpm -i gitlab-ce-12.4.2-ce.0.el6.x86_64.rpm

    3. 修改gitlab配置

    vi /etc/gitlab/gitlab.rb
    ###修改gitlab访问地址和端口,默认为80,我们改为82 
    #修改external_url 'http://192.168.87.100'
    #加入nginx['listen_port'] = 82
    
    1. 重载配置及启动gitlab
    gitlab-ctl reconfigure
    gitlab-ctl restart
    
    1. 把端口添加到防火墙
    firewall-cmd --zone=public --add-port=82/tcp --permanent 
    firewall-cmd --reload
    

    启动成功后,看到以下修改管理员root密码的页面,修改密码后,然后登录即可
    9. 卸载gitlab
    [教程]https://www.cnblogs.com/peteremperor/p/10837551.html

    10、使用:
    先创建一个组,然后创建一个用户,在组中创建一个项目,为项目添加成员,切换到成员,进行日常开发!
    创建组后向组中加入成员

    【Jenkins安装 192.168.87.101】

    这里介绍两种方法,一种方法将最新版jenkins加入到yum源,另外一种是下载指定版本的rpm包

    1)安装JDK

    2)安装jenkins

    wget -O :下载并以不同的文件名保存

    yum的repo中默认没有Jenkins,需要先将Jenkins存储库添加到yum repos,执行下面的命令:

    #准备
    yum  -y install epel-release
    yum -y install daemonize
    #正式安装
    wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
    rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
    yum install -y jenkins #默认安装最新的
    systemctl enable jenkins  #开机自启
    #vim /etc/sysconfig/jenkins   #修改内容: JENKINS_USER=“root” JENKINS_PORT=“8888”
    sed -i  "s/JENKINS_PORT="8080"/JENKINS_PORT="8888"/" /etc/sysconfig/jenkins
    service jenkins start  #启动
    
    #开放端口
    firewall-cmd --zone=public --add-port=8888/tcp --permanent
    firewall-cmd --reload #重载防火墙
    
    

    打开浏览器访问 http://192.168.87.101:8888

    1、配置Jenkins

    创建一个管理员用户 -> 实例配置 -> 可以安装推荐的插件或另一种。

    3)配置为国内插件下载地址:

    cd /var/lib/jenkins/updates
    sed -i 's/http://updates.jenkins-ci.org/download/https://mirrors.tuna.tsinghua.edu.cn/jenkins/g' default.json
    sed -i 's/http://www.google.com/https://www.baidu.com/g' default.json
    

    Manage Plugins点击Advanced,把Update Site改为国内插件下载地址:

    https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

    Sumbit后,在浏览器输入: http://101机器ip:8888/restart ,重启Jenkins

    4)安装中文插件

    安装插件的插件后,会帮我们安装中文插件,如果没有搜索"Chinese",安装

    2、创建与GitLab的关联

    以下步骤:使用普通凭证从gitlab上拉取代码 -> 使用ssh凭证从gitlab上拉取代码

    实现在Jenkins上拉取Gitlab上的代码

    在Jenkins上安装Credentials Binding ,安装 Git插件 、在Jenkins服务器上安装git (yum install git -y && git --version)

    1、创建普通凭证

    使用ssh凭证来拉取

    2、使用ssh-keygen生成ssh,打开/root/.ssh/下cat公钥 复制到gitlab设置中的ssh:

    3、配置ssh凭证

    3、构建流水线环境

    流水线构建项目,构建项目由之前的流程式转为了脚本(Pipeline),我们创建一个流水线项目后,我们只需编写/生成一个Pipeline 即可完成对项目的拉取、构建、部署等操作。

    以下步骤:安装插件(Pipeline,安装推荐的插件中包含) -> 进行项目构建脚本(Pipeline)书写 -> 查看

    1、安装插件

    4、Extended Choice Parameter参数构建

    示例:

    5、注意事项

    1)拉取代码时,Jenkins脚本中的git凭证是ssh

    6、代码审查

    安装

    注意,sonar6.7版本需要一个mysql5.7的数据库,jdk1.8以上比如8.5 ,然后再创建一个名为sonar 的数据库。然后再开始安装Sonar,启动后再开放端口且登录获取token :

    以下步骤:保证存在名为sonar的数据库 -> 安装Conar -> 余下工作

    保证存在名为sonar的数据库

    安装Conar

    下载sonar压缩包: https://www.sonarqube.org/downloads/

    wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-6.7.4.zip
    yum install unzip
    unzip sonarqube-6.7.4.zip #解压
    mv sonarqube-6.7.4/* /usr/local/ #移动文件
    
    useradd sonar #创建sonar用户,必须sonar用于启动,否则报错
    chown -R sonar. /usr/local/sonarqube-6.7.4 #更改sonar目录及文件权限修改sonar配置文件
    
    vim /usr/local/sonarqube-6.7.4/conf/sonar.properties
    #直接将下面粘贴到配置上去,而端口不作修改(默认9000)
    
    sonar.jdbc.username=root
    sonar.jdbc.password=3333  
    sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs= maxPerformance&useSSL=false
    
    cd /usr/local/sonarqube-6.7.4
    
    #su sonar 不能使用root用户启动!!!所以下面在root用户下使用如下使用启动
    su sonar ./bin/linux-x86-64/sonar.sh start #启动
    su sonar ./bin/linux-x86-64/sonar.sh status #查看状态
    su sonar ./bin/linux-x86-64/sonar.sh stop #停止
    
    tail -f logs/sonar.logs #查看日志访问sonar http://192.168.66.101:9000
    #开放端口
    firewall-cmd  --zone=public --add-port=9000/tcp --permanent
    firewall-cmd --reload
    
    

    余下工作

    2)登录:默认 admin/admin

    ​ 获取token:

    ​ 输入admin , 得到如下信息,需要摘取保存token

    ​ admin: d6065dbc1e1cfcd3a9714614b16d6bd816246d29

    Sonar与Jenkins整合

    安装插件

    在Jenkins安装Sonar-Scanner工具

    Manage Jenkins->Global Tool Configuration 添加一个凭证

    在jenkins“系统配置”中,作如下配置

    在项目Jenkins脚本中

    7、编译打包

    环境准备

    需要确保,jenkin主机安装了jdk、maven(配置好阿里云镜像,然后再看下面)
    2、Jenkins上配置

    配置1:

    配置2:

    对于公共模块

    我们需要将公共依赖进行安装,所以需要编辑项目根目录下 “Jenkinsfile” 脚本,加入“编译,安装公共子工程” 这个 阶段:

    //git凭证ID
    def git_auth = "3b3eca2f-e2d7-44e5-8e11-e98ee29953dc"
    //git的url地址
    def git_url = "git@192.168.87.133:zhuangjie/tensquare_back.git"
    
       stage('拉取代码') {
          checkout([$class: 'GitSCM', branches: [[name: "*/${branch}"]], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]]])
       }
       stage('代码审查') {
            def scannerHome=tool 'SonarQube-Scanner'//根据自己的Jenkinssonarqube-scanner环境修改
            withSonarQubeEnv('ConarQube6.7'){ //引入Jenkinssonarqube环境
                    sh """
    		cd ${project_name}
    		${scannerHome}/bin/sonar-scanner
    	"""
            }
       }
       stage('编译,安装公共子工程') {
       	sh "mvn -f tensquare_common clean install"
       }
        
    }
    

    然后在确保各个模块"pom.xml" 存在打包插件(父工程的该插件可以删除了):

    	<build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    

    父模块上传到服务

    这样就能确保依赖安装能完成了。下面我们就进行对可运行的微服务进行打包:

    因为zull这个模块时依赖了父模块,所以我们需要确保服务器的本地仓库有父工程:

    [root@localhost tensquare]# pwd
    /root/.m2/repository/com/tensquare
    [root@localhost tensquare]# mv /home/zhuangjie/桌面/tensquare_parent/ ./
    [root@localhost tensquare]# ll
    drwxr-xr-x. 3 root      root      58 7月  29 01:18 tensquare_common
    drwxrwxrwx. 3 zhuangjie zhuangjie 58 7月  29 01:37 tensquare_parent
    

    我们移动的文件目录:

    然后再进行构建。这样我们在拉取的代码目录中就打包好了该模块的jar文件(测试jar可正常运行)。

    8、Docker环境

    简单一句话总结:Docker技术就是让我们更加高效轻松地将任何应用在Linux服务器部署和使用

    `【Docker安装】``

    1)卸载旧版本

    yum list installed | grep docker #列出当前所有docker的包
    yum -y remove docker  #的包名称 卸载docker包
    rm -rf /var/lib/docker #删除docker的所有镜像和容器
    

    2)安装必要的软件包

    sudo yum install -y yum-utils  device-mapper-persistent-data  lvm2
    

    3)设置下载的镜像仓库

    yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    #或使用加速镜像:  yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    

    4)列出需要安装的版本列表

    yum list docker-ce --showduplicates | sort -r  
    

    5)安装指定版本(这里使用18.0.1版本)

    sudo yum install docker-ce-18.06.1.ce
    

    6)查看版本&设置开机自启

    docker -v
    sudo systemctl enable docker #设置开机启动  
    systemctl is-enabled docker  #查看是否设置为开机自启
    

    7)启动Docker

    sudo systemctl start docker #启动
    

    8)添加阿里云镜像下载地址(除此还是拉取与推送的信任列表)

    vi /etc/docker/daemon.json

    { 
      "registry-mirrors": ["https://zydiol88.mirror.aliyuncs.com"]
    }
    

    9)重启Docker

    sudo systemctl restart docker  
    systemctl status docker  #查看docker状态
    

    离线安装方式请参考:https://www.cnblogs.com/kingsonfu/p/11576797.html

    【docker命令】

    1)镜像命令:

    镜像:相当于应用的安装包,在Docker部署的任何应用都需要先构建成为镜像

    docker search 镜像名称 #搜索镜像
    docker pull 镜像名称 #拉取镜像 示例:docker pull nginx
    docker images #查看本地所有镜像
    docker rmi -f 镜像名称 #删除镜像(即使在运行)
    docker rmi -f $(docker images -qa) #删除所有镜像
    

    2)容器命令

    容器:容器是由镜像创建而来。容器是Docker运行应用的载体,每个应用都分别运行在Docker的每个
    容器中。

    docker run -di -p 对应宿主机那个端口:开放应用端口  镜像名称:标签 #运行容器(默认是前台运行),di:i是运行,d是后台;  -p是public的意思;
    docker ps #查看运行的容器
    docker ps -a #查询所有容器
    
    docker exec -it 容器ID/容器名称 /bin/bash #进入容器内部
    docker start/stop/restart 容器名称/ID #启动/停止/重启容器
    docker rm -f 容器名称/ID #删除容器
    docker rm `docker ps -a -q` #删除所有容器
    docker logs -f -t --tail 行数 容器名  #查看容器运行日志
    

    【镜像的制作】

    下面将 "ttensquare_eureka_server-1.0-SNAPSHOT.jar" enreka微服务制作成一个docker镜像

    1)上传Eureka的微服务jar包到linux
    2)编写Dockerfile

    FROM openjdk:8-jdk-alpine
    ARG JAR_FILE
    COPY ${JAR_FILE} app.jar
    EXPOSE 10086
    ENTRYPOINT ["java","-jar","/app.jar"]
    

    3)构建镜像

    docker build --build-arg JAR_FILE=tensquare_eureka_server-1.0-SNAPSHOT.jar -t eureka:v1 .
    

    4)查看镜像是否创建成功

    docker images
    

    5)创建容器

    docker run -i --name=eureka -p 10086:10086 eureka:v1
    

    6)访问容器
    http://192.168.66.101:10086

    9、镜像制作

    在这个过程中不需要在Jenkins中安装插件来辅助,假如jenkins所在机器要向harbor机器推送容器,只需要jenkins对docker配置将harbor加入信任列表且能登录到Harbor服务器即可,Harbor能被登录成功即可!
    而对于项目内部,需要加入"Dockerfile" 文件

    当程序在项目根目录下执行“mvn -f ${currentProjectName} clean package dockerfile:build” 时,就会进行编译打包,制作成镜像!

    【Harbor环境 192.168.87.102】

    简介:

    Harbor(港口,港湾)是一个用于存储和分发Docker镜像的企业级Registry服务器。
    除了Harbor这个私有镜像仓库之外,还有Docker官方提供的Registry。相对Registry,Harbor具有很
    多优势:

    1. 提供分层传输机制,优化网络传输 Docker镜像是是分层的,而如果每次传输都使用全量文件(所以
      用FTP的方式并不适合),显然不经济。必须提供识别分层传输的机制,以层的UUID为标识,确定
      传输的对象。
    2. 提供WEB界面,优化用户体验 只用镜像的名字来进行上传下载显然很不方便,需要有一个用户界
      面可以支持登陆、搜索功能,包括区分公有、私有镜像。
    3. 支持水平扩展集群 当有用户对镜像的上传下载操作集中在某服务器,需要对相应的访问压力作分
      解。
    4. 良好的安全机制 企业中的开发团队有很多不同的职位,对于不同的职位人员,分配不同的权限,
      具有更好的安全性。

    1)先安装Docker并启动Docker(已完成)

    参考之前的安装过程
    2)先安装docker-compose

    sudo curl -L https://github.com/docker/compose/releases/download/1.27.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose  #安装
    #加速版 curl -L "https://get.daocloud.io/docker/compose/releases/download/1.27.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    sudo chmod +x /usr/local/bin/docker-compose  
    docker-compose --version  #查看版本
    

    3)下载Harbor的压缩包(本课程版本为:v1.9.2)
    https://github.com/goharbor/harbor/releases

    4)安装开始

    tar -xzf harbor-offline-installer-v1.9.2.tgz -C /usr/local/
    cd /usr/local/harbor
    
    vim harbor.yml
    #修改内容1:   hostname: 192.168.87.102
    #修改内容2:   port: 85
    #还可以修改登录密码,这里不作配置,下面使用的是默认的密码进行登录
    
    ./install.sh
    docker-compose up -d #启动
    #docker-compose stop #停止
    #docker-compose restart #重新启动
    
    

    5)添加为开机自启
    vim /lib/systemd/system/harbor.service

    [Unit]
    Description=Harbor
    After=docker.service systemd-networkd.service systemd-resolved.service
    Requires=docker.service
    Documentation=http://github.com/vmware/harbor
    
    [Service]
    Type=simple
    Restart=on-failure
    RestartSec=5
    ExecStart=/usr/local/bin/docker-compose -f  /usr/local/harbor/docker-compose.yml up
    ExecStop=/usr/local/bin/docker-compose -f /usr/local/harbor/docker-compose.yml down
    
    [Install]
    WantedBy=multi-user.target
    
    

    systemctl enable harbor
    systemctl is-enabled harbor

    8)访问Harbor
    http://192.168.66.102:85
    默认账户密码:admin/Harbor12345

    你可能会遇到的问题:https://www.cnblogs.com/hallejuayahaha/p/13926575.html (参考)博主遇到了docker-compose过低找不到,导致启动报错:

    [root@localhost zhuangjie]# docker-compose up -d #启动
    ERROR: 
            Can't find a suitable configuration file in this directory or any
            parent. Are you in the right directory?
    
            Supported filenames: docker-compose.yml, docker-compose.yaml
            
    
    #解决
    sudo curl -L https://github.com/docker/compose/releases/download/1.27.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
    sudo chmod +x /usr/local/bin/docker-compose
    docker-compose --version
    
    ./install.sh #注意还要cd到Harbor根目录执行
    
    【项目与用户】

    登录后:

    1)创建私有项目(项目分为公开项目与私有项目)

    2)创建用户

    3)为项目添加成员:

    角色 权限说明
    访客 对于指定项目拥有只读权限
    开发人员 对于指定项目拥有读写权限
    维护人员 对于指定项目拥有读写权限,创建 Webhooks
    项目管理员 除了读写权限,同时拥有用户管理/镜像扫描等管理权限

    1、推送镜像到Harbor

    1)给镜像打上标签

    docker tag eureka:v1 192.168.208.157:85/uplog/eureka:v1
    

    2)推送镜像(会遇到二个问题,请解决)

    1. 问题1:需要把Harbor地址加入到Docker信任列表,不解决,推送会提示:

      The push refers to repository [192.168.66.102:85/tensquare/eureka]
      Get https://192.168.66.102:85/v2/: http: server gave HTTP response to HTTPS
      client
      

      vi /etc/docker/daemon.json

      { 
       "registry-mirrors": ["https://zydiol88.mirror.aliyuncs.com"],
       "insecure-registries": ["192.168.208.157:85"]
      }
      

      需要重启Docker

    2. 问题2:权限不足,不解决,推送会提示:“denied: requested access to the resource is denied”

      #docker login -u 用户名 -p 密码 192.168.66.102:85
      
      [root@localhost 桌面]# docker login -u zhuangjie  -p gkmzjaznH21  192.168.87.102:85
      Login Succeeded
      
    3. 推送

      docker push 192.168.208.157:85/uplog/eureka
      

    3)登录Harbor查看

    2、拉取镜像从Harbor

    存在Docker后,我们做以下准备,这样才能确保我们能从Harbor中拉取镜像:

    1. 需要把Harbor地址加入到Docker信任列表,不解决,推送会提示:

      The push refers to repository [192.168.66.102:85/tensquare/eureka]
      Get https://192.168.66.102:85/v2/: http: server gave HTTP response to HTTPS
      client
      

      vi /etc/docker/daemon.json

      { 
       "registry-mirrors": ["https://zydiol88.mirror.aliyuncs.com"],
       "insecure-registries": ["192.168.208.157:85"]  
      }
      

      需要重启Docker

    2. 准备拉取

      docker login -u zhuangjie -p zhuangJIE3333 192.168.208.157:85  #登录
      docker pull 192.168.208.157:85/uplog/eureka:v1  #拉取,该拉取命令直接从Harbor上一键复制
      docker images  #查看本地镜像
      

    【Web服务器 192.168.87.103】

    1、应用部署

    分布式应用部署,我们需要再加入一台web服务器:
    环境初始化:

    systemctl enable sshd && sudo systemctl start sshd
    
    firewall-cmd --add-service=ssh --permanent
    firewall-cmd --add-service=http --permanent
    firewall-cmd --reload
    

    环境:必须安装jdk, docker(然后将harbor加入信任列表:),

    vi /etc/docker/daemon.json

    {
     "registry-mirrors": ["https://zydiol88.mirror.aliyuncs.com"],
     "insecure-registries": ["192.168.87.102:85"]
    }
    

    sudo systemctl restart docker #重启
    systemctl status docker #查看docker状态

    jenkins安装 “Publish over SSH” 插件,现在的问题是如何通过ssh控制一web服务器了。

    1)需要在jenkins服务器中执行 ssh-copy-id 192.168.87.104 到新的web的服务器,然后再到jenkins配置一下,就可以使用这个web服务器进行部署了

    2)在jenkins 的”全局配置“中配置"Publish over SSH" 的内容。怎么配置?

    【Passphrse】密码,好像没有设置,如果设置了,需要填写。
    【Path to key】key文件的路径(私钥)/root/.ssh/id_rsa
    【Key】为空,也 可以测试成功。注意如果 “/root/.ssh/id_rsa” 文件找不到需要将.ssh的私钥粘贴到文本框中,至于是root还是其它用户,要看使用copy命令时用的是哪个用户执行的了。

    【SSH Server Name】标识的名字,随便你取什么名字
    【Hostname】需要连接ssh的主机名或ip地址,此处填写应用服务器IP(建议ip)
    【Username】用户名
    【Remote Directory】远程目录(根据需要填写文件传到此目录下)
    【Test Configuration】配置完成,点击test会显示Success![]

    完整”Jenkinsfile“:

    //git凭证ID
    def git_auth = "da1d1333-c35f-415a-903c-b8d58c870c56"
    //git的url地址
    def git_url = "git@192.168.87.100:zhuangjie/tensquare_back.git"
    
    //镜像的版本号
    def tag = "latest"
    //Harbor的url地址
    def harbor_url = "192.168.87.102:85"
    //镜像库项目名称
    def harbor_project = "uplog"
    //Harbor的登录凭证ID
    def harbor_auth = "ef2651c8-92a7-4edb-b4ca-4e182fadf0ca"
    
    node {
        //获取当前选择的项目名称
        def selectedProjectNames = "${project_name}".split(",")
        //把选择的服务器信息转为数组
        def selectedServers = "${publish_server}".split(',')
    
       stage('拉取代码') {
          checkout([$class: 'GitSCM', branches: [[name: "*/${branch}"]], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]]])
       }
       stage('代码审查') {
            for (int i=0; i<selectedProjectNames.length; i++) {
                //tensquare_eureka_server@10086
                def projectInfo = selectedProjectNames[i];
                //当前遍历的项目名称
                def currentProjectName = "${projectInfo}".split("@")[0]
                //当前遍历的项目端口
                def currentProjectPort = "${projectInfo}".split("@")[1]
                def scannerHome=tool 'SonarQube-Scanner'//根据自己的Jenkinssonarqube-scanner环境修改
                withSonarQubeEnv('SonarQube6.7'){ //引入Jenkinssonarqube环境
                    sh """
                		cd ${currentProjectName}
                		${scannerHome}/bin/sonar-scanner
                	"""
                }
    
            }
    
    
       }
       stage('编译,安装公共子工程') {
       	sh "mvn -f tensquare_common clean install"
       }
       stage('编译,打包微服务工程,上传镜像') {
            for (int i=0; i<selectedProjectNames.length; i++) {
                //tensquare_eureka_server@10086
                def projectInfo = selectedProjectNames[i];
                //当前遍历的项目名称
                def currentProjectName = "${projectInfo}".split("@")[0]
                //当前遍历的项目端口
                def currentProjectPort = "${projectInfo}".split("@")[1]
                sh "echo '开始制作镜像'"
                sh "mvn -f ${currentProjectName}  clean package dockerfile:build"
                sh "echo '镜像制作好了'"
                //定义镜像名称
                def imageName = "${currentProjectName}:${tag}"
                //对镜像打上标签
                sh "docker tag ${imageName} ${harbor_url}/${harbor_project}/${imageName}"
                //把镜像推送到Harbor
                withCredentials([usernamePassword(credentialsId: "${harbor_auth}", passwordVariable: 'password', usernameVariable: 'username')]) {
                        //登录到Harbor
                        sh "docker login -u ${username} -p ${password} ${harbor_url}"
                        //镜像上传
                        sh "docker push ${harbor_url}/${harbor_project}/${imageName}"
                        sh "echo 镜像上传成功"
                }
               //=====以下为远程调用进行项目部署========
               for(int j=0; j<selectedServers.size(); j++){
                   //每个服务名称
                   def currentServer = selectedServers[j]
                   //添加微服务运行时的参数:spring.profiles.active
                   def activeProfile = "--spring.profiles.active="
                   if(currentServer=="master_server"){
                        activeProfile = activeProfile+"eureka-server1"
                   }else if(currentServer=="slave_server1"){
                        activeProfile = activeProfile+"eureka-server2"
                   }
                    sh "echo '应用部署开始'"
                    sshPublisher(publishers: [
                           sshPublisherDesc(configName: "${currentServer}",
                           transfers: [
                               sshTransfer(cleanRemote: false,
                               excludes: '',
                               // 触发的命令,deploy.sh
                               execCommand: "/opt/jenkins_shell/deployCluster.sh $harbor_url $harbor_project $currentProjectName $tag $currentProjectPort",
                               execTimeout: 120000,
                               flatten: false,
                               makeEmptyDirs: false,
                               noDefaultExcludes: false,
                               patternSeparator: '[ , ]+',
                               remoteDirectory: '',
                               remoteDirectorySDF: false,
                               removePrefix: '',
                               sourceFiles: '')
                           ],
                           usePromotionTimestamp: false,
                           useWorkspaceInPromotion: false,
                           verbose: false)
                    ])
                    sh "echo '应用部署结束'"
                }
            }
       }
    
    }
    

    3)在两个生产服务器中 "/opt/jenkins_shell" 目录下加入 "deployCluster.sh" 脚本,并授予执行权限;

    deployCluster.sh

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

    注意:需要修改 Harbor 登录信息。

    2、高可用的nginx

    1)安装Nginx(已完成)

    2)配置nginx

    upstream zuulServer {
            server 192.168.87.103:10020 weight=1;
            server 192.168.87.104:10020 weight=1;
    }
    server {
            listen       9090;
            listen       [::]:80;
            server_name  _;
            root         /usr/share/nginx/html;
    
            # Load configuration files for the default server block.
            include /etc/nginx/default.d/*.conf;
    
            location / {
               proxy_pass http://zuulServer/;
    		}
    ...
    
    
  • 相关阅读:
    Linux中使用dd制作文件的.img
    python正则表达式
    使用@property
    Win10添加删除虚拟打印机方法
    jenkins权限
    RedHat7.2下Jenkins的安装配置
    jenkins忘记管理员账号密码的补救方法
    RHEL软件安装
    docker 常用指令(RHLE)
    /var/run/yum.pid 已被锁定,PID 为 4242 的另一个程序正在运行
  • 原文地址:https://www.cnblogs.com/zjazn/p/15515363.html
Copyright © 2020-2023  润新知