1.安装Jenkins

Installing Jenkins

1.1 Docker

docker network create jenkins
docker run \
  --name jenkins-docker \
  --publish 2376:2376 \
  --publish 8080:8080 \
  --detach \
  --privileged \
  --env DOCKER_TLS_CERTDIR=/certs \
  --volume /mnt/data/docker-volumes/jenkins-docker-certs:/certs/client \
  --volume /mnt/data/docker-volumes/jenkins-data:/var/jenkins_home \
  --volume /var/run/docker.sock:/var/run/docker.sock \
  --volume $(which docker):/usr/bin/docker \
  --group-add $(stat -c '%g' /var/run/docker.sock) \
  jenkins/jenkins

1.2 1Panel

services:
  jenkins:
    container_name: ${CONTAINER_NAME}
    image: jenkins/jenkins:2.528.2-lts
    restart: always
    privileged: true
    user: root
    ports:
      - ${PANEL_APP_PORT_HTTP}:8080
    volumes:
      - ./data:/var/jenkins_home
      - /var/run/docker.sock:/var/run/docker.sock
      - ${DOCKER_BINARY}:${DOCKER_BINARY}
    networks:
      - 1panel-network
    labels:
      createdBy: "Apps"
networks:
  1panel-network:
    external: true

1.3 Kubernetes

1.3.1 Helm

helm repo add jenkinsci https://charts.jenkins.io  
helm repo update jenkinsci  
helm upgrade --install -n jenkins --create-namespace jenkins  jenkinsci/jenkins -f values.yaml

1.3.2 Install Jenkins with Jenkins Operator

fail 失败了

1.3.3 jenkins | TrueForge

base 基础安装,没有自动配置k8s Agent

2.Jenkins基础

2.1 pipeline

2.1.1 getting-started

pipeline {
    agent any

    stages {
        stage('Hello') {
            steps {
                echo 'Hello World'
            }
        }
    }
}

2.1.2 docker

pipeline {  
    agent none  
    stages {  
        // https://www.jenkins.io/doc/pipeline/tour/hello-world/#java
        stage('Java') {  
            agent {docker { image 'maven:3.9.11-eclipse-temurin-21-alpine' }}  
            steps {  
                sh 'mvn --version'  
            }  
        }  
          
        // https://www.jenkins.io/doc/pipeline/tour/hello-world/#node-js-javascript        
        stage('Node.js / JavaScript') {  
            agent { docker { image 'node:24.11.1-alpine3.22' } }  
            steps {  
                sh 'node --version'  
            }  
        }  
          
        // https://www.jenkins.io/doc/pipeline/tour/hello-world/#ruby        
        stage('Ruby') {  
            agent { docker { image 'ruby:3.4.7-alpine3.22' } }  
            steps {  
                sh 'ruby --version'  
            }  
        }  
          
        // https://www.jenkins.io/doc/pipeline/tour/hello-world/#python        
        stage('Python') {  
            agent { docker { image 'python:3.14.0-alpine3.22' } }  
            steps {  
                sh 'python --version'  
            }  
        }  
          
        // https://www.jenkins.io/doc/pipeline/tour/hello-world/#php        
        stage('PHP') {  
            agent { docker { image 'php:8.4.8-alpine3.22' } }  
            steps {  
                sh 'php --version'  
            }  
        }  
          
        // https://www.jenkins.io/doc/pipeline/tour/hello-world/#go       
        stage('Go') {  
            agent { docker { image 'golang:1.25.4-alpine3.22' } }  
            steps {  
                sh 'go version'  
            }  
        }  
    }  
}

2.1.3 agent

  • any
  • none
  • label
  • node
  • docker [[docker-workflow-plugin]]
  • dockerfile
  • kubernetes [[kubernetes-plugin]]

2.2 parameters

/job/test-parameter/buildWithParameters?token=test&BIOGRAPHY=111

pipeline {
    agent any
    parameters {
        string(name: 'PERSON', defaultValue: 'Mr Jenkins', description: 'Who should I say hello to?')

        text(name: 'BIOGRAPHY', defaultValue: '', description: 'Enter some information about the person')

        booleanParam(name: 'TOGGLE', defaultValue: true, description: 'Toggle this value')

        choice(name: 'CHOICE', choices: ['One', 'Two', 'Three'], description: 'Pick something')

        password(name: 'PASSWORD', defaultValue: 'SECRET', description: 'Enter a password')
    }
    stages {
        stage('Example') {
            steps {
                echo "Hello ${params.PERSON}"

                echo "Biography: ${params.BIOGRAPHY}"

                echo "Toggle: ${params.TOGGLE}"

                echo "Choice: ${params.CHOICE}"

                echo "Password: ${params.PASSWORD}"
            }
        }
    }
}

2.3 env

env

pipeline {
    agent any
    environment {
        CC = 'clang'
    }
    stages {
        stage('Example') {
            environment {
                gitee = credentials('gitee-creds')
            }
            steps {
                sh 'printenv'
            }
        }

        stage('Example SSH Username with private key') {
            environment {
                SSH_CREDS = credentials('ssh-creds')
            }
            steps {
	            sh 'printenv'
                sh 'echo "SSH private key is located at $SSH_CREDS"'
                sh 'echo "SSH user is $SSH_CREDS_USR"'
                sh 'echo "SSH passphrase is $SSH_CREDS_PSW"'
            }
        }
        
        stage('Example Username/Password') {
            environment {
                SERVICE_CREDS = credentials('dockerhub-creds')
            }
            steps {
	            sh 'printenv'
                sh 'echo "Service user is $SERVICE_CREDS_USR"'
                sh 'echo "Service password is $SERVICE_CREDS_PSW"'
                sh 'curl -u $SERVICE_CREDS https://hub.docker.com/'
            }
        }
    }
}

3.各种demo

3.1 aria2 demo

  • 命令版本
  • Helm部署
  • 配置域名
  • 配置验证
pipeline {
    agent {
        node {
            label 'k8s-node1'
        }
    }
    stages {
        stage('命令版本') {
            steps {
                sh 'printenv'
                
                sh '''
                    helm version
                '''

                sh '''
                    kubectl version
                '''
            }
        }
        stage('Helm部署') {
            parallel {
                stage('ariang') {
                    steps {
                        sh 'printenv'

                        // https://trueforge.org/truetech/truecharts/charts/stable/aria2/
                        sh '''
                            helm upgrade --install -n aria2 --create-namespace aria2 oci://tccr.io/truecharts/aria2 -f aria2-values.yaml
                        '''
                    }
                }
                stage('aria2') {
                    steps {
                        sh 'printenv'

                        // https://trueforge.org/truetech/truecharts/charts/stable/ariang/
                        sh '''
                            helm upgrade --install -n aria2 --create-namespace ariang oci://tccr.io/truecharts/ariang -f ariang-values.yaml
                        '''
                    }
                }
            }
        }
        stage('配置域名') {
            steps {
                sh 'printenv'
                
                sh '''
                    kubectl apply -f traefik.yaml
                '''
            }
        }
        stage('配置验证') {
            steps {
                sh 'printenv'
                
                sh '''
                    kubectl get ingressroute.traefik.io --all-namespaces
                '''
            }
        }
    }
}

3.2 emqx demo

  • 命令版本
  • 更新仓库(新增)
  • Helm部署
  • 配置域名
  • 配置验证
pipeline {
    agent {
        node {
            label 'k8s-node1'
        }
    }
    stages {
        stage('更新仓库') {
            steps {
                sh 'printenv'

                // https://artifacthub.io/packages/helm/emqx-operator/emqx
                sh '''
                    helm repo add emqx-operator https://repos.emqx.io/charts
                    helm repo update emqx-operator
                '''
            }
        }
        stage('Helm部署') {
            steps {
                sh 'printenv'

                sh '''
                    helm upgrade --install -n iot --create-namespace emqx emqx-operator/emqx -f values.yaml
                '''
            }
        }
        stage('配置域名') {
            steps {
                sh 'printenv'

                sh '''
                    kubectl apply -f traefik.yaml
                '''
            }
        }
        stage('配置验证') {
            steps {
                sh 'printenv'
                
                sh '''
                    kubectl get ingressroute.traefik.io --all-namespaces
                '''
            }
        }
    }
}

3.3 hive demo

  • Docker构建与推送
    • 构建Docker镜像
    • 登录镜像仓库
  • 推送镜像到仓库
  • K8s部署
    • 部署hive到K8s
    • 配置域名
pipeline {
    agent none
    environment {
        DOCKERHUB_USERNAME = "duhongming"
        DOCKERHUB_REPO = "hive"
        IMAGE_TAG = "4.2.0"

        ALI_REGISTRY = "registry.cn-hangzhou.aliyuncs.com"
        ALI_NAMESPACE = "dockerdance"
        ALI_REPO = "hive"
        ALI_IMAGE = "${ALI_REGISTRY}/${ALI_NAMESPACE}/${ALI_REPO}:${IMAGE_TAG}"

        K8S_NAMESPACE = "hive"
    }
    stages {
        stage('Docker构建与推送') {
            agent { node { label 'ren9000k' } }
            stages {
                stage('构建Docker镜像') {
                    steps {
                        sh 'printenv'

                        sh '''
                            docker build -t ${DOCKERHUB_USERNAME}/${DOCKERHUB_REPO}:${IMAGE_TAG} \
                                        -t ${DOCKERHUB_USERNAME}/${DOCKERHUB_REPO}:latest \
                                        -t ${ALI_IMAGE} \
                                        -t ${ALI_REGISTRY}/${ALI_NAMESPACE}/${ALI_REPO}:latest .
                        '''
                    }
                }
                stage('登录镜像仓库') {
                    steps {
                        withCredentials([usernamePassword(
                            credentialsId: 'docker-hub-creds',
                            usernameVariable: 'DOCKER_USER',
                            passwordVariable: 'DOCKER_PWD'
                        )]) {
                            sh 'printenv'

                            sh '''
                                docker login -u ${DOCKER_USER} -p ${DOCKER_PWD}
                            '''
                        }

                        withCredentials([usernamePassword(
                            credentialsId: 'ali-docker-hub-creds',
                            usernameVariable: 'ALI_USER',
                            passwordVariable: 'ALI_PWD'
                        )]) {
                            sh 'printenv'

                            sh '''
                                docker login ${ALI_REGISTRY} -u ${ALI_USER} -p ${ALI_PWD}
                            '''
                        }
                    }
                }
                stage('推送镜像到仓库') {
                    steps {
                        sh 'printenv'

                        sh '''
                            docker push ${DOCKERHUB_USERNAME}/${DOCKERHUB_REPO}:${IMAGE_TAG}
                            docker push ${DOCKERHUB_USERNAME}/${DOCKERHUB_REPO}:latest
                        '''
                        sh '''
                            docker push ${ALI_IMAGE}
                            docker push ${ALI_REGISTRY}/${ALI_NAMESPACE}/${ALI_REPO}:latest
                        '''
                    }
                }
            }
        }
        stage('K8s部署') {
            agent { node { label 'k8s-node1' } }
            stages {
                stage('部署hive到K8s') {
                    steps {
                        sh 'printenv'

                        sh '''
                            kubectl create namespace ${K8S_NAMESPACE} --dry-run=client -o yaml | kubectl apply -f -
                            kubectl apply -n ${K8S_NAMESPACE} -f hive.yaml
                            kubectl get pods -n ${K8S_NAMESPACE}
                        '''
                    }
                }
                stage('配置域名') {
                    steps {
                        sh 'printenv'
                        
                        sh '''
                            kubectl apply -f traefik.yaml
                            kubectl get ingressroute.traefik.io --all-namespaces
                        '''
                    }
                }
            }
        }
    }
}

3.4 buildah demo

  • 拉取私有Git代码
  • Buildah构建+推送镜像
pipeline {
    agent {
        kubernetes {
            yaml """
                apiVersion: v1
                kind: Pod
                spec:
                  containers:
                  - name: git
                    image: alpine/git:latest
                    command: ['cat']
                    tty: true
                    volumeMounts:
                    - name: workspace-volume
                      mountPath: /workspace
                  - name: buildah
                    image: quay.io/buildah/stable:v1.42.1
                    command: ['sleep', '99d']
                    tty: true
                    env:
                    - name: BUILDAH_FORMAT
                      value: "docker"
                    securityContext:
                      runAsUser: 0  # 以 root 用户运行(解决挂载权限问题)
                      privileged: true  # 开启特权模式(允许操作 overlay 文件系统)
                    volumeMounts:
                    - name: workspace-volume
                      mountPath: /workspace
                  volumes:
                  - name: workspace-volume
                    emptyDir: {}
            """
        }
    }

    environment {
        GIT_REPO = "https://gitee.com/duhongming/hive.git"
        GIT_BRANCH = "master"
        DOCKERHUB_USERNAME = "duhongming"
        DOCKERHUB_REPO = "hive"
        IMAGE_TAG = "${env.BUILD_NUMBER}"
        FULL_IMAGE_TAG = "${DOCKERHUB_USERNAME}/${DOCKERHUB_REPO}:${IMAGE_TAG}"
        LATEST_IMAGE_TAG = "${DOCKERHUB_USERNAME}/${DOCKERHUB_REPO}:latest"
        DOCKERHUB_DOMAIN = "index.docker.io"
    }

    stages {
        stage('拉取私有Git代码') {
            steps {
                container('buildah') {
                    echo "开始拉取私有仓库代码: ${GIT_REPO} (分支: ${GIT_BRANCH})"
                    git(
                        url: "${GIT_REPO}",
                        branch: "${GIT_BRANCH}",
                        credentialsId: 'gitee-creds'
                    )
                    echo "代码拉取完成,工作目录内容:"
                    sh "ls -l /home/jenkins/agent/workspace/hive"
                }
            }
        }

        stage('Buildah构建+推送镜像') {
            steps {
                container('buildah') {
                    echo "开始构建并推送镜像: ${FULL_IMAGE_TAG} 和 ${LATEST_IMAGE_TAG}"
                    
                    withCredentials([
                        usernamePassword(
                            credentialsId: 'docker-hub-creds',
                            usernameVariable: 'DOCKER_USER',
                            passwordVariable: 'DOCKER_PWD'
                        )
                    ]) {
                        sh '''
                            echo "构建完成,本地镜像列表:"
                            buildah images
                            echo "Buildah容器内工作目录内容:"
                            ls -l /home/jenkins/agent/workspace/hive

                            echo "开始构建镜像,Dockerfile路径:/workspace/Dockerfile"
                            buildah bud \
                              --file /home/jenkins/agent/workspace/hive/Dockerfile \
                              -t ${FULL_IMAGE_TAG} \
                              -t ${LATEST_IMAGE_TAG} \
                              /home/jenkins/agent/workspace/hive
                            
                            echo "构建完成,本地镜像列表:"
                            buildah images
                            
                            echo "登录DockerHub仓库:${DOCKERHUB_DOMAIN}"
                            buildah login \
                              --username ${DOCKER_USER} \
                              --password ${DOCKER_PWD} \
                              ${DOCKERHUB_DOMAIN}
                              
                            echo "推送镜像:${FULL_IMAGE_TAG}"
                            buildah push ${FULL_IMAGE_TAG}
                            echo "推送镜像:${LATEST_IMAGE_TAG}"
                            buildah push ${LATEST_IMAGE_TAG}
                            
                            echo "登出DockerHub仓库"
                            buildah logout ${DOCKERHUB_DOMAIN}
                        '''
                    }
                }
            }
        }
    }

    post {
        always {
            echo "清理临时资源..."
        }
        success {
            echo "🎉 镜像推送成功!"
            echo "版本标签镜像: https://hub.docker.com/r/${FULL_IMAGE_TAG}"
            echo "最新标签镜像: https://hub.docker.com/r/${LATEST_IMAGE_TAG}"
        }
        failure {
            echo "❌ 构建失败,请检查日志!"
        }
    }
}

3.5 maven demo

Build a Java app with Maven

  • 拉取代码
  • 编译打包
  • 构建Docker镜像
  • 推送镜像到仓库
pipeline {
    agent { node { label 'ren9000k' } }
    tools {
        maven 'Maven 3.9.11'
    }
    environment {
        GIT_URL = 'http://gitea.duhongming.top/gitops/dify-on-lark.git'
        GIT_BRANCH = 'main'
        VERSION = sh(script: 'mvn help:evaluate -Dexpression=project.version -q -DforceStdout', returnStdout: true).trim()

        DOCKERHUB_USERNAME = "duhongming"
        DOCKERHUB_REPO = "dify-on-lark"
        IMAGE_TAG = sh(script: 'mvn help:evaluate -Dexpression=project.version -q -DforceStdout', returnStdout: true).trim()

        ALI_REGISTRY = "registry.cn-hangzhou.aliyuncs.com"
        ALI_NAMESPACE = "dockerdance"
        ALI_REPO = "dify-on-lark"
    }

    stages {
        stage('拉取代码') {
            steps {
                script {
                    sh 'printenv'
                    checkout scmGit(
                        branches: [[name: "refs/heads/main"]],
                        userRemoteConfigs: [[
                            url: "${GIT_URL}",
                            credentialsId: 'gitea-creds'
                        ]]
                    )
                    sh "git log -1 --pretty=format:'%h - %an, %ad: %s'"
                }
            }
        }
        stage('编译打包') {
            steps {
                script {
                    sh 'printenv'
                    sh """
                        mvn clean package -DskipTests
                    """
                }
            }
        }
        stage('登录镜像仓库') {
            steps {
                withCredentials([usernamePassword(
                    credentialsId: 'docker-hub-creds',
                    usernameVariable: 'DOCKER_USER',
                    passwordVariable: 'DOCKER_PWD'
                )]) {
                    sh 'printenv'
                    sh '''
                        docker login -u ${DOCKER_USER} -p ${DOCKER_PWD}
                    '''
                }

                withCredentials([usernamePassword(
                    credentialsId: 'ali-docker-hub-creds',
                    usernameVariable: 'ALI_USER',
                    passwordVariable: 'ALI_PWD'
                )]) {
                    sh 'printenv'
                    sh '''
                        docker login ${ALI_REGISTRY} -u ${ALI_USER} -p ${ALI_PWD}
                    '''
                }
            }
        }

        stage('构建Docker镜像') {
            steps {
                sh 'printenv'
                sh '''
                    docker build --build-arg LATEST_TAG=${IMAGE_TAG}  -t ${DOCKERHUB_USERNAME}/${DOCKERHUB_REPO}:${IMAGE_TAG} \
                                -t ${DOCKERHUB_USERNAME}/${DOCKERHUB_REPO}:latest \
                                -t ${ALI_REGISTRY}/${ALI_NAMESPACE}/${ALI_REPO}:${IMAGE_TAG} \
                                -t ${ALI_REGISTRY}/${ALI_NAMESPACE}/${ALI_REPO}:latest .
                '''
            }
        }
         stage('推送镜像到仓库') {
            steps {
                sh 'printenv'
                sh '''
                    docker push ${DOCKERHUB_USERNAME}/${DOCKERHUB_REPO}:${IMAGE_TAG}
                    docker push ${DOCKERHUB_USERNAME}/${DOCKERHUB_REPO}:latest
                '''
                sh '''
                    docker push ${ALI_REGISTRY}/${ALI_NAMESPACE}/${ALI_REPO}:${IMAGE_TAG}
                    docker push ${ALI_REGISTRY}/${ALI_NAMESPACE}/${ALI_REPO}:latest
                '''
            }
        }
    }
}

4. Jenkins插件

4.1 飞书通知

https://github.com/721806280/lark-notice-plugin
在这里插入图片描述

4.2 UI

https://plugins.jenkins.io/blueocean/

4.3 Git

Gitea | Jenkins plugin
Gitee | Jenkins plugin
GitHub | Jenkins plugin

4.4 Backup

ThinBackup | Jenkins plugin

4.5 Test

Using JMeter with Jenkins

4.6 其他

Using local language
Change time zone

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐