网站首页 > 开源技术 正文
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-08 vue2组件系列第四十二节:NavBar 导航栏
- 2024-09-08 从零开始学Python——使用Selenium抓取动态网页数据
- 2024-09-08 黑客突破macOS的安全防御,新型恶意软件正在偷偷的窃取你的文件
- 2024-09-08 vue2组件系列第三十六节:Lazyload 图片懒加载
- 2024-09-08 Visa|实习面试|2022 暑假(visa issues)
- 2024-09-08 消息中间件RabbitMQ入门详解(消息中间件mq作用)
- 2024-09-08 vue2组件系列第二十二节:SwitchCell 开关单元格
- 2024-09-08 vue2组件系列第二十节:按钮式单选组件
- 2024-09-08 vue2组件系列第四十节:NoticeBar 通告栏
- 2024-09-08 vue2组件系列第二十六节:PasswordInput 密码输入框
欢迎 你 发表评论:
- 11-22qq空间权限破解器是真的吗(2021qq空间权限破解器安卓版)
- 11-22win10怎么隐藏桌面图标(w10怎样隐藏桌面图标)
- 11-22hp台式机怎么进入u盘启动项(hp台式机怎么设置u盘启动)
- 11-22破解别人空间访问权限(如何破解别人空间权限)
- 11-22安卓解压zarchiver免费版(安卓解压zarchiver使用教学)
- 11-22百度qq号申请注册(在百度上申请qq账号)
- 11-22dos是什么软件
- 11-22系统u盘启动盘(系统 u盘启动)
- 最近发表
- 标签列表
-
- jdk (81)
- putty (66)
- rufus (78)
- 内网穿透 (89)
- okhttp (70)
- powertoys (74)
- windowsterminal (81)
- netcat (65)
- ghostscript (65)
- veracrypt (65)
- asp.netcore (70)
- wrk (67)
- aspose.words (80)
- itk (80)
- ajaxfileupload.js (66)
- sqlhelper (67)
- express.js (67)
- phpmailer (67)
- xjar (70)
- redisclient (78)
- wakeonlan (66)
- tinygo (85)
- startbbs (72)
- webftp (82)
- vsvim (79)

本文暂时没有评论,来添加一个吧(●'◡'●)