一、服务器资源
二、安装jenkins
建议在docker环境部署,使用Docker in Docke模式,便于打包、推送镜像等
2.1 拉取jenkins镜像
docker pull dockerproxy.net/jenkinsci/blueocean:latest
#打简化标签
docker tag dockerproxy.net/jenkinsci/blueocean jenkinsci/blueocean
jenkinsci/blueocean是一个官方 Docker 镜像,它提供了一个预装了 Blue Ocean 插件的、开箱即用的 Jenkins 服务器实例,这个镜像通常还会预装一些其他常用的插件(如 Git、Pipeline 等基础插件),减少你后续手动安装的工作量,旨在简化 Jenkins 的部署过程,并让用户能立即享受到 Blue Ocean 带来的现代化 CI/CD 体验。
2.2 运行jenkins
docker run \
-u root \
--rm \
-d \
-p 8080:8080 \
-p 50000:50000 \
-v jenkins-data:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
-- name jenkins \
jenkinsci/blueocean
2.3 访问jenkins图形界面
获取管理员的登录密码
docker exec -it jenkins cat /var/jenkins_home/secrets/initialAdminPassword
2.4 可选安装推荐插件
通常是git、pipeline、ssh、Credentials插件
2.5 部署jenkins完成
三、Jenkins使用方法
3.1 安装自定义插件
【Plugins】选项安装自定义插件,常用的有Git、SSH、Pipeline、docker、kubenetes、Credentials,在下方指引搜索安装即可
3.2 凭证插件使用
此插件需要提前安装,可以参考本文3.1章节。该插件目的是运行jenkinsfile过程中,会调用和登录gitlab、harbor仓库、k8s集群,通过凭证可以实现安全登录,其中包括一些账号、密码、安全证书等。
添加新凭证如下
3.2.1 类型
1. Username with password(用户名与密码)
- 作用:存储用户名和密码的组合。
- 适用场景:
- 访问需要基本认证(Basic Auth)的服务(如 HTTP API、Git 仓库、数据库等)。
- 示例:登录 SonarQube、Nexus 仓库、Docker Registry(使用 HTTP 模式时)。
- 字段:
Username
:用户名(非敏感信息)。Password
:密码(加密存储)。ID
:唯一标识符(用于在 Pipeline 中引用)。
2. SSH Username with private key(SSH 用户名与私钥)
- 作用:存储 SSH 私钥及对应的用户名。
- 适用场景:
- 通过 SSH 协议访问远程服务器(如执行命令、传输文件)。
- 克隆/推送 Git 仓库(使用 SSH URL,如
git@github.com:user/repo.git
)。- 字段:
Username
:SSH 登录用户名(如git
、root
或自定义用户)。Private Key
:私钥内容(支持直接输入或从文件上传)。Passphrase
(可选):私钥的加密密码(如果私钥有密码保护)。ID
:唯一标识符。
3. Secret text(密文)
- 作用:存储单行敏感文本(如 API Token、密码、密钥等)。
- 适用场景:
- 存储第三方服务的 API Token(如 GitHub Token、Slack Webhook URL、AWS 访问密钥)。
- 存储简单密码(不依赖用户名的场景)。
- 字段:
Secret
:敏感文本(加密存储)。ID
:唯一标识符。
4. Secret file(密文文件)
- 作用:存储整个敏感文件(如配置文件、证书文件等)。
- 适用场景:
- 存储需要完整文件的敏感数据(如
kubeconfig
、SSL 证书.pem
文件、JSON 配置文件)。- 避免在 Pipeline 中硬编码文件内容。
- 字段:
File
:上传敏感文件(Jenkins 会加密存储)。ID
:唯一标识符。
5. Certificate(证书)
- 作用:存储 PKCS#12 格式的客户端证书(包含私钥和公钥证书)。
- 适用场景:
- 双向认证(mTLS)场景,如访问需要客户端证书的 HTTPS API。
- 示例:与某些企业内部系统或云服务通信时需提供证书。
- 字段:
Keystore
:上传.p12
或.pfx
文件。Password
:证书的密码(如果有)。ID
:唯一标识符。
6. Docker Host Certificate(Docker 主机证书)
- 作用:存储用于连接 Docker 守护进程的 TLS 证书。
- 适用场景:
- 通过 TLS 加密的 TCP 端口访问远程 Docker 引擎(非本地 Socket)。
- 避免直接暴露 Docker TCP 端口(默认未加密)。
- 字段:
Client Key
:客户端私钥(key.pem
)。Client Certificate
:客户端证书(cert.pem
)。Server CA Certificate
:服务端 CA 证书(ca.pem
)。ID
:唯一标识符。
7. GPG Key(GPG 密钥)
- 作用:存储 GPG(GNU Privacy Guard)私钥。
- 适用场景:
- 对构建产物(如 Maven/Gradle 发布)进行数字签名。
- 验证软件包的真实性。
- 字段:
Private Key
:GPG 私钥(ASCII-armored 格式)。Passphrase
(可选):私钥密码。ID
:唯一标识符。
8. Azure Service Principal(Azure 服务主体)
- 作用:存储 Azure 服务主体的凭据(Client ID + Client Secret)。
- 适用场景:
- Jenkins 集成 Azure 服务(如部署到 AKS、Azure VM、操作 Azure Storage)。
- 字段:
Client ID
:Azure 应用注册的客户端 ID。Client Secret
:客户端密钥(加密存储)。Subscription ID
:Azure 订阅 ID。Tenant ID
:Azure 租户 ID。ID
:唯一标识符。
9. Google Service Account(谷歌服务账号)
- 作用:存储 Google Cloud 服务账号的 JSON 密钥文件。
- 适用场景:
- 访问 Google Cloud 服务(如 GKE、GCS、BigQuery)。
- 字段:
Service Account Key
:上传 JSON 密钥文件。ID
:唯一标识符。
关键概念说明
- 凭据域(Credentials Domain)
- 用于区分不同环境的凭据(如开发/测试/生产),避免误用。
- 示例:为不同 Git 仓库或云环境创建独立域。
- 凭据 ID(Credentials ID)
- 在 Pipeline 中通过 ID 引用凭据(如
credentials('my-ssh-key')
)。- 建议:使用可读性强的 ID(如
github-ssh-key
,docker-registry-token
)。- 安全存储
- Jenkins 使用加密存储所有敏感信息(通过
credentials.xml
和加密密钥保护)。- 避免在 Pipeline 或配置中硬编码敏感数据!
3.2.2 示例Username with password
创建一个用于连接gitlab的账号密码凭证,其中【用户名】填写gitlab的账号,【密码】则是create_user的密码,需要注意的是,【ID】如果不填写则会生成一串英文+数字组合的id,也不影响使用,在jenkinsfile声明调用,填写id串即可,区别可看下图
3.2.3 示例Secret file
例如上传k8s集群的kubeconfig文件,制作成secret file可供kubectl容器调用
上传k8s集群master的config文件,路径/root/.kube/config,下载到本地并上传
最后填上ID和描述,其实也非必要,ID不填写,会生成一串随机数字+字母ID
生成样式如下
3.3 配置cloud云平台
3.3.1 配置流程
系统管理>>Clouds
新建【New cloud】
新建cloud name,例如devops-kubernetes
参考值:
名称:devops-kubernetess(new cloud的名称,创建已默认)
Kubernetes地址:https://kubernetes.default.svc.cluster.local (通常固定,k8s集群的svc地址)
Kubernetes命名空间:devops(看具体jenkins部署在哪个命名空间)
Jenkins地址:http://jenkins-master.devops.svc.cluster.local:8080/(服务名.namespace.svc.cluster.local:8080)
Pod Label:jenkins/agent(假如在pipeline定义了label,也可不设置)
Pod Retention:Never
3.4 创建pod template
假如需要创建动态slave才需要用到,通常有三种方式,面板配置、面板粘贴pod模板yaml和pipeline script直接调用。而pipeline也有两种方式,一个在声明式里面创建yaml,另一个是脚本式调用pod template。以下一一介绍。
3.4.1 面板配置
添加容器层,如maven、docker、kubectl等
添加卷,如/var/run/docker.sock
3.4.2 面板粘贴
apiVersion: v1
kind: Pod
metadata:
labels:
jenkins/agent: "true" # 必要标签,用于识别 Jenkins Agent
spec:
containers:
- name: jnlp # Jenkins 主容器(必需)
image: jenkins/inbound-agent:3256.vb_454b_b_7d57a0 # 使用稳定版 jnlp 镜像
args: ["$(JENKINS_SECRET)", "$(JENKINS_NAME)"] # 动态参数注入
resources:
limits:
memory: "2Gi"
cpu: "1000m"
requests:
memory: "1Gi"
cpu: "500m"
env:
- name: JENKINS_URL # Jenkins Master 地址
value: "http://jenkins-service:8080"
volumeMounts:
- name: workspace-volume # 共享工作目录
mountPath: /home/jenkins/agent
# 可选:添加工具容器(示例:Docker 和 kubectl)
- name: docker
image: docker:20.10.24
command: ["cat"]
tty: true
volumeMounts:
- name: docker-sock
mountPath: /var/run/docker.sock
- name: kubectl
image: bitnami/kubectl:1.28.2
command: ["cat"]
tty: true
# 卷定义
volumes:
- name: workspace-volume
emptyDir: {}
- name: docker-sock
hostPath:
path: /var/run/docker.sock
type: Socket
# 安全上下文(可选)
securityContext:
runAsUser: 1000
fsGroup: 1000
# 节点选择器(可选)
nodeSelector:
node-role.kubernetes.io/agent: "true"
# 容忍度(可选)
tolerations:
- key: "dedicated"
operator: "Equal"
value: "jenkins-agent"
effect: "NoSchedule"
# 重启策略
restartPolicy: "Never"
3.4.3 声明式
pipeline {
agent none
stages {
stage('Build') {
steps {
script {
podTemplate(yaml: '''
apiVersion: v1
kind: Pod
metadata:
labels:
jenkins/agent: "true"
spec:
containers:
- name: jnlp
image: jenkins/inbound-agent:3256.vb_454b_b_7d57a0
args: ["$(JENKINS_SECRET)", "$(JENKINS_NAME)"]
resources:
limits:
memory: "2Gi"
cpu: "1000m"
requests:
memory: "1Gi"
cpu: "500m"
env:
- name: JENKINS_URL
value: "http://jenkins-service:8080"
volumeMounts:
- name: workspace-volume
mountPath: /home/jenkins/agent
- name: docker
image: docker:20.10.24
command: ["cat"]
tty: true
volumeMounts:
- name: docker-sock
mountPath: /var/run/docker.sock
- name: kubectl
image: bitnami/kubectl:1.28.2
command: ["cat"]
tty: true
volumes:
- name: workspace-volume
emptyDir: {}
- name: docker-sock
hostPath:
path: /var/run/docker.sock
type: Socket
securityContext:
runAsUser: 1000
fsGroup: 1000
restartPolicy: "Never"
''') {
node(POD_LABEL) {
stage('Run in jnlp') {
container('jnlp') {
sh 'echo "Running in jnlp container"'
}
}
stage('Run in docker') {
container('docker') {
sh 'docker version'
}
}
stage('Run in kubectl') {
container('kubectl') {
sh 'kubectl get pods'
}
}
}
}
}
}
}
}
}
评论区