Jenkins-插件配置
Publish Over SSH
安装插件:Manager Jenkins — > Plugins —> Available Plugins —> Publish over SSH
免密登录
配置密钥
ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.148.240Manager 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
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- npm 官方原始镜像网址是:https://registry.npmjs.org/
- 淘宝 NPM 镜像:https://registry.npmmirror.com/
- 阿里云 NPM 镜像:https://npm.aliyun.com
- 腾讯云 NPM 镜像:https://mirrors.cloud.tencent.com/npm/
- 华为云 NPM 镜像:https://mirrors.huaweicloud.com/repository/npm/
- 网易 NPM 镜像:https://mirrors.163.com/npm/
- 中国科学技术大学开源镜像站:http://mirrors.ustc.edu.cn/
- 清华大学开源镜像站:https://mirrors.tuna.tsinghua.edu.cn/
安装插件
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
- Name:自定义如:taobao
- NPM Registry:
新增一个 NPM Registry,填入阿里巴巴镜像源:http://registry.npmmirror.com。
在构建项目页面需要勾选构建环境中的Provide Node & npm bin/ folder to PATH
Job 配置 (Job Configuration)
Jenkins 的 NodeJS 插件在设计时是智能的。当您指定了根目录(例如 /usr/local/nodejs/)后,插件会自动地去该目录下的 bin子目录中寻找 node和 npm等可执行文件。
当您勾选了 “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的最大上限
# 可以在注入环境变量中定义
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上
# 创建密钥
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -N '' -C "jenkins@example.com"
# 查看公钥
cat ~/.ssh/id_rsa.pub- 登录 GitLab:进入您的 GitLab 账户。
- 导航到 SSH 密钥设置:点击右上角的头像,选择 Preferences > SSH Keys。
- 添加公钥:在 Key 字段中粘贴您的公钥,然后点击 Add key。
在 Jenkins 中配置 SSH 密钥
登录 Jenkins:打开 Jenkins 的网页界面并登录。
进入凭据管理:在左侧菜单中选择 Manage Jenkins > Manage Credentials。
添加 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
# 下载
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,可以选择Docker、Docker Composes、Docker Pipeline
安装Docker服务
# 注册华为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: -f3DNS:设置容器的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镜像
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(可选)
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>
EOFsettings-aliyu(可选)
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>
EOFDockerfile
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镜像
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 .