Skip to content

Jenkins 快速入门

一、安装环境 Docker

https://www.docker.com/products/docker-desktop/

Windows https://desktop.docker.com/win/main/amd64/Docker Desktop Installer.exe

二、启动 Jenkins

bash
docker run -u root -d -p 8080:8080 -p 50000:50000 -v C:\\jenkins_home:/var/jenkins_home --name my_jenkins_container -e DOCKER_HOST=unix:///var/run/docker.sock jenkins/jenkins

这行命令是用于在 Docker 中运行 Jenkins CI(持续集成)服务器的命令。让我逐步介绍每个部分的含义:

  1. docker run: 这是 Docker 命令的一部分,用于在容器中运行一个镜像。

  2. -u root: 这是选项,指定在容器内使用 root 用户运行 Jenkins。在某些情况下,Jenkins 可能需要更高的权限来执行某些操作。

  3. -d: 也是一个选项,代表“detached”,使 Jenkins 以后台(守护进程)模式运行。这样你可以继续在终端执行其他命令而无需停留在 Jenkins 容器上。

  4. -p 8080:8080: 这是将主机的 8080 端口映射到容器内 Jenkins 的 8080 端口。Jenkins 的 Web 用户界面将通过主机的 8080 端口进行访问。

  5. -p 50000:50000: 这是将主机的 50000 端口映射到容器内 Jenkins 的 50000 端口。此端口用于 Jenkins 的代理节点(Agent)连接 Jenkins 主节点(Master)。

  6. -v C:\\jenkins_home:/var/jenkins_home: 这是将主机上的目录 C:\jenkins_home(Windows 样式路径)挂载到容器内的 /var/jenkins_home 目录。Jenkins 的数据和配置将存储在挂载的主机目录中,以便持久化保存数据。

  7. jenkins/jenkins: 这是指定要运行的 Jenkins 镜像的名称。Docker 将从 Docker Hub 或本地镜像仓库中拉取该镜像并在容器中运行它。

  8. --name my_jenkins_container: 这是给容器指定一个名称,这个名称是 "my_jenkins_container"。使用容器名称可以方便地对容器进行管理,例如停止或删除容器时可以使用容器名称而不是容器的 ID。

  9. jenkins/jenkins: 这是指定要运行的 Jenkins 镜像的名称。Docker 将从 Docker Hub 或本地镜像仓库中拉取该镜像并在容器中运行它。

请注意,如果你是在类 Unix(如 Linux 或 macOS)系统上运行该命令,则路径应该使用正斜杠(/)而不是反斜杠(\)。

三、安装插件

1. 访问 http://localhost:8080

2. 找到密码

(1) C:\jenkins_home\secrets

(2) 通过容器命令找到

docker exec -it contianer_id bash

cat

3. 安装插件

(只安装语言插件即可)

4. 修改

(1)到这个页面

http://localhost:8080/pluginManager/advanced

(2)升级站点

修改成下面的地址 https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

四、修改 Jenkins 插件镜像地址

以下是一些较为常见的国内 Jenkins 插件镜像源:

  1. 清华大学开源软件镜像站:Jenkins 插件镜像地址为 https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

  2. 阿里云镜像站:Jenkins 插件镜像地址为 https://mirrors.aliyun.com/jenkins/updates/update-center.json

  3. 网易镜像站:Jenkins 插件镜像地址为 https://mirrors.163.com/jenkins/updates/update-center.json

  4. 中科大镜像站:Jenkins 插件镜像地址为 https://mirrors.ustc.edu.cn/jenkins/updates/update-center.json。

五、更新 Jenkins 到最新版 - 更新 war 包

(1) 选择自动更新即可

此时 Manage Jenkins 中的警告将会消失

(2)重启 Jenkins

  1. 点击重启 Manage Jenkins 页面中的重启按钮
  2. 或者 docker restart container_id

(3) 重新访问 http://localhost:8080

(4) 创建一个 hello-world 项目

输出 hello world! jenkins

六、安装插件

1. 在 Jenkins 官网把插件下载下来离线安装

  1. 浏览器输入 Jenkins 插件官网 https://plugins.jenkins.io

  2. 输入 Git

    会是这个页面 https://plugins.jenkins.io/ui/search/?query=Git

  3. 选择第一个 Git https://plugins.jenkins.io/git/

  4. 点击 右上角 How to install

    (1) 此时会弹出一个窗口

    (2) 选择 releases 按钮,会跳到 https://plugins.jenkins.io/git/releases/ 页面

    (3) 点击最新版本 direct link

    (4) 会下载 git.hpi

    (5) 如何导入 git.hpi 插件教程 https://www.jenkins.io/doc/book/managing/plugins/#advanced-installation

    (6) 勾选 - 安装完成后重启Jenkins(空闲时)

2. 配置完国内源后 直接检索下载

管理 Jenkins - 系统管理 - 插件管理 - Available Plugins

  1. Updates (更新)

    这个页面显示当前 Jenkins 系统中所有可用插件的更新信息。如果安装的插件有新的版本可用,这里将列出需要更新的插件列表,以及它们的版本号和其他相关信息。用户可以从这个页面中选择更新插件。

  2. Available Plugins (可用插件)

    这个页面列出了用户可以在 Jenkins 中安装的所有可用插件。Jenkins 社区不断开发新的插件,以增强 Jenkins 的功能和集成其他工具。在这个页面上,用户可以查看插件的名称、描述和版本信息,并可以选择安装需要的插件。

  3. Installed Plugins (已安装插件)

    这个页面显示当前已经安装在 Jenkins 中的插件列表。对于每个安装的插件,用户可以查看其版本号和其他相关信息。同时,这个页面通常也提供了对已安装插件进行配置和管理的选项。

  4. Advanced settings (高级设置)

    这个页面可能包含一些高级选项和设置,用于定制 Jenkins 的系统管理功能。具体包含的内容可能因 Jenkins 版本和安装的插件而异,可能包括一些系统级配置和调整。

  5. Download progress (下载进度)

    如果用户在安装或更新插件时,Jenkins 需要从远程仓库下载插件文件,这个页面可能会显示下载进度信息。这样用户就可以了解插件下载的状态和进度。

七、凭据配置 - 源码管理

凭据 - Stores scoped to Jenkins - 全局 - Add Credentials

  • Username with password
  • SSH Username with private key
  • Secret file
  • Secret text
  • Certificate

在 Jenkins 中,"凭据" 是用于存储和管理敏感信息(如用户名、密码、SSH 密钥等)的功能。通过使用凭据,你可以安全地在 Jenkins 作业和构建过程中引用这些敏感数据,而无需明文存储在配置文件中。

下面解释每个选项的含义:

  1. Username with password (用户名与密码)

    这个选项用于创建一个存储用户名和密码的凭据。 它是用于许多基本的用户名密码认证场景,比如登录到版本控制系统或其他应用程序所需的凭据。

  2. SSH Username with private key (SSH 用户名与私钥)

    这个选项用于创建一个存储 SSH 用户名和私钥的凭据。 SSH 凭据通常用于在 Jenkins 作业中执行远程命令或与其他服务器进行安全通信。

  3. Secret file (机密文件)

    这个选项用于上传和存储敏感的机密文件,比如证书文件或其他需要在 Jenkins 作业中使用的加密文件。

  4. Secret text (机密文本)

    这个选项用于存储简短的机密文本,例如 API 密钥或其他不需要文件形式的敏感信息。

  5. Certificate (证书)

    这个选项用于存储和管理数字证书。 数字证书通常用于安全通信和身份验证。

在 "Stores scoped to Jenkins"(Jenkins 作用域) 下,"全局" 表示这些凭据是针对整个 Jenkins 实例的,可以在 Jenkins 的任何作业、构建或其他配置中使用。这样的全局凭据对于整个 Jenkins 环境中的不同任务都是可见和可用的。

通过选择适当的凭据类型,并填写相关信息,管理员可以将这些敏感数据安全地存储在 Jenkins 中,并在需要时将其提供给作业和构建使用,而无需明文暴露这些敏感信息。

1. 用户名密码

2. 私钥的方式

3. 获取 gitee 开源项目

4. 获取 gitee 私有项目(用户名或者密码的方式)

bash
npm install --registry=https://registry.npmmirror.com

npm run build

# 检查目录是否存在
if [ -d "./dist" ]; then
  # 使用 tar 命令将目录打包为 dist.tar.gz
  tar -czvf dist.tar.gz ./dist
  echo "目录 'dist' 已成功打包为 'dist.tar.gz'。"
  # 将压缩包复制到远程服务器
  REMOTE_SERVER="ffffee.com"
  REMOTE_USER="root"
  REMOTE_PATH="/home/"

  scp dist.tar.gz $REMOTE_USER@$REMOTE_SERVER:$REMOTE_PATH

  # 在远程服务器上解压缩
  ssh $REMOTE_USER@$REMOTE_SERVER "cd $REMOTE_PATH && tar -xzvf dist.tar.gz"
else
  echo "目录 'dist' 不存在。请确保目录存在并运行脚本。"
fi

上面脚本 如果 ssh 私钥和主机不一致会出错,可以使用下面的方法解决:

禁用 StrictHostKeyChecking:虽然不推荐用于生产环境,但您可以在 Jenkins 脚本中暂时禁用 StrictHostKeyChecking。在 scp 和 ssh 命令中添加 -o StrictHostKeyChecking=no 选项。请注意,此方法会带来安全风险,因为它允许连接到任何服务器而不进行验证。

bash
npm install --registry=https://registry.npmmirror.com

npm run build

# 检查目录是否存在
if [ -d "./dist" ]; then
  # 使用 tar 命令将目录打包为 dist.tar.gz
  tar -czvf dist.tar.gz ./dist
  echo "目录 'dist' 已成功打包为 'dist.tar.gz'。"
  # 将压缩包复制到远程服务器
  REMOTE_SERVER="ffffee.com"
  REMOTE_USER="root"
  REMOTE_PATH="/home/"

  scp -o StrictHostKeyChecking=no -v dist.tar.gz $REMOTE_USER@$REMOTE_SERVER:$REMOTE_PATH

  # 在远程服务器上解压缩
  ssh -o StrictHostKeyChecking=no -v $REMOTE_USER@$REMOTE_SERVER "cd $REMOTE_PATH && tar -xzvf dist.tar.gz"
else
  echo "目录 'dist' 不存在。请确保目录存在并运行脚本。"
fi

5. 使用 ssh 私钥的方式登录 远程服务器

安装 Publish Over SSH 插件

bash
cat ~/.ssh/id_rsa.pub

ssh-copy-id -i ~/.ssh/id_rsa.pub root@ffffee.com

5. 获取 github 代码

八、流水线配置

1. 声明式语法

Jenkins 是一个用于构建、部署和自动化软件开发流程的开源持续集成和持续交付(CI/CD)工具。在 Jenkins 中,有两种主要的 Pipeline 语法:Scripted Pipeline 和 Declarative Pipeline。

你问到的是 Jenkins 的声明式语法(Declarative Pipeline Syntax)。声明式 Pipeline 是 Jenkins Pipeline 的一种较新、更加结构化和可读性更强的语法。它采用了一种声明式的方式来定义 Jenkins 构建流水线,着重于简化 Pipeline 的编写过程,并且提供了更严格的语法检查和可视化功能。

以下是声明式 Pipeline 语法的一些主要特点和示例:

  1. 定义 Pipeline:使用pipeline关键字来定义一个 Pipeline,并指定参数。
groovy
pipeline {
    // 定义参数
    agent any
    stages {
        // 此处定义构建的阶段
        stage('Build') {
            steps {
                // 构建步骤
                // 例如:调用构建工具进行编译
            }
        }
        stage('Test') {
            steps {
                // 测试步骤
                // 例如:运行测试套件
            }
        }
        stage('Deploy') {
            steps {
                // 部署步骤
                // 例如:将构建结果部署到服务器
            }
        }
    }
}
  1. 代理设置:使用agent来指定 Pipeline 运行的代理节点(即构建运行所在的计算机)。
groovy
pipeline {
    agent {
        // 在任意可用代理节点上运行
        any
    }
    // ...
}
  1. 环境变量:可以在 Pipeline 中定义全局或阶段特定的环境变量。
groovy
pipeline {
    environment {
        // 定义全局环境变量
        MY_GLOBAL_VAR = 'global-value'
    }
    stages {
        stage('Build') {
            environment {
                // 定义阶段特定的环境变量
                MY_STAGE_VAR = 'stage-value'
            }
            steps {
                // 使用环境变量
                echo "Global Var: ${MY_GLOBAL_VAR}, Stage Var: ${MY_STAGE_VAR}"
            }
        }
    }
}
  1. 条件控制:可以根据条件决定是否执行某个阶段或步骤。
groovy
pipeline {
    stages {
        stage('Build') {
            steps {
                // ...
            }
        }
        stage('Test') {
            when {
                // 仅当指定条件满足时才运行此阶段
                branch 'master'
            }
            steps {
                // ...
            }
        }
    }
}

这只是声明式 Pipeline 语法的一些简单示例,实际上它提供了丰富的功能和选项来适应各种复杂的构建和部署流程。要深入了解更多细节和功能,请查阅 Jenkins 官方文档。

2. 流水线打包项目

是的,正确地使用 Jenkinsfile 需要安装一些相关的插件。在 Jenkins 中使用 Pipeline 功能(即通过 Jenkinsfile 定义和管理 Pipeline)需要安装以下插件:

  1. Pipeline: 这是 Jenkins 的核心 Pipeline 插件,它支持使用 Jenkinsfile 定义 Pipeline。

  2. Pipeline: Basic Steps: 提供了一系列基本的 Pipeline 步骤,比如echosh等,用于在 Pipeline 中执行任务。

  3. Pipeline: Multibranch: 如果你的代码库使用多个分支,这个插件允许你创建和管理多分支 Pipeline。

  4. Pipeline: SCM Step: 支持在 Pipeline 中使用不同的版本控制系统(SCM),比如 Git、Subversion 等。

  5. Git Plugin (如果使用 Git 作为版本控制系统): 支持在 Pipeline 中使用 Git。

  6. GitHub Integration Plugin (如果使用 GitHub): 提供与 GitHub 的集成支持,允许自动触发 Pipeline 等功能。

这些插件通常是在 Jenkins 安装过程中选择安装的,或者在 Jenkins 的"插件管理"界面中手动安装。你可以按照以下步骤检查并安装这些插件:

  1. 登录到 Jenkins 并进入 Jenkins 的控制面板。

  2. 点击"Manage Jenkins"(管理 Jenkins)选项。

  3. 在管理界面中,选择"Manage Plugins"(管理插件)选项。

  4. 在"Available"(可用插件)选项卡中,搜索并选择需要的插件,然后点击"Install"(安装)按钮来安装它们。

  5. 安装完毕后,重启 Jenkins 服务,以使新安装的插件生效。

确保你已经安装了 Pipeline 及其相关插件,这样 Jenkins 才能正确解析和执行你的 Jenkinsfile 中定义的 Pipeline。

3. 流水线把打包后的项目推送到远程

以下是使用 SSH 密钥认证的脚本示例:

  1. 首先,在 Jenkins 服务器上生成 SSH 密钥对: 在 Jenkins 服务器上打开终端,并运行以下命令生成 SSH 密钥对:

    bash
    ssh-keygen -t rsa

    这将生成一对公钥和私钥,默认情况下,它们会保存在 ~/.ssh 目录中。

  2. 将公钥复制到远程服务器: 使用 ssh-copy-id 命令将生成的公钥复制到远程服务器上的 ~/.ssh/authorized_keys 文件中,从而将你的公钥添加到远程服务器的授权列表。

    bash
    ssh-copy-id -i ~/.ssh/id_rsa.pub ${REMOTE_USER}@${REMOTE_SERVER}

    REMOTE_USER 替换为远程服务器上的用户名,REMOTE_SERVER 替换为远程服务器的 IP 地址或主机名。你可能需要输入远程服务器的密码一次以完成此步骤。

  3. 修改脚本,不再需要密码输入: 在脚本中,你可以删除掉 scpssh 命令中的 ${REMOTE_USER}@${REMOTE_SERVER} 部分,并在 ${REMOTE_USER}@${REMOTE_SERVER}:${REMOTE_PATH} 中直接使用远程服务器的用户名和地址。

    bash
    # 将压缩包复制到远程服务器
    REMOTE_SERVER="your_remote_server_ip_or_hostname"
    REMOTE_USER="your_remote_server_username"
    REMOTE_PATH="/path/to/remote/directory"
    
    scp rd.tar.gz $REMOTE_USER@$REMOTE_SERVER:$REMOTE_PATH
    
    # 在远程服务器上解压缩
    ssh $REMOTE_USER@$REMOTE_SERVER "cd $REMOTE_PATH && tar -xzvf rd.tar.gz"
bash
PS F:\jenkins> docker exec -it 3fcf bash
root@3fcfccbc2326:/# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa
Your public key has been saved in /root/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:J6WGcm/vEyFl0U6/6ex8F3hcqmgIa0yn8tc3s9s67GI root@3fcfccbc2326
The key's randomart image is:
+---[RSA 3072]----+
|          .o     |
|          o o    |
|         o.o .   |
|       ..o. . . .|
|    . o S...  o+.|
|     ooo.o.  .++ |
|     o =oo + +. .|
|    . =.o.E Boo o|
|     +.. +o==O+..|
+----[SHA256]-----+
root@3fcfccbc2326:/# ssh-copy-id -i ~/.ssh/id_rsa.pub root@ffffee.com
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host 'ffffee.com (101.42.150.216)' can't be established.
ECDSA key fingerprint is SHA256:UZ+XBZmUmvcuyzbKyKhlDLucZMb7ktr4GdAbGMhJ4oA.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@ffffee.com's password:

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'root@ffffee.com'"
and check to make sure that only the key(s) you wanted were added.
shell
# 检查目录是否存在
if [ -d "./rd" ]; then
  # 使用 tar 命令将目录打包为 rd.tar.gz
  tar -czvf rd.tar.gz ./rd
  echo "目录 'rd' 已成功打包为 'rd.tar.gz'。"
  # 将压缩包复制到远程服务器
  REMOTE_SERVER="ffffee.com"
  REMOTE_USER="root"
  REMOTE_PATH="/home/"

  scp rd.tar.gz $REMOTE_USER@$REMOTE_SERVER:$REMOTE_PATH

  # 在远程服务器上解压缩
  ssh $REMOTE_USER@$REMOTE_SERVER "cd $REMOTE_PATH && tar -xzvf rd.tar.gz"
else
  echo "目录 'rd' 不存在。请确保目录存在并运行脚本。"
fi

4. 流水线配置定时任务

5. webhook - 推送代码自动更新

一般是服务器的方式

九、Jenkinsfile 编写

1. Jenkinsfile 基本语法

2. Jenkinsfile ssh 登录远程服务器

3. Jenkinsfile 使用环境变量

4. docker-compose 启动 Jenkins 并配置环境变量

十、实战 Jenkinsfile 的方式自动化打包部署 Vue、React 项目

十一、实战 Jenkinsfile 的方式自动化部署 Node.js 项目

十二、实战 自动化部署 electron 项目(Windows)

需要本地打包,需要在物理机上运行命令

十三、Jenkins Slave 多节点配置

在 Jenkins 中,多节点配置(Multi-Node Configuration)是指将 Jenkins 配置为使用多台计算机(节点)来执行构建和任务。这个功能也被称为分布式构建或 Jenkins 的主从节点配置。

默认情况下,Jenkins 是单节点的,所有的构建和任务都在 Jenkins 服务器上运行。但是,当项目变得复杂,构建工作量增加时,单个 Jenkins 服务器可能无法满足需求。这时,你可以配置多个节点,将构建任务分布到这些节点上,实现负载均衡和并行构建。

多节点配置有两种类型的节点:

  1. Master 节点:Jenkins 的主节点是默认的节点,它处理 Web 界面和管理任务。Master 节点可以继续处理一些构建任务,但它的主要作用是分配构建给其他的 Slave 节点来执行。

  2. Slave 节点:也称为 Agent 节点,Slave 节点是附加到 Jenkins 主节点的额外节点。它们是实际执行构建任务的计算机。Slave 节点可以配置在不同的操作系统、硬件和网络环境上,以满足各种需求。

多节点配置的好处包括:

  • 扩展性:通过将构建任务分配到不同的 Slave 节点上,可以扩展 Jenkins 的能力,处理更多的构建和任务。

  • 并行构建:多节点配置允许并行执行多个构建任务,从而提高构建效率。

  • 资源隔离:通过使用不同的节点,可以将不同的任务隔离,避免资源冲突。

要配置多节点,在 Jenkins 中进行以下步骤:

  1. 在 Jenkins 主节点上安装 Slave 节点的代理软件。对于 Java 项目,可以使用"Java Web Start"代理,或者安装 Jenkins 的 Slave 节点软件。
  2. 在 Jenkins 主节点上,进入"Manage Jenkins"(管理 Jenkins)-> "Manage Nodes and Clouds"(管理节点和云)。
  3. 在这里,你可以添加、删除和配置 Slave 节点。
  4. 添加 Slave 节点时,你需要提供节点的名称、节点类型、节点启动方式(例如 Java Web Start、SSH 等)、节点描述和其他相关配置。
  5. 保存节点配置后,Jenkins 会尝试连接到 Slave 节点,并将构建任务分配给它。

通过配置多节点,你可以根据需求灵活地配置 Jenkins,以便更好地管理和处理构建和任务。