Skip to content

Jenkins-插件配置

Publish Over SSH

安装插件:Manager Jenkins — > Plugins —> Available Plugins —> Publish over SSH

免密登录

配置密钥

bash
ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.148.240

Manager Jenkins —> System —> Publish over SSH

  • Passphrase:密钥密码
  • Path to key:/root/.ssh/id_rsa.pub

生成时没有密码的话,Passphrase可以不用输入

我们只需要在Path to key 栏配置上刚才生成的密钥文件路径,然后就可以添加SSH Servers了。

新增主机

配置主机:Manager Jenkins —> System —> SSH Servers —> 新增

  • Name:被管理主机名(自定义)
  • Hostname:主机IP地址
  • Username:主机登录账号
  • Remote Directory:远程目录
  • Use password authentication, or use a different key:账号密码登录(使用密钥可以不勾选)
  • Passphrase / Password:密码(使用密钥可不配置)
  • Test Configuration:测试链接

环境变量

Manage Jenkins —> Manage Plugins —> Available plugins—> Environment Injector

使用插件

注入环境变量

在任务配置【构建环境】找到Inject environment variables to the build process將環境變量注入構建過程

  • 属性文件路径:设置属性文件的路径格式必须是Java的.properties

  • Properties Content:多个属性内容。

    Java代码中application-prod.yml中包含类似 ${DEVOPS_MYSQL_HOST}的环境变量占位符

    bash
    # 这会在构建过程中设置系统属性 spring.profiles.active=prod,确保 Maven 构建时使用 application-prod.yml配置文件
    SPRING_PROFILES_ACTIVE=prod
    DEVOPS_MYSQL_HOST=您的数据库主机地址
    DEVOPS_MYSQL_PORT=3306
    DEVOPS_MYSQL_DATABASE_NAME=您的数据库名
    DEVOPS_MYSQL_USERNAME=您的数据库用户名
    DEVOPS_MYSQL_PASSWORD=您的数据库密码

密码环境变量注入

在任务配置【构建环境】找到Inject passwords將密碼作為環境變量注入構建

Node.js

安装nodejs

bash
wget https://nodejs.org/dist/v22.18.0/node-v22.18.0-linux-x64.tar.gz

tar xvf node-v22.18.0-linux-x64.tar.gz
mv node-v22.18.0-linux-x64 /usr/local/nodejs
# 创建软连接
ln -s /usr/local/nodejs/bin/node /usr/local/bin/node
ln -s /usr/local/nodejs/bin/npm /usr/local/bin/npm

# 安装cnpm与配置淘宝镜像
npm config set registry https://registry.npmmirror.com/
# 查看版本
node --version
npm --version

# 安装插件临时使用加速
npm install -g yarn --registry https://registry.npmmirror.com

安装插件

Manager Jenkins —> Available plugins —> 输入 NodeJs >> 勾选插件 >> 点击Install

配置:Manager Jenkins—> Too —> NodeJS 安装

给你这个配置起个名字(如 nodejs-20),选择一个版本(自动安装)或指定一个本地已安装的路径。

  • 别名:自定义如:NodeJs
  • 安装目录:/usr/local/nodejs/
  • Install automatically:取消勾选,这里选择手动安装

npm 加速

一般来说,在使用 npm 时,需要更改 npm 的源,同样在 Jenkins 中也是可以的。安装完 NodeJS 插件后,系统设置中会多一项 Managed files

Manager Jenkins —> Add a new Config —> Npm config file —> Next

新增一个 NPM Registry,填入阿里巴巴镜像源:http://registry.npmmirror.com

在构建项目页面需要勾选构建环境中的Provide Node & npm bin/ folder to PATH

Job 配置 (Job Configuration)

Jenkins 的 NodeJS 插件在设计时是智能的。当您指定了根目录(例如 /usr/local/nodejs/)后,插件会自动地去该目录下的 bin子目录中寻找 nodenpm等可执行文件。

当您勾选了 “Add to PATH” 或是在 Job 中勾选 “Provide Node & npm bin/ folder to PATH” 时,Jenkins 真正添加到 PATH环境变量中的路径其实是:**/usr/local/nodejs/bin/**这个过程是自动完成的,您不需要手动指定 bin目录。

  • 在你的 Pipeline 或 Freestyle job 的配置页面中,找到 “Build Environment” 部分。
  • 勾选 “Provide Node & npm bin/ folder to PATH”
  • 在下拉菜单中,选择你在全局工具中配置好的那个 Node.js 版本(如 nodejs-20)。

一般前端build项目的时会占用系统大量内存资源,可以使用变量限制build的最大上限

bash
# 可以在注入环境变量中定义
NODE_OPTIONS="--max-old-space-size=8096"

# 在shell脚本中临时生效
export NODE_OPTIONS="--max-old-space-size=8096"

GitLab

Gitlab 插件需要Jersey 2 API插件的支持

点击头像 —> Edit Profile —> Access tokens —> Add new token

Gitlab API Token

Gitlab API Toens

  • Token name:自定义如:jenkins
  • Token description:Token描述
  • Expiration date:有效日期,尽量设置大一些
  • Select scopes:勾选api

Jenkins 配置

安装插件:Manager Jenkins — > Plugins —> Available Plugins

Gitlab 配置:系统配置 —> 系统配置 —> Gitlab

  • Connection name:自定义名字
  • GitLab host URL:Gitlab地址可以是Ip地址可以是域名
  • Credentials:上一步申请的Gitlab API Token

SSH 密钥

配置Gitlab密钥

在jenkins服务器生成密钥然将公钥添加到GitLab上

bash
# 创建密钥
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -N '' -C "jenkins@example.com"

# 查看公钥
cat ~/.ssh/id_rsa.pub
  1. 登录 GitLab:进入您的 GitLab 账户。
  2. 导航到 SSH 密钥设置:点击右上角的头像,选择 Preferences > SSH Keys
  3. 添加公钥:在 Key 字段中粘贴您的公钥,然后点击 Add key

在 Jenkins 中配置 SSH 密钥

  1. 登录 Jenkins:打开 Jenkins 的网页界面并登录。

  2. 进入凭据管理:在左侧菜单中选择 Manage Jenkins > Manage Credentials

  3. 添加 SSH 凭据

    • 选择合适的域(通常是 (global))。

    • 点击 Add Credentials。

    • 在凭据类型中选择 SSH Username with private key。

    • 填写 Username(通常为 git)。

    • 在 Private Key 部分,选择 Enter directly,并将私钥(id_rsa)的内容粘贴到此处,包括起始和结束标记。

      bash
      -----BEGIN RSA PRIVATE KEY-----
      MIIEogIBAAKCAQEAtyTw3I2gNoC+nmw8Lk6sX3WxNMab+ng5uFJpunDG18S1CHAH
      ...
      -----END RSA PRIVATE KEY-----

Maven

安装maven

bash
# 下载
wget https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.8.9/binaries/apache-maven-3.8.9-bin.tar.gz
tar -zvxf apache-maven-3.8.9-bin.tar.gz -C /usr/local

# 环境变量
cat >> /etc/profile << "EOF"
export M2_HOME=/usr/local/apache-maven-3.8.9
export PATH=$M2_HOME/bin:$PATH
EOF
source /etc/profile

# 验证
mvn -v

# 创建包存储目录
mkdir -p /data/maven-repository
# 切换国内源,进入到maven的conf目录中,配置文件中
vim /usr/local/apache-maven-3.8.9/conf/settings.xml
# 配置本地仓库,下载的包存在该目录
<localRepository>/data/maven-repository</localRepository>
# 配置阿里云的镜像地址
# 在 <mirrors> 标签下添加
<mirror>
  <id>alimaven</id>
  <name>aliyun maven</name>
  <mirrorOf>central</mirrorOf>
  <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>

配置Maven

Manage Jenkins —> Global Tool Configuration —> Tools —> Maven 安装

  • Name:自定义如:Maven-3.8.9
  • MAVEN_HOME:/usr/local/apache-maven-3.8.9Maven安装路径

安装Maven Integration 插件

Manager Jenkins —> Available plugins —> Available plugins —> 输入 Maven Integration >> 勾选插件 >> 点击Install

Docker

Jenkins 的Docker插件原理是通过Docker的TCP协议或docker.sock发送API请求,临时启动Docker容器处理Jenkins构建任务,任务完成后容器会自动销毁,不近减少资源浪费还减轻Jenkins主节点的压力。

安装插件

Manager jenkins —> Plugin —> Available plugins —> 搜索Docker,可以选择DockerDocker ComposesDocker Pipeline

安装Docker服务

bash
# 注册华为repo
dnf config-manager --add-repo=https://repo.huaweicloud.com/docker-ce/linux/centos/docker-ce.repo

# 软件仓库地址替换
sudo sed -i 's+download.docker.com+mirrors.huaweicloud.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# 替换centos识别版本号
sed -i 's+$releasever+9+' /etc/yum.repos.d/docker-ce.repo

# 安装docker-ce和依赖
dnf -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# insecure-registries需要替换自己的harbor地址
cat > /etc/docker/daemon.json << 'EOF'
{
    "data-root":"/data/docker",
    "bip":"172.18.0.1/16",
    "exec-opts":["native.cgroupdriver=systemd"],
    "insecure-registries": ["192.168.148.130:80"],
    "live-restore":true,
    "ipv6": false,
    "hosts": ["tcp://0.0.0.0:2375", "unix:///var/run/docker.sock"]
}
EOF

# 修改docker.service
vim /usr/lib/systemd/system/docker.service
# 将ExecStart执行替换如下
ExecStart=/usr/bin/dockerd

# 重新加载
systemctl daemon-reload

# 开启Docker服务
systemctl enable docker --now
# 登录
docker login http://192.168.148.130:80
Username: admin
Password: Harbor12345

# 创建网络
docker network create jenkins

配置插件

Manager Jenkins —> Clouds—> New cloud —> Type选择Docker

Docker Cloud details

Docker 部分,配置Docker主机的连接信息。如果Jenkins运行在Docker主机上,直接使用Unix socket/var/run/docker.sock即可。配置Docker镜像、容器和构建参数。

  • Cloud name:Docker-28.33
  • Docker Host URI:tcp:192.168.148.112:2375主机IP填写docker部署的主机IP
  • Test Connection:出现Docker版本信息链接成功Version = 28.3.3, API Version = 1.51

Docker Agent templates

创建模板,镜像最好需要自定义镜像,因为涉及到凭证问题

  • Labels:自定义如:docker-on-slave

  • Enabled:勾选是启动否则是禁用

  • Name:自定义如:inbound-agent

  • Docker Image:官网镜像jenkins/inbound-agent:latest,最好自定义镜像

  • Containers settings:容器设置要求容器内必须有Java

    • Docker Command:启动容器的指令,适用于自定义构建的镜像

    • Hostname:主机名

    • User:指定容器运行的用户

    • Extra Groups:指定容器运行的组

      挂载docker.sock涉及到权限问题,需要设置Extra Groups

      bash
      # 启动容器会指定--group-add=998
      getent group docker | cut -d: -f3
    • DNS:设置容器的DNS,如果没有设置使用主机DNS

    • DNS Search:设置容器DNS搜索域,如果没有设置使用主机配置

    • Network:设置容器网络,可以自定义如:jenkins

    • Mounts:容器挂载

      bash
      # typel:挂载类型volume|bind|tmpfs|npipe
      # [src|source]:挂载源
      # dst|destination|target:容器内部位置
      # 容器内拉取代码涉及到指纹和密钥问题,可以在宿主机上提前配置好然后挂载到容器内,最好是自定义构建的镜像比如利用jenkins/inbound-agent:latest作为基础镜像然后构建专属Node或者mvn构建的镜像
      
      type=bind,src=/data/jk,dst=/data
      type=bind,src=/home/jenkins/.ssh/,dst=/home/jenkins/.ssh,ro
      
      
      # 如果需要在容器在构建镜像需要挂载docker.sock
      type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock
      type=bind,src=/usr/bin/docker,dst=/usr/bin/docker

      挂载docker.sock涉及到权限问题,需要设置Extra Groups

    • Volumes From:从其它容器挂载

    • Shared Memory Size in MB:内存可以根据服务器配置分配

  • Pull strategy:选择Never pull,自定义镜像会去Github拉取镜像

构建节点镜像

官方提供的镜像只是具有java环境支持主节点调用,如有NodeJS或者Maven构建的场景还需要基于官方的镜像自定义构建专属执行任务的镜像。

构建NodeJS镜像

bash
cat > jenkins-agent-node-dockerfile << 'EOF'
FROM jenkins/inbound-agent:jdk17
ARG NODE_VERSION=v22.18.0
USER root
ADD https://nodejs.org/dist/${NODE_VERSION}/node-${NODE_VERSION}-linux-x64.tar.gz /tmp/
RUN cd  /tmp && \
	tar xf node-${NODE_VERSION}-linux-x64.tar.gz && \
	mv node-${NODE_VERSION}-linux-x64 /usr/local/nodejs && \
	chown -R jenkins:jenkins /usr/local/nodejs && \
	ln -s /usr/local/nodejs/bin/* /usr/local/bin/ && \
	rm -rf node-${NODE_VERSION}-linux-x64.tar.gz && \
	rm -rf /usr/local/nodejs/include share LICENSE README.md CHANGELOG.md && \
	npm config set registry https://registry.npmmirror.com/ --global
USER jenkins
WORDIR /app
EOF

docker build -t jenkins-agent-node:v1.0 -f jenkins-agent-node-dockerfile .

构建Mavem镜像

settings-nexus(可选)
bash
cat > settings.xml << 'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.2.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0 https://maven.apache.org/xsd/settings-1.2.0.xsd">
  <pluginGroups></pluginGroups>
  <proxies></proxies>
  <servers>
    <!-- nexus -->
    <server>
      <id>my-nexus-releases</id>
      <username>admin</username>
        <password>admin123</password>
    </server>
    <!-- nexus -->
    <server>
      <id>my-nexus-snapshots</id>
       <username>admin</username>
        <password>admin123</password>
    </server>
  </servers>
  <mirrors>
    <mirror>
      <id>maven-default-http-blocker</id>
      <mirrorOf>external:http:*</mirrorOf>
      <name>Pseudo repository to mirror external repositories initially using HTTP.</name>
      <url>http://0.0.0.0/</url>
      <blocked>true</blocked>
    </mirror>
    <!-- nexus -->
    <mirror>
      <id>nexus</id>
      <mirrorOf>*</mirrorOf>
      <url>http://192.168.148.114:8081/repository/maven-public/</url>
    </mirror>
  </mirrors>
  <profiles>
    <!-- nexus -->
    <profile>
      <id>nexus</id>
      <repositories>
        <repository>
          <id>nexus</id>
          <url>http://192.168.148.114:8081/repository/maven-public/</url>
          <releases><enabled>true</enabled></releases>
          <snapshots> <enabled>true</enabled></snapshots>
        </repository>
      </repositories>
      <pluginRepositories>
        <pluginRepository>
          <id>nexus</id>
          <url>http://192.168.148.114:8081/repository/maven-public/</url>
          <releases><enabled>true</enabled></releases>
          <snapshots><enabled>true</enabled></snapshots>
        </pluginRepository>
      </pluginRepositories>
    </profile>
  </profiles>
  <!-- nexus -->
  <activeProfiles>
    <activeProfile>nexus</activeProfile>
  </activeProfiles>
</settings>
EOF
settings-aliyu(可选)
bash
cat > settings.xml << 'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.2.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0 https://maven.apache.org/xsd/settings-1.2.0.xsd">
  <pluginGroups></pluginGroups>
  <proxies></proxies>
  <servers></servers>
  <mirrors>
    <mirror>
      <id>maven-default-http-blocker</id>
      <mirrorOf>external:http:*</mirrorOf>
      <name>Pseudo repository to mirror external repositories initially using HTTP.</name>
      <url>http://0.0.0.0/</url>
      <blocked>true</blocked>
    </mirror>
    <!-- alimaven -->
    <mirror>
        <id>alimaven</id>
        <mirrorOf>*</mirrorOf>
        <name>Aliyun Global Maven</name>
        <url>https://maven.aliyun.com/repository/public/</url>
    </mirror>
  </mirrors>
  <profiles>
  </profiles>
</settings>
EOF
Dockerfile
bash
cat > jenkins-agent-maven-dockerfile << 'EOF'
FROM jenkins/inbound-agent:jdk17
ARG MAVEN_VERSION=3.8.9
USER root
COPY settings.xml /tmp/
ADD https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/${MAVEN_VERSION}/binaries/apache-maven-${MAVEN_VERSION}-bin.tar.gz /tmp/
RUN cd /tmp && \
	tar xf apache-maven-${MAVEN_VERSION}-bin.tar.gz -C /usr/local && \
	mv -f settings.xml /usr/local/apache-maven-${MAVEN_VERSION}/conf/ && \
	chown -R jenkins:jenkins /usr/local/apache-maven-${MAVEN_VERSION} && \
	ln -s /usr/local/apache-maven-${MAVEN_VERSION}/bin/* /usr/local/bin/ && \
	rm -rf apache-maven-${MAVEN_VERSION}-bin.tar.gz && \
	mkdir -p /home/jenkins/.m2  && \
    chown -R jenkins:jenkins  /home/jenkins/.m2
USER jenkins
WORKDIR /app
EOF

docker build -t jenkins-agent-maven:v1.0 -f jenkins-agent-maven-dockerfile .

构建kubectl镜像

bash
cat > jenkins-agent-kubectl-dockerfile << 'EOF'
FROM jenkins/inbound-agent:jdk17
ARG KUBECTL_VERSION=v1.22.3
USER root
ADD https://storage.googleapis.com/kubernetes-release/release/${KUBECTL_VERSION}/bin/linux/amd64/kubectl /usr/local/bin/
RUN chmod +x /usr/local/bin/kubectl
USER jenkins
WORDIR /data
EOF

docker build -t jenkins-agent-kubectl:v1.0 -f jenkins-agent-kubectl-dockerfile .