Jenkins 系列:Jenkins 安装(Windows、Mac、Centos)和简介

本文介绍了Jenkins的起源、发展史,包括其前身Hudson的转变,以及Jenkins在CI/CD中的广泛应用。详细讲解了Jenkins的安装步骤,包括不同系统下的部署方法、先决条件、软件包选择及配置。特别强调了自定义插件和应用场景的灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

Jenkins前身是 Hudson,使用 java 语言开发的自动化发布工具。在中大型金融等企业中普遍使用 Jenkins 来作为项目发布工具。 Jenkins 官方提供的插件使 Jenkins 更为强大。Jenkins 是一个自动化服务器,目前发展超过 15 年,比较成熟的 CI 工具(也可以 CD)能够实现自动化集成发布。建立好流水线后,期间无需专业运维人员介入,开发人员随时发布部署

image

发展历史

Jenkins 的前身是 Hudson,采用 JAVA 编写的持续集成开源工具。

Hudson 由 Sun 公司在 2004 年启动,第一个版本于 2005 年在 java.net 发布。

2007 年开始 Hudson 逐渐取代 CruiseControl 和其他的开源构建工具的江湖地位。

在 2008 年的 JavaOne 大会上在开发者解决方案中获得杜克选择大奖(Duke’s Choice Award)。

在 2010 年 11 月期间,因为 Oracle 对 Sun 的收购带来了 Hudson 的所有权问题。主要的项目贡献者和 Oracle 之间, 尽管达成了很多协议,但有个关键问题就是商标名称“Hudson”。

甲骨文在 2010 年 12 月声明拥有该名称并申请商标的权利。因此,2011 年 1 月 11 日,有人要求投票将项目名称从“Hudson”改为“Jenkins”。

2011 年 1 月 29 日,该建议得到社区投票的批准,创建了 Jenkins 项目。

2011 年 2 月 1 日,甲骨文表示,他们打算继续开发 Hudson,并认为 Jenkins 只是一个分支,而不是重命名。因此,Jenkins 和 Hudson 继续作为两个独立的项目,每个都认为对方是自己的分支。

到 2013 年 12 月,GitHub 上的 Jenkins 拥有 567 个项目成员和约 1,100 个公共仓库,与此相对的 Hudson 有 32 个项目成员和 17 个公共仓库。到现在两者的差异更多,应该说 Jenkins 已经全面超越了 Hudson。此外,大家可能是出于讨厌 Oracle 的情绪,作为 Java 开发者天然地应该支持和使用 Jenkins。

应用场景

集成 svn/git 客户端实现源代码下载检出

集成 maven/ant/gradle/npm 等构建工具实现源码编译打包单元测试

集成 sonarqube 对源代码进行质量检查(坏味道、复杂度、新增 bug 等)

集成 SaltStack/Ansible 实现自动化部署发布

集成 Jmeter/Soar/Kubernetes/……

可以自定义插件或者脚本通过 jenkins 传参运行

可以说 Jenkins 比较灵活插件资源丰富,日常运维工作都可以自动化。

image

Jenkins 安装部署

先决条件

Java8 无论是 Java 运行时环境(JRE)还是 Java 开发工具包(JDK)都可以。

硬件要求

最低配置: 256MB 可用内存,1GB 可用磁盘空间(Docker 推荐 10GB)。

小团队配置: 1GB+可用内存, 50GB+可用磁盘空间。

软件包下载

最新 war 包

最新 pkg 包

最新 exe 包

最新 rpm 包

war 包部署

Jenkins 的 web 应用程序 archive(war)包是可以在任何支持 Java 的操作系统上运行。

将下载的 war 包放到 jenkins 的目录中(可以自定义)。

运行命令 java -jar jenkins.war启动。

此时可以看到 Jenkins 的启动日志,查看是否有异常。

通过浏览器访问http://localhost:8080

注意:可以通过 –httpPort 方式指定端口, java -jar jenkins.war -httpPort=9090。

linux 系统部署

首先下载 rpm 软件包,安装rpm –ivh jenkins-2.150.3-1.1.noarch.rpm

systemctl start jenkins #启动服务

systemctl enable jenkins #开机自启

#!/bin/bash
#jdk must be installed before jenkins can be installed.

#创建jenkins rpm下载目录
mkdir -p /usr/local/src/jenkins
#进入jinkins rpm包目录
cd /usr/local/src/jenkins
#下载 jenkins rpm 包
wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat-stable/jenkins-2.263.1-1.1.noarch.rpm
#安装 rpm 包
rpm -ivh jenkins-2.263.1-1.1.noarch.rpm
#移动到 local目录下
mv /var/lib/jenkins /usr/local/jenkins
#启动jenkins
systemctl start jenkins
#设置开机启动
systemctl enable jenkins

mac 系统部署

brew install jenkins 安装 jenkins 最新版本

brew install jenkins-lts 安装 jenkinsLTS 版本

windows 系统部署

下载软件包通过向导安装即可。

安装后基本配置

解锁

当您第一次访问 Jenkins 的时候,系统会要求您使用自动生成的密码对其进行解锁。解锁秘钥可以通过$JENKINS_HOME/secrets/initialAdminPassword 文件获取。还可以通过在启动日志中获取。

image

image

自定义 jenkins 插件

解锁 Jenkins 之后再自定义 Jenkins 页面,您可以安装任何数量的插件作为初始化的一部分。

分别是安装建议的插件和选择要安装的插件(如果不确定要安装那些的时候可以选择此选项,灵活的自定义安装)。

插件安装多了也没关系,可以后面再 jenkins 插件管理页面删除哦(会很繁琐)。

image

创建用户

在这里创建一个管理员账号,到此 jenkins 的初始化配置已完成。

image

配置更新站点

当改完后,其实还是很慢 🤷‍♀️ 建议配置 nginx 做域名代理 😜

由于使用官方的站点速度相对很慢,这里采用清华大学的 jenkins 更新站点

image

配置文件

以 rpm 方式部署的配置文件在/etc/sysconfig/jenkins,可以定义 Jenkins 启动参数和端口。

jenkins 脚本存放目录:/etc/rc.d/init.d

grep -v ^$ /etc/sysconfig/jenkins | grep -v ^#

image

## Path:        Development/Jenkins
## Description: Jenkins Automation Server
## Type:        string
## Default:     "/var/lib/jenkins"
## ServiceRestart: jenkins
#
# Directory where Jenkins store its configuration and working
# files (checkouts, build reports, artifacts, ...).
#
JENKINS_HOME="/var/lib/jenkins"

## Type:        string
## Default:     ""
## ServiceRestart: jenkins
#
# Java executable to run Jenkins
# When left empty, we'll try to find the suitable Java.
#
JENKINS_JAVA_CMD="/usr/local/jdk/bin/java"

## Type:        string
## Default:     "jenkins"
## ServiceRestart: jenkins
#
# Unix user account that runs the Jenkins daemon
# Be careful when you change this, as you need to update
# permissions of $JENKINS_HOME and /var/log/jenkins.
#
JENKINS_USER="jenkins"

## Type:        string
## Default: "false"
## ServiceRestart: jenkins
#
# Whether to skip potentially long-running chown at the
# $JENKINS_HOME location. Do not enable this, "true", unless
# you know what you're doing. See JENKINS-23273.
#
#JENKINS_INSTALL_SKIP_CHOWN="false"

## Type: string
## Default:     "-Djava.awt.headless=true"
## ServiceRestart: jenkins
#
# Options to pass to java when running Jenkins.
#
JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true"

## Type:        integer(0:65535)
## Default:     8080
## ServiceRestart: jenkins
#
# Port Jenkins is listening on.
# Set to -1 to disable
#
JENKINS_PORT="8080"

## Type:        string
## Default:     ""
## ServiceRestart: jenkins
#
# IP address Jenkins listens on for HTTP requests.
# Default is all interfaces (0.0.0.0).
#
JENKINS_LISTEN_ADDRESS=""

## Type:        integer(0:65535)
## Default:     ""
## ServiceRestart: jenkins
#
# HTTPS port Jenkins is listening on.
# Default is disabled.
#
JENKINS_HTTPS_PORT=""

## Type:        string
## Default:     ""
## ServiceRestart: jenkins
#
# Path to the keystore in JKS format (as created by the JDK 'keytool').
# Default is disabled.
#
JENKINS_HTTPS_KEYSTORE=""

## Type:        string
## Default:     ""
## ServiceRestart: jenkins
#
# Password to access the keystore defined in JENKINS_HTTPS_KEYSTORE.
# Default is disabled.
#
JENKINS_HTTPS_KEYSTORE_PASSWORD=""

## Type:        string
## Default:     ""
## ServiceRestart: jenkins
#
# IP address Jenkins listens on for HTTPS requests.
# Default is disabled.
#
JENKINS_HTTPS_LISTEN_ADDRESS=""

## Type:        integer(0:65535)
## Default:     ""
## ServiceRestart: jenkins
#
# HTTP2 port Jenkins is listening on.
# Default is disabled.
#
# Notice: HTTP2 support may require additional configuration, see Winstone
# documentation for more information.
#
JENKINS_HTTP2_PORT=""

## Type:        string
## Default:     ""
## ServiceRestart: jenkins
#
# IP address Jenkins listens on for HTTP2 requests.
# Default is disabled.
#
# Notice: HTTP2 support may require additional configuration, see Winstone
# documentation for more information.
#
JENKINS_HTTP2_LISTEN_ADDRESS=""

## Type:        integer(1:9)
## Default:     5
## ServiceRestart: jenkins
#
# Debug level for logs -- the higher the value, the more verbose.
# 5 is INFO.
#
JENKINS_DEBUG_LEVEL="5"

## Type:        yesno
## Default:     no
## ServiceRestart: jenkins
#
# Whether to enable access logging or not.
#
JENKINS_ENABLE_ACCESS_LOG="no"

## Type:        integer
## Default:     100
## ServiceRestart: jenkins
#
# Maximum number of HTTP worker threads.
#
JENKINS_HANDLER_MAX="100"

## Type:        integer
## Default:     20
## ServiceRestart: jenkins
#
# Maximum number of idle HTTP worker threads.
#
JENKINS_HANDLER_IDLE="20"

## Type:        string
## Default:     ""
## ServiceRestart: jenkins
#
# Folder for additional jar files to add to the Jetty class loader.
# See Winstone documentation for more information.
# Default is disabled.
#
JENKINS_EXTRA_LIB_FOLDER=""

## Type:        string
## Default:     ""
## ServiceRestart: jenkins
#
# Pass arbitrary arguments to Jenkins.
# Full option list: java -jar jenkins.war --help
#
JENKINS_ARGS=""

<think>好的,用户想知道如何用Python判断目录是否存在并创建它。首先,我需要回忆一下Python中处理文件目录的模块,应该是os或者pathlib。记得os模块有os.path.existsos.makedirs函数,可以检查路径是否存在以及创建目录。而pathlib是Python 3.4之后引入的,用起来更面向对象,可能更简洁。 接下来,用户可能需要两种方法的示例,所以我要分别写ospathlib的实现。比如,用os的话,先检查路径是否存在,如果不存在则创建。这里要注意,os.makedirs可以创建多级目录,而exist_ok参数在Python 3.2之后支持,避免目录已存在时的异常。 然后是pathlib的方法,Path对象的mkdir方法也有parentsexist_ok参数,设置parents=True可以创建父目录,exist_ok=True避免异常。这样代码会更简洁。 另外,用户可能关心异常处理,比如权限问题或者其他错误,但用户的问题没有提到需要处理异常,所以可能暂时不需要深入。但最好还是提一下,比如在os.makedirs时如果目录被其他进程创建了,可能会有异常,但使用exist_ok=True就可以忽略。 还要注意路径字符串的正确性,比如使用正斜杠或反斜杠,在Windows下可能需要转义,但用Python的raw字符串或者双反斜杠处理。不过使用os.path.join或者pathlib可以自动处理路径分隔符,这样更安全。 现在检查是否有相关的引用内容。用户提供的引用中,引用[2]提到了shutil.rmtree删除目录,可能相关,但这里的问题是关于创建目录。引用[4]提到了批量处理脚本,可能涉及目录操作,但具体没有直接相关的信息。所以可能不需要引用这些内容,但如果有必要的话可以看看。比如,引用[2]中的错误可能是因为尝试删除文件而不是目录,所以确保用户创建的是目录而不是文件,但用户的问题主要是判断存在并创建,可能不需要处理删除的情况。 总结下来,步骤应该是:导入模块,检查路径是否存在,不存在则创建。给出两种方法,并说明推荐pathlib因为更现代。同时提到exist_ok参数的重要性,避免报错。可能还要提到跨平台兼容性,因为ospathlib都能处理不同系统的路径。 最后生成相关问题,比如如何递归创建多级目录,检查是文件还是目录,处理权限问题,或者如何遍历目录。这些都与目录操作相关,能帮助用户进一步学习。</think>在Python中判断目录是否存在并创建,可以通过`os`模块或`pathlib`模块实现。以下是具体方法: --- ### 方法1:使用`os`模块 通过`os.path.exists()`检查目录是否存在,若不存在则用`os.makedirs()`创建: ```python import os dir_path = "./my_directory" if not os.path.exists(dir_path): os.makedirs(dir_path) print(f"目录 {dir_path} 创建成功") else: print(f"目录 {dir_path} 已存在") ``` **注意**: - `os.makedirs()`支持递归创建多级目录,例如`dir_path = "./a/b/c"`。 - 添加`exist_ok=True`参数可避免目录已存在时抛出异常: ```python os.makedirs(dir_path, exist_ok=True) ``` --- ### 方法2:使用`pathlib`模块(推荐) `pathlib`提供更简洁的面向对象路径操作: ```python from pathlib import Path dir_path = Path("./my_directory") dir_path.mkdir(parents=True, exist_ok=True) print(f"目录 {dir_path} 已存在或创建成功") ``` **参数说明**: - `parents=True`:自动创建父目录。 - `exist_ok=True`:目录存在时不报错。 --- ### 关键区别 | 功能 | `os`模块 | `pathlib`模块 | |--------------------|-----------------------|----------------------| | 路径操作 | 字符串形式 | 面向对象 | | 跨平台兼容性 | 需手动处理路径分隔符 | 自动适配操作系统 | | 递归创建目录 | 需手动拆分路径层级 | 通过`parents=True`实现 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值