网站首页 > 博客文章 正文
Jenkins是一款开源CI&CD软件,用于自动化各种任务,包括构建、测试和部署软件.
Jenkins支持各种运行方式,可通过系统包,Docker或者通过一个独立的Java程序.
Jenkins Pipeline
Jenkins Pipeline (或简称为"Pipeline")是一套插件,将持续交付的实现和实施集成到Jenkins中。
持续交付Pipeline自动化的表达了这样一种流程:将基于版本控制管理的软件持续的交付到您的用户和消费者手中。
Jenkins Pipeline提供了一套可扩展的工具,用于将“简单到复杂”的交付流程实现为“持续交付即代码”。 Jenkins Pipeline的定义通常被写入到一个文本文件(称为 Jenkinsfile )中,该文件可以被检入到项目的源代码控制库中。
通过 war 部署 Jenkins
1. 下载Jenkins: http://mirrors.jenkins.io/war-stable/latest/jenkins.war
2. 打开终端进入到下载目录
3. 运行命令 java -jar jenkins.war --httpPort=8080
4. 打开浏览器进入链接 http://localhost:8080
通过 Docker 部署 Jenkins
使用以下命令启动一个 Jenkins 容器
docker run \ --name jenkins \ --rm \ -u root \ -p 8084:8080 \ -p 50000:50000 \ -v /usr/share/nginx/html/jenkins/data:/var/jenkins_home \ -v /var/run/docker.sock:/var/run/docker.sock \ -v "$HOME":/home \ --privileged=true \ jenkinsci/blueocean
以上命令, 执行以下操作:
1. 命名一个名叫 jenkins 的 docker 容器
2. 运行结束后删除此容器(若不想删除则不使用此参数)
3. 使用 root 用户登录
4. 将容器中 8080 端口映射到宿主机的 8084 端口
5. 将容器中 50000 端口映射到宿主机的 50000 端口
6. 挂载卷, 将其中的 /var/jenkins_home 目录挂载到宿主机 /usr/share/nginx/html/jenkins/data 下
7. 挂载卷, 将其中用户目录挂载到宿主机用户目录(`~`)
8. 由于本人使用 root 用户进行操作, 为了容器避免权限不足添加 `--privileged=true` 参数
9. 使用镜像 `jenkinsci/blueocean` 创建容器
如果推出容器, 可以使用 `docker start jenkins` 开启
如果在运行途中想要进入容器, 输入:
$ docker exec -it jenkins bash
安装过程
查看控制台, 出现:
INFO: Jenkins is fully up and running
即表明运行容器启动成功, 浏览器中输入 `http://192.168.42.130:8084` 即可看到
此处要求输入秘钥, 在控制台 `*` 中即可看到秘钥:
************************************************************* ************************************************************* ************************************************************* Jenkins initial setup is required. An admin user has been created and a password generated. Please use the following password to proceed to installation: a7fae2529edb4f0392d427b5355613d7 This may also be found at: /var/jenkins_home/secrets/initialAdminPassword ************************************************************* ************************************************************* *************************************************************
如果没记住, 可以在容器内 /var/jenkins_home/secrets/initialAdminPassword 中看到
接下来进行插件安装(需要梯子, 否则可能提示 `This Jenkins instance appears to be offline`)
单分支流水线
克隆 git 仓库
以一个简单的 react 项目为例, 首先将仓库克隆到本地
$ git clone https://github.com/quanzaiyu/building-a-multibranch-pipeline-project.git $ pwd /home/data/building-a-multibranch-pipeline-project
创建单流水线
在 Jenkins 中创建一条流水线
找到 `Pipeline` 选项, Definition 选择 `Pipeline script from SCM`, 在 SCM 中选择 `Git`
创建 Jenkinsfile
在项目根目录创建 Jenkinsfile, 输入以下内容
$ vim Jenkinsfile pipeline { agent { docker { image 'node:10.12.0' args '-p 3000:3000' } } environment { CI = 'true' } stages { stage('Build') { steps { sh 'npm config set registry https://registry.npm.taobao.org' sh 'npm install' sh 'npm run build' } } stage('Test') { steps { sh './jenkins/scripts/test.sh' } } } }
修改 Jenkinsfile 后提交修改
$ git add . $ git commit -m Jenkinsfile
运行流水线
在浏览器中打开 `Open Blue Ocean`, 选择运行, 可以看到输出结果:
使用 Jenkins 项目的检出位于 `/var/jenkins_home/workspace/`
多分支流水线
以上节仓库为例, 新建两个分支: `development` 和 `production`, 将 `master` 分支下的内容检出到当前分支:
$ git branch development $ git checkout development Switched to branch 'development' $ git pull . master From . * branch master -> FETCH_HEAD Already up to date. $ git branch production $ git checkout production Switched to branch 'production' $ git pull . master From . * branch master -> FETCH_HEAD Already up to date.
创建 Jenkinsfile
创建 Jenkinsfile 如下:
pipeline { agent { docker { image 'node:10.12.0' args '-p 3000:3000 -p 5000:5000' } } environment { CI = 'true' } stages { stage('Build') { steps { sh 'npm config set registry https://registry.npm.taobao.org' sh 'npm install' } } stage('Test') { steps { sh './jenkins/scripts/test.sh' } } stage('Deliver for development') { when { branch 'development' } steps { sh './jenkins/scripts/deliver-for-development.sh' input message: 'Finished using the web site? (Click "Proceed" to continue)' sh './jenkins/scripts/kill.sh' } } stage('Deploy for production') { when { branch 'production' } steps { sh './jenkins/scripts/deploy-for-production.sh' input message: 'Finished using the web site? (Click "Proceed" to continue)' sh './jenkins/scripts/kill.sh' } } } }
创建多分支流水线
自由风格的软件
General 基本配置
添加一个仓库, 可能会报权限问题:
添加证书即可, 输入ssh私钥:
选择刚才添加的证书:
Build Triggers 触发器
Build Environment 构建环境
Build 构建步骤
Post-build Actions 构建后行为
系统管理
全局工具配置
配置已安装的Jenkins工具
插件管理
下载、安装和管理Jenkins插件
常用插件
- Pipeline
- Coding Webhook Plugin
- NodeJS Plugin
- Workspace Cleanup Plugin
- Blue Ocean
- Build Timeout
Jenkinsfile 详解
Jenkinsfile 中所有有效的声明式流水线必须包含在一个 pipeline 块中:
pipeline { /* insert Declarative Pipeline here */ }
agent
agent 指令告诉Jenkins在哪里以及如何执行Pipeline或者Pipeline子集。 正如您所预料的,所有的Pipeline都需要 agent 指令。
在执行引擎中,agent 指令会引起以下操作的执行:
- 所有在块block中的步骤steps会被Jenkins保存在一个执行队列中。 一旦一个执行器 executor 是可以利用的,这些步骤将会开始执行。
- 一个工作空间 workspace 将会被分配, 工作空间中会包含来自远程仓库的文件和一些用于Pipeline的工作文件
docker
使用给定的容器执行流水线或阶段。
agent { docker { image 'maven:3-alpine' label 'my-defined-label' args '-v /tmp:/tmp' } }
各语言代理示例
下面是一个简单的Pipeline各种语言示例。
Java
pipeline { agent { docker 'maven:3.3.3' } stages { stage('build') { steps { sh 'mvn --version' } } } }
Node.js / JavaScript
pipeline { agent { docker 'node:10.12.0' } stages { stage('build') { steps { sh 'npm --version' } } } }
Ruby
pipeline { agent { docker 'ruby' } stages { stage('build') { steps { sh 'ruby --version' } } } }
Python
pipeline { agent { docker 'python:3.5.1' } stages { stage('build') { steps { sh 'python --version' } } } }
PHP
pipeline { agent { docker 'php' } stages { stage('build') { steps { sh 'php --version' } } } }
阶段级代理
pipeline { agent none stages { stage('Example Build') { agent { docker 'maven:3-alpine' } steps { echo 'Hello, Maven' sh 'mvn --version' } } stage('Example Test') { agent { docker 'openjdk:8-jre' } steps { echo 'Hello, JDK' sh 'java -version' } } } }
stages
Pipelines由多重steps组成,包括构建、测试和部署等应用。 Jenkins Pipeline允许您使用一种简单的方式组合多重steps,以帮助您实现多种类型的自动化构建过程。
可以把“step”看作一个简单的命令去执行一个简单的动作,或者说是一个步骤。 当一个步骤运行成功时继续运行下一个步骤。 当任何一个步骤执行失败时,Pipeline的执行结果也为失败。
当所有的步骤都执行完成并且为成功时,Pipeline的执行结果为成功。
pipeline { agent any stages { stage('Example') { steps { echo 'Hello World' } } stage('Test') { steps { echo 'Test' } } } }
steps
steps 部分在给定的`stage` 指令中执行的定义了一系列的一个或多个steps。
pipeline { agent any stages { stage('Example') { steps { sh 'whoami' echo 'Hello World' } } } }
post
当Pipeline运行完成时,你可能需要做一些清理工作或者基于Pipeline的运行结果执行不同的操作, 这些操作可以放在 post 部分。
pipeline { agent any stages { stage('Test') { steps { sh 'echo "Fail!"; exit 1' } } } post { always { echo 'This will always run' } success { echo 'This will run only if successful' } failure { echo 'This will run only if failed' } unstable { echo 'This will run only if the run was marked as unstable' } changed { echo 'This will run only if the state of the Pipeline has changed' echo 'For example, if the Pipeline was previously failing but is now successful' } } }
使用Jenkins构建Vue项目的示例
pipeline { agent { docker 'node:latest' } stages { stage('build') { steps { sh 'whoami' sh 'node --version' sh 'npm --version' sh 'npm config set chromedriver_cdnurl http://cdn.npm.taobao.org/dist/chromedriver' sh 'npm config set sass_binary_site https://npm.taobao.org/mirrors/node-sass/' sh 'npm config set phantomjs_cdnurl https://npm.taobao.org/mirrors/phantomjs/' sh 'npm config set electron_mirror https://npm.taobao.org/mirrors/electron/' sh 'npm install' sh 'npm run build' sh 'mkdir -p www' sh 'rm -rf www/*' sh '\\cp -r -a dist/* www' sh 'ls www' sh 'pwd' } } } }
部署时使用 www 目录即可
解决方案
卷权限问题
如果挂载卷时提示权限错误 `Permission denied`, 有以下解决方案:
1. 在运行容器的时候,给容器加特权,及加上 `--privileged=true` 参数
2. 临时关闭 selinux, 执行 `setenforce 0`
3. 添加selinux规则,改变要挂载的目录的安全性文本
查看容器内权限:
$ docker exec jenkins whoami && id $ docker exec jenkins ls -la /var/jenkins_home # or $ docker run -ti --rm --entrypoint="/bin/bash" jenkinsci/blueocean -c "whoami && id" $ docker run -ti --rm --entrypoint="/bin/bash" jenkinsci/blueocean -c "ls -la /var/jenkins_home"
结束语
这是我第一次发文, 发现头条貌似不支持Markdown, 特别不习惯富文本编辑器, 着实郁闷了一下, 排版可能不太好, 请大家谅解。
后续将继续发布各种技术方面的文章, 还请大家多多支持。
猜你喜欢
- 2024-09-20 Pipeline+Jenkins流水线构建(jenkins工作流)
- 2024-09-20 用代码描述流水线-Jenkins Pipeline 详解
- 2024-09-20 「博文精选」Jenkins pipeline控制并行执行job个数
- 2024-09-20 微服务从代码到k8s部署应有尽有大结局(k8s部署)
- 2024-09-20 测试开发丨从零开始,手把手教你在Jenkins中创建Pipeline Job!
- 2024-09-20 Jenkins Pipeline 部署 Kubernetes 应用
- 2024-09-20 Jenkins Pipeline 结合 Gitlab 实现 Node 项目自动构建
- 2024-09-20 别再用jenkins freestyle了,教你快速编写jenksinfile,离线调试
- 2024-09-20 Jenkins 持续集成企业实战示例(jenkins持续集成原理)
- 2024-09-20 基于Docker平台的Jenkins项目管理(5)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- powershellfor (55)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)