本地部署Jenkins环境

0x00 前言

Jenkins是一款使用比较广泛的CI/CD平台,2.0版本开始支持了pipeline,通过jenkinsfile文件进行流水线的控制。本文提供了一种在本地Linux环境中快速搭建Jenkins测试环境的方法。

0x01 环境部署

直接使用docker镜像搭建环境是一种比较快捷的方法。编写如下Dockerfile文件:

FROM jenkins/jenkins:lts

USER root
RUN apt -y update \
    && apt -y upgrade \
    && apt -y install python-pip

使用命令:docker build -t jenkins .进行镜像编译。

编译后使用命令:docker run --name jenkins -i -p 8787:8080 -p 50000:50000 -v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker -v /data/jenkins/jenkins_home:/var/jenkins_home:rw jenkins启动镜像。

/var/run/docker.sock/usr/bin/docker这两个挂载是为了支持Docker in Docker/data/jenkins/jenkins_home这个挂载是为了便于保存Jenkins数据,以免容器重启后又要重新配置。

0x02 初始化Jenkins配置

使用浏览器访问http:/127.0.0.1:8787/页面,进行初始化操作。

配置代理

0x03 编写Jenkinsfile

文档地址:https://jenkins.io/zh/doc/book/pipeline/syntax/

Jenkinsfile分为声明式脚本式,这里主要介绍声明式

下面是一个简单的模板:

pipeline {
  agent {
    label "default"
  }

  stages  {
    stage("检出") {
      steps {
        sh 'ci-init'
        checkout(
          [$class: 'GitSCM', branches: [[name: env.GIT_BUILD_REF]], 
                  userRemoteConfigs: [[url: env.GIT_REPO_URL]]]
        )
      }
    }

    stage("构建") {
      steps {
        echo "构建中..."
        sh 'go version'
        sh 'node -v'
        sh 'java -version'
        sh 'php -v'
        sh 'python -V'
        sh 'gcc -v'
        sh 'make -v'
        // 请在这里放置您项目代码的单元测试调用过程,例如:
        // sh 'mvn package' // mvn 示例
        // sh 'make' // make 示例
        echo "构建完成."
        // archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true // 收集构建产物
      }
    }

    stage("测试") {
      steps {
        echo "单元测试中..."
        // 请在这里放置您项目代码的单元测试调用过程,例如:
        // sh 'mvn test' // mvn 示例
        // sh 'make test' // make 示例
        echo "单元测试完成."
        // junit 'target/surefire-reports/*.xml' // 收集单元测试报告的调用过程
      }
    }

    stage("部署") {
      steps {
        echo "部署中..."
        // 请在这里放置收集单元测试报告的调用过程,例如:
        // sh 'mvn tomcat7:deploy' // Maven tomcat7 插件示例:
        // sh './deploy.sh' // 自研部署脚本
        echo "部署完成"
      }
    }
  }
}

高级用法

指定docker镜像

  agent {
    docker {
      image 'demo/test/base:latest'
      registryUrl 'https://drunkdream-docker.pkg.coding.net'
    }
  }

配置环境变量

  environment {
    MY_ENV = 'test'
  }

访问环境变量

Jenkins内置的环境变量列表可以在http://jenkins-server/pipeline-syntax/globals#env地址中获取。

环境变量可以通过${env.My_ENV}${My_ENV}$My_ENV来访问。需要注意的是,使用引号的时候尽量使用",如:echo "${env.My_ENV}",否则会无法生效。Jenkins应该是在运行时将变量动态替换成了实际值,使用单引号的话,则不会进行替换。

而如果写成sh 'echo ${MY_ENV}'则是可以正常工作的,因为此时是由shell程序进行环境变量的读取。

  stage('测试') {
    steps {
      echo "${env.MY_ENV}"
      echo "${MY_ENV}"
      echo "$MY_ENV"
      sh 'echo $MY_ENV'
      sh 'python -c "print(__import__(\'os\').environ[\'MY_ENV\'])"'
      echo '${env.MY_ENV}' //输出`${env.MY_ENV}`
    }
  }

前五条命令都可以正常输出变量值,但最后一条却无法输出。

将命令行输出赋值给变量

Jenkins的${env.My_ENV}方式不支持默认值,也就是bash中的${MY_ENV:-"test"}写法。如果需要这种用法,可以使用以下方式:

  stage('测试') {
    steps {
      script {
        ENV1 = sh(returnStdout: true, script: 'echo ${MY_ENV:-"default"}').trim()
      }
      sh 'echo ${ENV1}' //可以正常输出
      sh 'python -c "print(__import__(\'os\').environ[\'ENV1\'])"' //会报错
    }
  }

trim()方法可以去掉前后的空白字符。

注意:${MY_ENV:-"default"}不能写成${env.MY_ENV:-"default"}

虽然这种方式赋值的变量也可以通过${env.ENV1}方式访问,但其实它并不是环境变量。

动态配置环境变量

  stage('测试') {
    steps {
      script {
        ENV1 = sh(returnStdout: true, script: 'echo ${MY_ENV:-"default"}').trim()
      }
      withEnv(["MY_ENV=${ENV1}"]) {
        sh 'python -c "print(__import__(\'os\').environ[\'MY_ENV\'])"' //输出default
      }
    }
  }
分享