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}"
              )
          }
      }
  }
}

 

原文地址:https://www.cnblogs.com/ZFBG/p/14676943.html