持续集成/持续交付/持续部署,我选Jenkins,节省我大量重复劳动的时间,顺手的就是好工具
base 基础安装,没有自动配置k8s Agent。
·
文章标题
- 1.安装Jenkins
- 2.Jenkins基础
- 3.各种demo
- 4. Jenkins插件
1.安装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
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
- 拉取代码
- 编译打包
- 构建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
4.5 Test
4.6 其他
更多推荐

所有评论(0)