zoukankan      html  css  js  c++  java
  • jenkins + gitlab 利用pipeline 完整构建项目

    jenkA

    安装

    Tomcat安装:

    tar zxvf jdk-8u45-linux-x64.tar.gz 
    mv jdk1.8.0_45 /usr/local/jdk
    tar zxf apache-maven-3.5.0-bin.tar.gz
    mv apache-maven-3.5.0 /usr/local/maven
    vi /etc/profile
    JAVA_HOME=/usr/local/jdk
    PATH=$JAVA_HOME/bin:$PATH:/usr/local/maven/bin
    export JAVA_HOME PATH
    source /etc/profile

    Docker安装:

    tar zxvf jdk-8u45-linux-x64.tar.gz
    mv jdk1.8.0_45 /usr/local/jdk
    tar zxf apache-maven-3.5.0-bin.tar.gz
    mv apache-maven-3.5.0 /usr/local/maven
    docker run -d --name jenkins -p 8080:8080 -p 50000:50000 -u root -v /opt/jenkins_home:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker -v /usr/local/maven:/usr/local/maven -v /usr/local/jdk:/usr/local/jdk -v /etc/localtime:/etc/localtime --restart=always --name jenkins jenkins/jenkins:lts

    jenkins基本配置

     

    1. 插件安装

      由于国外源比较慢需要要修改为清华源

      cd /var/lib/jenkins/updates

      由于每个版本不一样下面这一步按照实际修改

      sed -i 's/https://updates.jenkins.io/download/https://mirrors.tuna.tsinghua.ed u.cn/jenkins/g' default.json && sed -i 's/http://www.google.com/https://www.baidu.com/g' default.json

      同时修改页面的json(主要是做搜索展示用的)

      在Dashboard-->>插件管理--->>高级-->>升级站点
      https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

      完成之后重启 可以利用api重启

      http://192.168.75.169:8080/restart

    2. 设置中文

      在插件里面搜索 Localization: Chinese (Simplified)

      默认是安装的 如果没有安装 安装上即可

      安装完成页面如下

    jenkins常见插件

    Jnkines核心功能应用

    项目管理

    新建一个项目 新建项目--->选择风格输入名称--->源码管理选择git输入代码地址(按照需求选择参数 比如丢弃旧的构建)-->配置账号密码-->指定分支

    如果没问题 那么一个简单的CD就完成了

    如果账号密码输入错误想要修改可以在 Dashboard--->凭据---->系统---->全局凭据里面找到对应的账号密码修改

    用户与权限

    Jenkins使用Role-based Authorization Strategy插件来实现基于角色的用户权限控制。

    首先安装插件 (Role-based Authorization Strategy)

    安装插件之后在Dashboard-->全局安全配置里面打开策略

    1. 激活基于角色策略

      Manage and Assign Roles

      Global roles 意思是登录和展示项目 这里只选Read即可

      Item roles 是项目权限 利用正则添加

    2. 创建角色 分配角色到用户(权限集合)

      这里主要是吧用户和上面的权限进行结合

       

     

    管理参数化

    这里列举常用的2个

    1. 选项参数

      这里将会把你选择的结果传递给变量env 你在后期就可以直接使用这个变量 除此之外jenkins还有很多自带的变量可以引用

      1. 字符串参数化构建 大同小异

      GitParameter:

      自动获取当前Git地址所有分支,并提供下拉框可选

      同样的道理 这里会把你的选择赋值给branch 这里需要在高级里面自定义匹配规则

      因为如果不这样指定 匹配出来的结果就是 origin/XXX 这样后续就不太去应用这个变量

       

      ExtendedChoiceParameter:

      功能强大,支持单选、多选,读取文件作为值,支持Groovy脚本

     

     

    扩展分布式构建(Master/Slave)

    在系统管理-->节点管理-->新建节点

    这里用ssh连接 需要配置对应的账号密码

    这里需要注意最好把JAVA路径和HOST KEY配置上。要不然会有各种问题

    如上图所示表示连接成功

    可以在构建项目的时候选择 限制项目的运行节点 然后选择对应的标签,但是大部分时候还是在pipline里面使用

    拷贝构建文件到远程服务器

    Publish Over SSH插件:基于SSH发送文件并在远程服务器上执行命令。

    配置SSH密钥对实现免交互认证:

    1. 生成密钥对:ssh-keygen

    2. 将id_rsa.pub公钥内容添加到目标服务器(ssh-copy-id)

    3. 将id_rsa私钥保存到插件配置里

      在系统管理--->系统配置--->Publish over SSH 放入私钥

      同时在下方配置需要登录的目标服务器信息,当然也可以在项目里配置

     

    在远程服务器执行Shell命令

     

     

     

     

     

    pipeline

    声明式:支持大部分Groovy,具有丰富的语法特性,易于编写和设计。pipeline { }

    脚本式:遵循与Groovy相同语法。node { }

    目前主流 声明式

    pipeline {
      agent any
    stages {
      stage('Hello') {
          steps {
              echo 'Hello World'
          }
      }
    }
    }  

     

    Stages是Pipeline中最主要的组成部分,Jenkins将会按照Stages中描述的顺序

    从上往下的执行。

    Stage:阶段,一个Pipeline 可以划分为若干个Stage,每个Stage 代表一组操作,

    比如:Build、Test、Deploy

    Steps:步骤,Steps 是最基本的操作单元,可以是打印一句话,也可以是构建一个Docker 镜像,由各类Jenkins 插件提供,比如命令:sh ‘mvn',就相当于我们平时shell 终端中执行mvn命令一样。

    利用blue ocean可视化pipeline

    .......

    pipeline 语法生成

    可以利用如图的方式方便生成pipeline脚本

    agent any 后面跟标签可以指定服务器执行

    agent {

    label : test

    }
    agent  指定流水线的执行节点
    options 流水线选项,一般用于设置阶段超时时间
    environment 定义所有步骤的环境变量,或者特定步骤
    parameters   触发流水线时提供的参数列表
    triggers 自动化触发
    tools   使用配置的工具,只支持maven、jdk、gradle
    input   用户交互输入
    script   使用脚本式语法
    post   流水线执行完成后执行
    withCredentials 从凭据中读取数据并赋值变量
    指令示例:https://www.jenkins.io/zh/doc/book/pipeline/syntax/#parameters-example

    一个简单的pipeline脚本示例

    pipeline {
      agent {
          label "test"
      }
      environment {
          gitlab_address = "http://192.168.31.90:88/microservice/demo.git"
          gitlab_auth = "d09717ec-47c2-48f2-9c1c-f182b4589e74"
          ansible_ssh_auth = "84ea22bc-c2c6-4f8f-88bb-9ed885819f9e"
      }
      parameters {
          gitParameter branch: '', branchFilter: '.*', defaultValue: 'master', description: '请选择要发布的分支名称', name: 'selectBranch', quickFilterEnabled: false, selectedValue: 'NONE', sortMode: 'NONE', tagFilter: '*', type: 'PT_BRANCH'
          choice choices: ['webservers1', 'webservers2', 'webservers3'], description: '灰度发布策略,分批次部署', name: 'ENV'
      }
      triggers {
          pollSCM('*/1 * * * *')
      }
      stages {
          stage('拉取代码') {
              steps {
                  checkout([$class: 'GitSCM', branches: [[name: "${params.selectBranch}"]], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: "${gitlab_auth}", url: "${gitlab_address}"]]])
              }
          }
          stage('编译构建') {
              steps {
                  sh "/usr/local/maven/bin/mvn clean package -Dmaven.test.skip=true"
              }
          }
          stage('拷贝构建文件到远程主机并部署') {
              steps {
                  // 读取连接Jenkins服务器用户名和密码
                  withCredentials([usernamePassword(credentialsId: '3e642bd1-ac6d-4c08-b01f-1125bf5bed9d', passwordVariable: 'password', usernameVariable: 'username')]) {
                  // ===========================================
                  sh """
    ###################### 主机清单文件 ############################
    cat > /opt/jenkins_home/.hosts << EOF
    [webservers1]
    192.168.31.72
    192.168.31.73
    [webservers2]
    192.168.31.72
    [webservers3]
      192.168.31.72
    EOF
    ###################### Playbook文件 ############################
    cat > /opt/jenkins_home/.playbook.yaml << "EOF"
    - hosts: $ENV   # Jenkins参数化变量
    gather_facts: no
    vars:   # 定义playbook变量,下面{{}}引用这里的变量
      workspace: $WORKSPACE   # WORKSPACE和BUILD_NUMBER引用Jenkins变量
      build_number: $BUILD_NUMBER
      tomcat_dir: "/usr/local/tomcat" # 自定义变量
      backup_dir: "/data/backup"
      backup_filename: "demo-ROOT-$(date +%F)-{{ build_number }}.war" # 格式:项目名-文件名-日期-构建编号
    tasks:
    - name: 推送部署包到远程服务器
      copy: src="{{ item }}" dest={{ tomcat_dir }}/webapps
      with_fileglob:
        - "{{ workspace }}/target/*.war"
    - name: 部署新程序并重启Tomcat
      # 脚本中$必须转义,否则会认为是Jenkins变量
      shell: |  
          cd {{ tomcat_dir }}/webapps
          mv ROOT.war {{ backup_dir }}/{{ backup_filename }}
          mv *.war ROOT.war
          pid=$(ps -ef |grep {{ tomcat_dir }} |egrep -v 'grep' |awk '{print $2}')
          [ -n "$pid" ] && kill -9 $pid
          export JAVA_HOME=/usr/local/jdk
          nohup {{ tomcat_dir }}/bin/startup.sh
    EOF
                  """
                  // ===========================================
                  }
              ansiblePlaybook(
                  playbook: '/opt/jenkins_home/.playbook.yaml',
                  inventory: '/opt/jenkins_home/.hosts',
                  credentialsId: "${ansible_ssh_auth}"
                  )
              }
          }
      }
    }

     

  • 相关阅读:
    [转]Linux(Ubuntu)下如何安装JDK
    第一个MICO CORBA demo实录
    解决/usr/bin/ld: cannot find -lssl
    使用adb shell 进入手机修改文件的权限
    解决某些Android Permission denied
    Java 8新特性终极指南
    Win10系统出问题?简单一招即可修复win10!
    运行时数据区
    linux下vi命令大全
    关于java中final关键字与线程安全性
  • 原文地址:https://www.cnblogs.com/ZFBG/p/14676943.html
Copyright © 2011-2022 走看看