Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Jenkins file一行代码部署.NET程序到K8S

Jenkins file一行代码部署.NET程序到K8S

作者头像
Chester Chen
修改于 2022-08-18 07:16:50
修改于 2022-08-18 07:16:50
66600
代码可运行
举报
文章被收录于专栏:chester技术分享chester技术分享
运行总次数:0
代码可运行

什么是Jenkins共享库

随着微服务的增多,每个项目的都需要pipline文件,这样的话Pipeline代码冗余度高,并且pipeline的功能越来越复杂。

jenkins可以使用Shared Lib,将一些公共的pipeline抽象做成模块代码,在各种项目pipeline之间复用,以减少冗余。

共享库目录结构

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
共享库根目录
|-- vars
    |-- test1.groovy
|-- src
    |-- test2.groovy
|-- resources

vars: 依赖于Jenkins运行环境的Groovy脚本。其中的Groovy脚本被称之为全局变量。 src: 标准的Java源码目录结构,其中的Groovy脚本被称为类库(Library class)。 resources: 目录允许从外部库中使用 libraryResource 步骤来加载有关的非 Groovy 文件。

引用共享库的方式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env groovy

// 引用默认配置的共享库
@Library('demo-shared-library') _

// 引用指定分支、tag的共享库代码
@Library('demo-shared-library@1.0') _

// 引用多个指定分支tag的共享库
@Library('demo-shared-library@$Branch/Tag','demo-shared-library-test@$Branch/Tag') _

@Library('utils') import org.foo.Utilities

@Library('utils') import static org.foo.Utilities.*

vars下的全局变量

/vars下的全局变量必须以全小写或驼峰(camelCased) /vars/*.groovy若实现call()方法,直接引用时默认执行其中的方法

实现一行代码部署.NET程序到K8S

安装Jenkins Master

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# master
docker run --name jenkins-blueocean -u root --privileged -d -p 8080:8080 -p 50000:50000 -v D:/architecture/jenkins/data:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock jenkinsci/blueocean 

# 访问:http://ip:8080/
# jenkins密码,查看容器日志: 7285ced325a24483bfdaab227415fdac
# 安装推荐插件

安装Jenkins Agent

Manage Jenkins -> Manage Nodes and Clouds -> New Node

  • Name: agent2/agent3
  • Labels: agentnode
  • Launch method: Launch agent by connecting it to the master

Build Agent Docker Image

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# slave
# Dockerfile
FROM jenkins/inbound-agent:latest
USER root

RUN apt-get update
RUN apt-get -y install ca-certificates curl gnupg lsb-release
RUN curl -fsSL https://get.docker.com -o get-docker.sh
RUN sh get-docker.sh


RUN curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
RUN install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
RUN kubectl version --client

ENV JMETER_VERSION=5.4.1
ENV JMETER_HOME=/jmeter/apache-jmeter-${JMETER_VERSION}
ENV JMETER_PATH=${JMETER_HOME}/bin:${PATH}
ENV PATH=${JMETER_HOME}/bin:${PATH}

RUN mkdir /jmeter
COPY apache-jmeter-${JMETER_VERSION}.tgz /jmeter
RUN cd /jmeter && tar xvf apache-jmeter-${JMETER_VERSION}.tgz #其中tgz文件请去官网下载
RUN sed -i 's/#jmeter.save.saveservice.output_format=csv/jmeter.save.saveservice.output_format=xml/g'  /jmeter/apache-jmeter-5.4.1/bin/jmeter.properties
 

docker build -t chesterjenkinsagent .
docker tag chesterjenkinsagent:latest 192.168.43.95/jenkins/chesterjenkinsagent:v1
docker login --username=admin --password=123456  192.168.43.95
docker push 192.168.43.95/jenkins/chesterjenkinsagent:v1

运行Agent,其中的密钥通过jenkins的agent信息获取

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# agent4
docker run  -v /var/run/docker.sock:/var/run/docker.sock --name agent4  -d --init 192.168.43.95/jenkins/chesterjenkinsagent:v1 -url http://192.168.43.94:8080   1e84c896dbffc0c325587eedb6301ab0ae66d3f4b49c4628dbb05714e382d7a2 agent4

新增K8S凭据

  • 将k8s集群的配置文件导出 ~/.kube/config
  • Mange Jenkins -> Manage Credentials -> Add Credentials -> Secret File
  • 选择导出的kubeconfig,设置id为kubeconfig

新增Harbor凭据

  • Mange Jenkins -> Manage Credentials -> Add Credentials -> Username with password
  • 输入Harbor的用户名密码

新增Gitee凭据

  • Mange Jenkins -> Manage Credentials -> Add Credentials -> Username with password
  • 输入Gitee的用户名密码

安装插件

Manage Jenkins -> Manage Plugins -> Search "Performance" -> install

管理共享库

Manage Jenkins -> Configure System -> Global Pipeline Libraries,其中的git地址是共享库的地址

共享库中新增以下代码

vars/run.groovy

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env groovy

def call(String nameSpaceName, String serviceName, String servicePath, String servicePort, String nodePort, Map envInfo) {
    def devBranch = envInfo['dev']
    def prodBranch = envInfo['prod']

    pipeline {
        agent {
            label 'agentnode'
        }

        environment {
            DEV_MY_KUBECONFIG = credentials('kubeconfig')
            PROD_MY_KUBECONFIG = credentials('kubeconfig')
            HARBOR = credentials('harbor')
        }

        stages {
            stage('Dev - GitPull') {
                steps {
                    deleteDir()
                    gitCheckOut devBranch, env.GIT_URL
                }
                post {
                    success {
                        script {
                            echo 'pull done'
                        }
                    }
                }
            }
            stage('Dev - DockerBuild') {
                steps {
                    dockerImageBuild serviceName, "${servicePath}Dockerfile"
                }
            }
            stage('Dev - DockerTag') {
                steps {
                    dockerTag serviceName, 'dev'
                }
            }
            stage('Dev - DockerLogin') {
                steps {
                    dockerLogin 'dev'
                }
            }
            stage('Dev - DockerPush') {
                steps {
                    dockerPush serviceName, 'dev'
                }
            }
            stage('Dev - GenerateHarborSecretYAML') {
                steps {
                    harborSecret nameSpaceName, serviceName, 'dev'
                }
            }
            stage('Dev - GenerateK8SYAML') {
                steps {
                    k8sGenerateYaml nameSpaceName, serviceName, servicePath, 'dev', servicePort, nodePort
                }
            }
            stage('Dev - DeployToK8S') {
                steps {
                    k8sDeploy servicePath, 'dev'
                }
            }
            stage('Dev - CheckDeployStatus') {
                steps {
                    k8sCheckDeployStatus nameSpaceName, serviceName, 'dev'
                }
            }
            stage('Dev - Jmeter Test') {
                steps {
                    jmeterTest servicePath
                }
            }

            stage('DeployToProd?') {
                steps {
                    input '部署生产?'
                }
            }

            stage('Prod - GitPull') {
                steps {
                    gitCheckOut prodBranch, env.GIT_URL
                }
            }
            stage('Prod - DockerBuild') {
                steps {
                    dockerImageBuild serviceName, "${servicePath}Dockerfile"
                }
            }
            stage('Prod - DockerTag') {
                steps {
                    dockerTag serviceName, 'prod'
                }
            }
            stage('Prod - DockerLogin') {
                steps {
                    dockerLogin 'prod'
                }
            }
            stage('Prod - DockerPush') {
                steps {
                    dockerPush serviceName, 'prod'
                }
            }
            stage('Prod - GenerateHarborSecretYAML') {
                steps {
                    harborSecret nameSpaceName, serviceName, 'prod'
                }
            }
            stage('Prod - GenerateK8SYAML') {
                steps {
                    k8sGenerateYaml nameSpaceName, serviceName, servicePath, 'prod', servicePort, nodePort
                }
            }
            stage('Prod - DeployToK8S') {
                steps {
                    k8sDeploy servicePath, 'prod'
                }
            }
            stage('Prod - CheckDeployStatus') {
                steps {
                    k8sCheckDeployStatus nameSpaceName, serviceName, 'prod'
                }
            }
        }
    }
}

vars/dockerImageBuild.groovy

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env groovy

def call(String serviceName, String dockerfilePath) {
    echo "serviceName:${serviceName} dockerfilePath:${dockerfilePath}"
    sh "docker build -t ${serviceName} -f  ${dockerfilePath} ."
}

vars/dockerLogin.groovy

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env groovy

def call(String envName) {
    sh 'docker login --username=$HARBOR_USR --password=$HARBOR_PSW  192.168.43.95'
}

vars/dockerPush.groovy

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env groovy

def call(String serviceName,String envName) {
    sh "docker push 192.168.43.95/dapr/${serviceName}:${envName}-${BUILD_NUMBER}"
}

vars/dockerTag.groovy

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env groovy

def call(String serviceName, String envName) {
    sh "docker tag ${serviceName}:latest 192.168.43.95/dapr/${serviceName}:${envName}-${BUILD_NUMBER}"
}

vars/gitCheckOut.groovy

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env groovy

def call(String branchName, String gitUrl) {
    echo "branchName:${branchName} gitUrl:${gitUrl}"
    checkout([$class: 'GitSCM', branches: [[name: branchName]], extensions: [], userRemoteConfigs: [[credentialsId: 'gitee', url: gitUrl]]])
}

vars/harborSecret.groovy

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def call(String namespaceName, String serviceName, String envName) {
    dir('harborsecret') {
        checkout([$class: 'GitSCM', branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[credentialsId: 'gitee', url: 'https://gitee.com/chesterdotchen/jenkins-demo-secrets.git']]])
        sh """sed -i 's/{{ServiceName}}/${serviceName}/g'  secrets.yaml"""
        sh """sed -i 's/{{NameSpaceName}}/${namespaceName}/g'  secrets.yaml"""

        if (envName == 'dev') {
            sh("kubectl --kubeconfig  ${DEV_MY_KUBECONFIG} apply -f secrets.yaml")
        }
        if (envName == 'prod') {
            sh("kubectl --kubeconfig  ${PROD_MY_KUBECONFIG} apply -f secrets.yaml")
        }
    }
}

vars/jmeterTest.groovy

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env groovy

def call(String servicePath) {
    sh "jmeter -j jmeter.save.saveservice.output_format=xml -n -t ${servicePath}jmeter.jmx -l ${servicePath}jmeter.report.jtl"
    sh "cp ${servicePath}jmeter.report.jtl ${servicePath}jmeter.report.${BUILD_NUMBER}.jtl"
    perfReport errorFailedThreshold:5, sourceDataFiles:"${servicePath}jmeter.report.jtl"
    sh "cat ${servicePath}jmeter.report.${BUILD_NUMBER}.jtl"

    sh """#!/bin/sh
                            grep '<failure>true</failure>' ${servicePath}jmeter.report.${BUILD_NUMBER}.jtl
                            if [ \$? = 0 ]
                            then
                                exit 1
                            else
                                exit 0
                            fi
                            """
}

vars/k8sCheckDeployStatus.groovy

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env groovy

def call(String nameSpaceName, String serviceName, String envName) {
    if (envName == 'dev') {
        sh("""
                    ATTEMPTS=0
                    ROLLOUT_STATUS_CMD='kubectl --kubeconfig  ${DEV_MY_KUBECONFIG} rollout status deployment/${serviceName}  -n ${nameSpaceName}-ns'
                    until \$ROLLOUT_STATUS_CMD || [ \$ATTEMPTS -eq 60 ]; do
                        \$ROLLOUT_STATUS_CMD
                        ATTEMPTS=\$((attempts + 1))
                        sleep 10
                    done
                 """)
    }
    if (envName == 'prod') {
        sh("""
                    ATTEMPTS=0
                    ROLLOUT_STATUS_CMD='kubectl --kubeconfig  ${PROD_MY_KUBECONFIG} rollout status deployment/${serviceName}  -n ${nameSpaceName}-ns'
                    until \$ROLLOUT_STATUS_CMD || [ \$ATTEMPTS -eq 60 ]; do
                        \$ROLLOUT_STATUS_CMD
                        ATTEMPTS=\$((attempts + 1))
                        sleep 10
                    done
                 """)
    }
}

vars/k8sDeploy.groovy

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env groovy

def call(String servicePath, String envName) {
    if (envName == 'dev') {
        sh("kubectl --kubeconfig  ${DEV_MY_KUBECONFIG} apply -f ${servicePath}deployment.yaml")
    }
    if (envName == 'prod') {
        sh("kubectl --kubeconfig  ${PROD_MY_KUBECONFIG} apply -f ${servicePath}deployment.yaml")
    }
}

vars/k8sGenerateYaml.groovy

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env groovy

def call(String namespaceName, String serviceName, String servicePath, String envName, String servicePort, String nodePort) {
    sh """sed "s/{{tagversion}}/${envName}-${BUILD_NUMBER}/g"  ${servicePath}deployment.yaml.tpl > ${servicePath}deployment.yaml """
    sh """sed -i 's/{{ServiceName}}/${serviceName}/g'  ${servicePath}deployment.yaml"""
    sh """sed -i 's/{{ServicePort}}/${servicePort}/g'  ${servicePath}deployment.yaml"""
    sh """sed -i 's/{{NodePort}}/${nodePort}/g'  ${servicePath}deployment.yaml"""
    sh """sed -i 's/{{NameSpaceName}}/${namespaceName}/g'  ${servicePath}deployment.yaml"""
}

jenkins-demo-secrets中代码如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: v1
kind: Namespace
metadata:
  name: {{NameSpaceName}}-ns

---
apiVersion: v1
kind: Secret
metadata:
 name: harbor-key
 namespace: {{NameSpaceName}}-ns
type: kubernetes.io/dockerconfigjson
data:
 .dockerconfigjson: ewoJImF1dGhzIjogewoJCSIxOTIuMTY4LjQzLjk1IjogewoJCQkiYXV0aCI6ICJZV1J0YVc0Nk1USXpORFUyIgoJCX0sCgkJInJlZ2lzdHJ5LmNuLWJlaWppbmcuYWxpeXVuY3MuY29tIjogewoJCQkiYXV0aCI6ICI2Wm1JNUxpQTU0dXVPbU5vWlc1NWFYTm9hVEV5TXc9PSIKCQl9Cgl9Cn0=
 

dockerconfigjson可通过以下方式获取

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker login --username=admin --password=123456 192.168.43.95
cat ~/.docker/config.json | base64

Jenkinsfile中引用共享库

项目库中需要提前编写好Dockerfile,Jenkinsfile,deployment.yaml.tpl,jmeter.jmx

Dockerfile

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.

FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS base
WORKDIR /app
EXPOSE 5001

FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
WORKDIR /src
COPY ["FrontEnd/FrontEnd.csproj", "FrontEnd/"]
COPY ["Common/Common.csproj", "Common/"]
RUN dotnet restore "FrontEnd/FrontEnd.csproj"
COPY . .
WORKDIR "/src/FrontEnd"
RUN dotnet build "FrontEnd.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "FrontEnd.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "FrontEnd.dll"]

Jenkinsfile

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env groovy

@Library('share@master') _

run 'daprtest', 'frontend', './FrontEnd/', '5001', '31111', ['dev':'*/master', 'prod':'*/master']

deployment.yaml.tpl

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: v1
kind: Namespace
metadata:
  name: {{NameSpaceName}}-ns


---
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: statestore
  namespace: {{NameSpaceName}}-ns
spec:
  type: state.redis
  version: v1
  metadata:
  - name: redisHost
    value: 192.168.43.102:6379
  - name: redisPassword
    value: "123456"
  - name: actorStateStore
    value: "true"

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ServiceName}}
  namespace: {{NameSpaceName}}-ns
  labels:
    app: {{ServiceName}}
spec:
  replicas: 1
  selector:
    matchLabels:
      app: {{ServiceName}}
  template:
    metadata:
      namespace: {{NameSpaceName}}-ns
      labels:
        app: {{ServiceName}}
      annotations:
        dapr.io/enabled: "true"
        dapr.io/app-id: "{{ServiceName}}"
        dapr.io/app-port: "{{ServicePort}}"
    spec:
      imagePullSecrets:
      - name: harbor-key
      containers:
      - name: {{ServiceName}}
        image: 192.168.43.95/dapr/{{ServiceName}}:{{tagversion}}
        ports:
        - containerPort: {{ServicePort}}
        imagePullPolicy: Always

---
apiVersion: v1
kind: Service
metadata:
  namespace: {{NameSpaceName}}-ns
  name: {{ServiceName}}-svc
spec:
  type: NodePort
  selector:
    app: {{ServiceName}}
  ports:
    - port: {{ServicePort}}
      targetPort: {{ServicePort}}
      nodePort: {{NodePort}}
代码语言:javascript
代码运行次数:0
运行
复制

jmter.jmx则根据需要自行编写

新建pipline

其中的URL指向自己项目的git地址

构建pipline

至此,我们已经完成了Jenkinsfile中一行代码部署我们的项目,如果有新的service,在编写好Dockerfile,deployment.yaml.tpl(保持一致),jmeter.jmx的前提下,我们只需要Jenkinsfile中通过共享库引用run方法即可

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-11-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 chester技术分享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
基于K8s插件版的Jenkins动态节点实践【内含最佳实践】
手动在Jenkins Server上面创建一个Jenkins Agent节点,选择JNLP 类型。然后获取Jenkins Agent与Master连接所需要的JENKINS_AGENT_NAME 和JENKINS_AGENT_SECRET信息。
DevOps云学堂
2022/10/04
1.9K0
基于K8s插件版的Jenkins动态节点实践【内含最佳实践】
Gitlab+Jenkins+k8s+Helm 的自动化部署实践
本文从实践角度介绍如何结合我们常用的 Gitlab 与 Jenkins,通过 K8s 来实现项目的自动化部署,示例将包括基于 SpringBoot 的服务端项目与基于 Vue.js 的 Web 项目。
kubernetes中文社区
2021/11/12
3.8K0
基于Jenkins和Argocd实现CI/CD
CI/CD并不是陌生的东西,大部分企业都有自己的CI/CD,不过今天我要介绍的是使用Jenkins和GitOps实现CI/CD。
没有故事的陈师傅
2020/12/02
2.4K0
基于Jenkins和Argocd实现CI/CD
基于Jenkins+Argocd+Argo Rollouts的DevOps实现并用金丝雀发布
本文主要介绍使用Jenkins配合argocd以及argo rollouts实现CI/CD。其中jenkins配合argocd做CI/CD前面已经介绍过了,这里不再赘述,不懂的地方可以移步《使用Jenkins和Argocd实现CI/CD》。
没有故事的陈师傅
2021/01/04
4.8K1
基于Jenkins+Argocd+Argo Rollouts的DevOps实现并用金丝雀发布
kubernetes(十四) 基于kubernetes的jenkins持续集成
-参考:https://github.com/jenkinsci/kubernetes
alexhuiwang
2020/09/23
2.3K0
kubernetes(十四) 基于kubernetes的jenkins持续集成
jenkins使用pipeline结合maven,sonar,docker,k8s实现构建和回滚
企业微信机器人接口文档:机器人 执行该脚本只需传入两个参数即可,一个是sonar检测的项目的项目名,另一个是要发的邮件地址
dogfei
2020/07/31
1.1K0
DevOps整合Jenkins+k8s+CICD
基于现在的互联网现状,更推崇敏捷式开发,这样就导致项目的迭代速度更快,但是由于开发团队与运维团队的沟通问题,会导致新版本上线的时间成本很高。这又违背的敏捷式开发的最初的目的。 那么如果让开发团队和运维团队整合到成一个团队,协同应对一套软件呢?这就被称为DevOps。 DevOps,字面意思是Development &Operations的缩写,也就是开发&运维。 然字面意思只涉及到了开发团队和运维团队,其实QA测试团队也是参与其中的。 网上可以查看到DevOps的符号类似于一个无穷大的符号
IT运维技术圈
2022/10/24
3K1
k8s部署之kubesphere安装以及使用
Docker-Compose下载路径:https://github.com/docker/compose/releases/download/1.24.1/docker-compose-Linux-x86_64
小炜同学
2022/09/23
4.6K0
『Jenkins』深入理解Jenkins流水线:从基础到高级使用
在现代软件开发中,持续集成(CI)和持续交付(CD)是提高开发效率和软件质量的核心实践。Jenkins作为全球最受欢迎的开源自动化工具,广泛用于实现CI/CD工作流。而Jenkins流水线(Jenkins Pipeline)是实现持续集成和持续交付的核心功能之一。
数字扫地僧
2024/12/23
4050
Jenkins Pipeline脚本优化:为Kubernetes应用部署增加状态检测
在软件部署的世界中,Jenkins已经成为自动化流程的代名词。不断变化的技术环境要求我们持续改进部署流程以满足现代应用部署的需要。在本篇博客中,作为一位资深运维工程师,我将分享如何将Jenkins Pipeline进化至不仅能支持部署应用直至Running状态检测,同时也能兼顾Deployment和StatefulSet资源的轮询更新,并详细介绍滚动更新策略的配置方法。
对你无可奈何
2023/12/21
7060
Kubernetes配合Jenkins实现轻量自动持续集成
之前写的Spinnaker自动化部署,部署复杂,依赖环境多,所以才有这一篇比较轻量级的自动化持续集成,需要用到的环境有Kubernetes-1.23、harbor、Jenkins、Helm、gitlab都是devops常见组件。
王先森sec
2023/04/24
3K0
Kubernetes配合Jenkins实现轻量自动持续集成
锅总详解Jenkins应用
Jenkins架构是怎样的?Jenkins用了哪些调度设计?Jenkins调度最佳实践有哪些?如何写一个Go或Java项目的管道?Jenkins的声明式与脚本化流水线有哪些内容?Jenkins发展历史是怎样的?希望本文能给到您答案!
锅总
2024/08/14
6250
锅总详解Jenkins应用
在kubernetes中部署Jenkins并简单使用
之前我们都是在物理机或者虚拟机上部署jenkins,但是这种部署方式会有一些难点,如下:
极客运维圈
2020/06/16
2.1K0
在kubernetes中部署Jenkins并简单使用
从零开始趟jenkins+docker+k8s的容器化之路
基于kubernetes容器化技术架构能够带来诸多好处,诸如,弹性伸缩,自动修复等,在比如蓝绿部署,灰度发布等。近几年容器化技术飞速发展,了解服务网格 的人可能会发现,新兴技术 istio 等service mesh技术没有容器化的技术环境根本就没法实践。本篇博文不是详细介绍容器技术的,而是具体的实践。此篇博文分为两个阶段,分别是ci,cd。包含三部分内容,分别是jenkins,docker,k8s的脚本浅析。
kl博主
2023/11/18
2.1K0
从零开始趟jenkins+docker+k8s的容器化之路
基于Jenkins Pipeline构建企业级CI/CD
本设计通过Jenkins Generic Webhook Trigger 插件实现了基于Webhook自动触发流水线构建。
用户1107783
2024/05/21
2540
基于Jenkins Pipeline构建企业级CI/CD
结合k8s和pipeline的流水线,并通过k8s接口完成镜像升级
现在这家单位的CICD比较的混乱,然后突发奇想,想改造下,于是就用pipeline做了一个简单的流水线,下面是关于它的一些介绍
dogfei
2021/01/27
7790
使用 Jenkins + KubeVela 完成应用的持续交付
KubeVela 打通了应用与基础设施之间的交付管控的壁垒,相较于原生的 Kubernetes 对象,KubeVela 的 Application 更好地简化抽象了开发者需要关心的配置,将复杂的基础设施能力及编排细节留给了平台工程师。而 KubeVela 的 apiserver 则是进一步为开发者提供了使用 HTTP Request 直接操纵 Application 的途径,使得开发者即使没有 Kubernetes 的使用经验与集群访问权限也可以轻松部署自己的应用。
CNCF
2021/09/17
1.2K0
DevSecOps 管道: 使用Jenkins自动化CI/CD管道以实现安全的多语言应用程序
DevSecOps 流程 先决条件: 1) Git 2) Jenkins 3) Sonar-Scanner 4) Snyk 5) Java、Maven、Node.js、Python 等(您为项目选择的语言将取决于适用的安装要求。 6) Docker 7) Aqua Trivy 8) Kubernetes 9) Zaproxy
DevOps云学堂
2023/11/29
1.2K0
DevSecOps 管道: 使用Jenkins自动化CI/CD管道以实现安全的多语言应用程序
使用 YAML 文件配置 Jenkins 流水线
几年前,我们的 CTO 写了一篇关于使用 Jenkins 和 Docker 为 Ruby On Rails 应用提供持续集成服务的文章。这些年,我们一直使用这个 CI 流水线解决方案,直到我们最近决定做一次升级。为什么呢?
LinuxSuRen
2019/04/19
5.2K0
使用 YAML 文件配置 Jenkins 流水线
使用 Jenkins Pipeline 流水线部署 Kubernetes 应用
要实现在 Jenkins 中的构建工作,可以有多种方式,我们这里采用比较常用的 Pipeline 这种方式。Pipeline,简单来说,就是一套运行在 Jenkins 上的工作流框架,将原来独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排和可视化的工作。
我是阳明
2021/06/25
5.4K0
使用 Jenkins Pipeline 流水线部署 Kubernetes 应用
推荐阅读
相关推荐
基于K8s插件版的Jenkins动态节点实践【内含最佳实践】
更多 >
LV.0
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验