建设工程其它费计算网站,seo快速整站上排名教程,凉山州建设厅官方网站,注册深圳公司流程和费用Jenkins file一行代码部署.NET程序什么是Jenkins共享库随着微服务的增多#xff0c;每个项目的都需要pipline文件#xff0c;这样的话Pipeline代码冗余度高#xff0c;并且pipeline的功能越来越复杂。jenkins可以使用Shared Lib#xff0c;将一些公共的pipeline抽象做成模块… Jenkins file一行代码部署.NET程序什么是Jenkins共享库随着微服务的增多每个项目的都需要pipline文件这样的话Pipeline代码冗余度高并且pipeline的功能越来越复杂。jenkins可以使用Shared Lib将一些公共的pipeline抽象做成模块代码在各种项目pipeline之间复用以减少冗余。共享库目录结构共享库根目录
|-- vars|-- test1.groovy
|-- src|-- test2.groovy
|-- resourcesvars: 依赖于Jenkins运行环境的Groovy脚本。其中的Groovy脚本被称之为全局变量。src: 标准的Java源码目录结构,其中的Groovy脚本被称为类库(Library class)。resources: 目录允许从外部库中使用 libraryResource 步骤来加载有关的非 Groovy 文件。引用共享库的方式#!/usr/bin/env groovy// 引用默认配置的共享库
Library(demo-shared-library) _// 引用指定分支、tag的共享库代码
Library(demo-shared-library1.0) _// 引用多个指定分支tag的共享库
Library(demo-shared-library$Branch/Tag,demo-shared-library-test$Branch/Tag) _Library(utils) import org.foo.UtilitiesLibrary(utils) import static org.foo.Utilities.*vars下的全局变量/vars下的全局变量必须以全小写或驼峰camelCased/vars/*.groovy若实现call()方法直接引用时默认执行其中的方法实现一行代码部署.NET程序到K8S安装Jenkins Master# 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 AgentManage Jenkins - Manage Nodes and Clouds - New NodeName: agent2/agent3Labels: agentnodeLaunch method: Launch agent by connecting it to the masterBuild Agent Docker Image# slave
# Dockerfile
FROM jenkins/inbound-agent:latest
USER rootRUN 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.shRUN 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 --clientENV JMETER_VERSION5.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_formatcsv/jmeter.save.saveservice.output_formatxml/g /jmeter/apache-jmeter-5.4.1/bin/jmeter.propertiesdocker build -t chesterjenkinsagent .
docker tag chesterjenkinsagent:latest 192.168.43.95/jenkins/chesterjenkinsagent:v1
docker login --usernameadmin --password123456 192.168.43.95
docker push 192.168.43.95/jenkins/chesterjenkinsagent:v1运行Agent其中的密钥通过jenkins的agent信息获取# 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#!/usr/bin/env groovydef 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#!/usr/bin/env groovydef call(String serviceName, String dockerfilePath) {echo serviceName:${serviceName} dockerfilePath:${dockerfilePath}sh docker build -t ${serviceName} -f ${dockerfilePath} .
}vars/dockerLogin.groovy#!/usr/bin/env groovydef call(String envName) {sh docker login --username$HARBOR_USR --password$HARBOR_PSW 192.168.43.95
}vars/dockerPush.groovy#!/usr/bin/env groovydef call(String serviceName,String envName) {sh docker push 192.168.43.95/dapr/${serviceName}:${envName}-${BUILD_NUMBER}
}vars/dockerTag.groovy#!/usr/bin/env groovydef call(String serviceName, String envName) {sh docker tag ${serviceName}:latest 192.168.43.95/dapr/${serviceName}:${envName}-${BUILD_NUMBER}
}vars/gitCheckOut.groovy#!/usr/bin/env groovydef call(String branchName, String gitUrl) {echo branchName:${branchName} gitUrl:${gitUrl}checkout([$class: GitSCM, branches: [[name: branchName]], extensions: [], userRemoteConfigs: [[credentialsId: gitee, url: gitUrl]]])
}vars/harborSecret.groovydef 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.yamlsh sed -i s/{{NameSpaceName}}/${namespaceName}/g secrets.yamlif (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#!/usr/bin/env groovydef call(String servicePath) {sh jmeter -j jmeter.save.saveservice.output_formatxml -n -t ${servicePath}jmeter.jmx -l ${servicePath}jmeter.report.jtlsh cp ${servicePath}jmeter.report.jtl ${servicePath}jmeter.report.${BUILD_NUMBER}.jtlperfReport errorFailedThreshold:5, sourceDataFiles:${servicePath}jmeter.report.jtlsh cat ${servicePath}jmeter.report.${BUILD_NUMBER}.jtlsh #!/bin/shgrep failuretrue/failure ${servicePath}jmeter.report.${BUILD_NUMBER}.jtlif [ \$? 0 ]thenexit 1elseexit 0fi
}vars/k8sCheckDeployStatus.groovy#!/usr/bin/env groovydef call(String nameSpaceName, String serviceName, String envName) {if (envName dev) {sh(ATTEMPTS0ROLLOUT_STATUS_CMDkubectl --kubeconfig ${DEV_MY_KUBECONFIG} rollout status deployment/${serviceName} -n ${nameSpaceName}-nsuntil \$ROLLOUT_STATUS_CMD || [ \$ATTEMPTS -eq 60 ]; do\$ROLLOUT_STATUS_CMDATTEMPTS\$((attempts 1))sleep 10done)}if (envName prod) {sh(ATTEMPTS0ROLLOUT_STATUS_CMDkubectl --kubeconfig ${PROD_MY_KUBECONFIG} rollout status deployment/${serviceName} -n ${nameSpaceName}-nsuntil \$ROLLOUT_STATUS_CMD || [ \$ATTEMPTS -eq 60 ]; do\$ROLLOUT_STATUS_CMDATTEMPTS\$((attempts 1))sleep 10done)}
}vars/k8sDeploy.groovy#!/usr/bin/env groovydef 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#!/usr/bin/env groovydef 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.yamlsh sed -i s/{{ServicePort}}/${servicePort}/g ${servicePath}deployment.yamlsh sed -i s/{{NodePort}}/${nodePort}/g ${servicePath}deployment.yamlsh sed -i s/{{NameSpaceName}}/${namespaceName}/g ${servicePath}deployment.yaml
}jenkins-demo-secrets中代码如下apiVersion: v1
kind: Namespace
metadata:name: {{NameSpaceName}}-ns---
apiVersion: v1
kind: Secret
metadata:name: harbor-keynamespace: {{NameSpaceName}}-ns
type: kubernetes.io/dockerconfigjson
data:.dockerconfigjson: ewoJImF1dGhzIjogewoJCSIxOTIuMTY4LjQzLjk1IjogewoJCQkiYXV0aCI6ICJZV1J0YVc0Nk1USXpORFUyIgoJCX0sCgkJInJlZ2lzdHJ5LmNuLWJlaWppbmcuYWxpeXVuY3MuY29tIjogewoJCQkiYXV0aCI6ICI2Wm1JNUxpQTU0dXVPbU5vWlc1NWFYTm9hVEV5TXc9PSIKCQl9Cgl9Cn0dockerconfigjson可通过以下方式获取docker login --usernameadmin --password123456 192.168.43.95
cat ~/.docker/config.json | base64Jenkinsfile中引用共享库项目库中需要提前编写好DockerfileJenkinsfiledeployment.yaml.tpljmeter.jmxDockerfile#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 5001FROM 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/buildFROM build AS publish
RUN dotnet publish FrontEnd.csproj -c Release -o /app/publishFROM base AS final
WORKDIR /app
COPY --frompublish /app/publish .
ENTRYPOINT [dotnet, FrontEnd.dll]Jenkinsfile#!/usr/bin/env groovyLibrary(sharemaster) _run daprtest, frontend, ./FrontEnd/, 5001, 31111, [dev:*/master, prod:*/master]deployment.yaml.tplapiVersion: v1
kind: Namespace
metadata:name: {{NameSpaceName}}-ns---
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:name: statestorenamespace: {{NameSpaceName}}-ns
spec:type: state.redisversion: v1metadata:- name: redisHostvalue: 192.168.43.102:6379- name: redisPasswordvalue: 123456- name: actorStateStorevalue: true---
apiVersion: apps/v1
kind: Deployment
metadata:name: {{ServiceName}}namespace: {{NameSpaceName}}-nslabels:app: {{ServiceName}}
spec:replicas: 1selector:matchLabels:app: {{ServiceName}}template:metadata:namespace: {{NameSpaceName}}-nslabels:app: {{ServiceName}}annotations:dapr.io/enabled: truedapr.io/app-id: {{ServiceName}}dapr.io/app-port: {{ServicePort}}spec:imagePullSecrets:- name: harbor-keycontainers:- name: {{ServiceName}}image: 192.168.43.95/dapr/{{ServiceName}}:{{tagversion}}ports:- containerPort: {{ServicePort}}imagePullPolicy: Always---
apiVersion: v1
kind: Service
metadata:namespace: {{NameSpaceName}}-nsname: {{ServiceName}}-svc
spec:type: NodePortselector:app: {{ServiceName}}ports:- port: {{ServicePort}}targetPort: {{ServicePort}}nodePort: {{NodePort}}jmter.jmx则根据需要自行编写新建pipline其中的URL指向自己项目的git地址构建pipline至此我们已经完成了Jenkinsfile中一行代码部署我们的项目如果有新的service在编写好Dockerfiledeployment.yaml.tpl保持一致jmeter.jmx的前提下我们只需要Jenkinsfile中通过共享库引用run方法即可