目 录CONTENT

文章目录

Jenkins部署与使用方法

JamKing
2025-07-30 / 0 评论 / 0 点赞 / 32 阅读 / 0 字

一、服务器资源

二、安装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 体验。

image-rRFR.png

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图形界面

image-IWrg.png

获取管理员的登录密码

docker exec -it jenkins cat /var/jenkins_home/secrets/initialAdminPassword

image-sXZD.png

2.4 可选安装推荐插件

通常是git、pipeline、ssh、Credentials插件

image-gRZF.png

2.5 部署jenkins完成

image-ZDFk.png

三、Jenkins使用方法

3.1 安装自定义插件

image-IKbR.png

【Plugins】选项安装自定义插件,常用的有Git、SSH、Pipeline、docker、kubenetes、Credentials,在下方指引搜索安装即可

image-NJLo.png

image-ZCrI.png

3.2 凭证插件使用

此插件需要提前安装,可以参考本文3.1章节。该插件目的是运行jenkinsfile过程中,会调用和登录gitlab、harbor仓库、k8s集群,通过凭证可以实现安全登录,其中包括一些账号、密码、安全证书等。

image-YtXO.png

添加新凭证如下

image-qjTD.png

3.2.1 类型

image-KeJE.png

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 登录用户名(如 gitroot 或自定义用户)。
    • 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:唯一标识符。

关键概念说明

  1. 凭据域(Credentials Domain)
    • 用于区分不同环境的凭据(如开发/测试/生产),避免误用。
    • 示例:为不同 Git 仓库或云环境创建独立域。
  2. 凭据 ID(Credentials ID)
    • 在 Pipeline 中通过 ID 引用凭据(如 credentials('my-ssh-key'))。
    • 建议:使用可读性强的 ID(如 github-ssh-key, docker-registry-token)。
  3. 安全存储
    • Jenkins 使用加密存储所有敏感信息(通过 credentials.xml 和加密密钥保护)。
    • 避免在 Pipeline 或配置中硬编码敏感数据!

3.2.2 示例Username with password

创建一个用于连接gitlab的账号密码凭证,其中【用户名】填写gitlab的账号,【密码】则是create_user的密码,需要注意的是,【ID】如果不填写则会生成一串英文+数字组合的id,也不影响使用,在jenkinsfile声明调用,填写id串即可,区别可看下图

image-sQMb.png

image-CAJf.png

3.2.3 示例Secret file

例如上传k8s集群的kubeconfig文件,制作成secret file可供kubectl容器调用

image-tVAm.png

上传k8s集群master的config文件,路径/root/.kube/config,下载到本地并上传

image-WNrg.png

最后填上ID和描述,其实也非必要,ID不填写,会生成一串随机数字+字母ID

image-FjVB.png

生成样式如下

image-keMY.png

3.3 配置cloud云平台

3.3.1 配置流程

系统管理>>Clouds

image-YIQv.png

新建【New cloud】

image-GruC.png

新建cloud name,例如devops-kubernetes

image-xOsY.png

参考值:

名称: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

image-hlCo.png

image-XsJA.png

image-ziFt.png

3.4 创建pod template

假如需要创建动态slave才需要用到,通常有三种方式,面板配置、面板粘贴pod模板yaml和pipeline script直接调用。而pipeline也有两种方式,一个在声明式里面创建yaml,另一个是脚本式调用pod template。以下一一介绍。

3.4.1 面板配置

image-yBwa.png

image-ypxZ.png

添加容器层,如maven、docker、kubectl等

image-XpgW.png

添加卷,如/var/run/docker.sock

image-KsiA.png

image-gDsh.png

3.4.2 面板粘贴

image-yIWy.png

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'
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

3.4.4 脚本式

参考创建jenkins动态slave

0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区