本地部署Jenkins环境

0x00 前言

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

0x01 环境部署

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

  1. FROM jenkins/jenkins:lts
  2. USER root
  3. RUN apt -y update \
  4. && apt -y upgrade \
  5. && apt -y install python-pip
COPY

使用命令: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分为声明式脚本式,这里主要介绍声明式

下面是一个简单的模板:

  1. pipeline {
  2. agent {
  3. label "default"
  4. }
  5. stages {
  6. stage("检出") {
  7. steps {
  8. sh 'ci-init'
  9. checkout(
  10. [$class: 'GitSCM', branches: [[name: env.GIT_BUILD_REF]],
  11. userRemoteConfigs: [[url: env.GIT_REPO_URL]]]
  12. )
  13. }
  14. }
  15. stage("构建") {
  16. steps {
  17. echo "构建中..."
  18. sh 'go version'
  19. sh 'node -v'
  20. sh 'java -version'
  21. sh 'php -v'
  22. sh 'python -V'
  23. sh 'gcc -v'
  24. sh 'make -v'
  25. // 请在这里放置您项目代码的单元测试调用过程,例如:
  26. // sh 'mvn package' // mvn 示例
  27. // sh 'make' // make 示例
  28. echo "构建完成."
  29. // archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true // 收集构建产物
  30. }
  31. }
  32. stage("测试") {
  33. steps {
  34. echo "单元测试中..."
  35. // 请在这里放置您项目代码的单元测试调用过程,例如:
  36. // sh 'mvn test' // mvn 示例
  37. // sh 'make test' // make 示例
  38. echo "单元测试完成."
  39. // junit 'target/surefire-reports/*.xml' // 收集单元测试报告的调用过程
  40. }
  41. }
  42. stage("部署") {
  43. steps {
  44. echo "部署中..."
  45. // 请在这里放置收集单元测试报告的调用过程,例如:
  46. // sh 'mvn tomcat7:deploy' // Maven tomcat7 插件示例:
  47. // sh './deploy.sh' // 自研部署脚本
  48. echo "部署完成"
  49. }
  50. }
  51. }
  52. }
COPY

高级用法

指定docker镜像

  1. agent {
  2. docker {
  3. image 'demo/test/base:latest'
  4. registryUrl 'https://drunkdream-docker.pkg.coding.net'
  5. }
  6. }
COPY

配置环境变量

  1. environment {
  2. MY_ENV = 'test'
  3. }
COPY

访问环境变量

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程序进行环境变量的读取。

  1. stage('测试') {
  2. steps {
  3. echo "${env.MY_ENV}"
  4. echo "${MY_ENV}"
  5. echo "$MY_ENV"
  6. sh 'echo $MY_ENV'
  7. sh 'python -c "print(__import__(\'os\').environ[\'MY_ENV\'])"'
  8. echo '${env.MY_ENV}' //输出`${env.MY_ENV}`
  9. }
  10. }
COPY

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

将命令行输出赋值给变量

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

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

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

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

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

动态配置环境变量

  1. stage('测试') {
  2. steps {
  3. script {
  4. ENV1 = sh(returnStdout: true, script: 'echo ${MY_ENV:-"default"}').trim()
  5. }
  6. withEnv(["MY_ENV=${ENV1}"]) {
  7. sh 'python -c "print(__import__(\'os\').environ[\'MY_ENV\'])"' //输出default
  8. }
  9. }
  10. }
COPY
分享
0 comments
Anonymous
Markdown is supported

Be the first guy leaving a comment!