模板是什么?

看一个go template示例

echo "部署{{.svc}}服务"

这个模板生成的shell执行后可打印部署**任意**服务,如:

echo "部署user"echo "部署order"

模板用于形容不变的流程,模板参数示意可变动的局部,模板参数最终由输出值代替。

模板的分类

模板一共分三种:聚合模板、编排模板、执行模板组成,实质是雷同的文本在不同的阶段采纳不同模板渲染规定

聚合模板

聚合本地模板文件到一个编排内,性能相似helm。

左右分隔符别离为%{}%尽量和支流分隔符辨别开

下图为聚合argo workflow templates、执行模板、配置模板到一份编排示例:

模块定义模板

用来定义代码、kube、测试等模块属性(含平安规定)、执行脚本、脚本配置模板

模块的次要定义内容如下图:

以下为模块定义的一些示例

模板的左右分隔符别离为!{}!
  1. 代码code.common定义示例如下:

    code:  common: labels:   role: website,iot # role:代码仓库所属角色   package: true # 示意公共库 config: ""    # 示意不须要构建镜像 settings:   repo: http://xxxxxx/common.git   mvn:     api: # 只上传jar包 不打包和构建镜像       dir: ""   sonar:       exclusions: 'src/main/java/xxx/protobuf/**'  # sonar扫描排除pb代码
  2. 默认属性、平安规定、执行脚本、配置文件在整个模块都是类似的,因而优先定义在独立的全局配置
code:  # 模块名  __global__:  # 模块的全局配置    workflow:      templates: |        %{readText "code/argo.templates.yaml" | indent 36}%    security:      pom:        - name: "fastjson反序列化破绽"          env: ".*"          action: "Info"          content: "com\\.alibaba:fastjson:jar:1\\.2\\.(([1-7][0-9]?)|(8[0-2])):compile"          message: "低版本fastjson存在反序列化安全漏洞,请降级到最新版本1.2.83及以上版本!"    execTmpl: |        %{readText "code/argo.yaml" | indent 34}%    config:      - |        %{readText "code/run.Dockerfile" | indent 34}%    default:      type: git      template: public/java:latest        !{- if contains (or $.engine.metadata.annotations.codes "") "common" }!      depends:      - common        !{- end }!
  1. 定义中不同环境的雷同属性的值不一样

    feishu-workflow: &wf  type: feishu  settings: webhooks:#        - https://open.feishu.cn/open-apis/bot/v2/hook/aaaaaa # 测试群音讯   !{- if inStr $.sys.env "dev" "debug" "pts" }!   - https://open.feishu.cn/open-apis/bot/v2/hook/bbbbbbb # 开发环境   !{- end }!   !{- if inStr $.sys.env "sit" "alpha" "beta" }!   - https://open.feishu.cn/open-apis/bot/v2/hook/cccccc # 测试环境   !{- end }!

执行模板

此模板的指标是生成最终的编排,次要包含编排、执行脚本配置模板,左右分隔符别离为@{}@

上面以CICD发版前后查看为例作阐明。

编排示例如下:

@{- $check := or (contains .sys.env "uat-") (contains .sys.env "prod-") }@metadata:  annotations:    platform: "linux/amd64"spec:  global:  # 全局配置,定义workflow、k8s环境等信息    workflow:      templates:        %{readText "global.templates.yaml" | indent 14 }%    kube:      %{readText "global.kube.yaml" | indent 12 }%  stages:    - name: "ci"  # 阶段名      desc: "性能包含下载代码、编译、制作镜像"      modules:  # 定义用到的模块,由代码和参数填充内容;同时仅渲染该渲染的、解决大模板问题        code: []    @{- $cdDeps := "ci" }@    @{- if $check }@    @{- $cdDeps = concat $cdDeps ",precheck" }@    @{- end }@    - name: "cd"      desc: "性能包含k8s、nacos"      depends: [ @{- $cdDeps -}@ ] # 按条件生成依赖阶段      modules:        kube: []    @{- if $check }@  # 按条件生成执行的阶段    - name: "precheck"      desc: "变更前巡检"      modules:        log: []    - name: "check"      desc: "变更后巡检"      depends: ["cd"]      modules:        log: []    @{- end }@

code形容CI过程,包含下载代码、编译、构建镜像等性能,所有性能有脚本和配置实现(Dockerfile)。

脚本模板示例:

@{/* 下载代码 */}@@{- $repoName := repoName .settings.repo }@@{- $branch := or .settings.tag .settings.branch (render $env.code.branch .) }@- name: git  template: git  arguments:    parameters:      - name: stage        value: @{ $.sys.stage }@      - name: repo        value: @{.settings.repo}@      - name: branch        value: @{ $branch }@      - name: repoName        value: @{ $repoName}@@{/* 编译 */}@- name: "mvn-@{$type}@"  template: mvn  depends: [@{ $depends }@]  arguments:    parameters:      - name: cmd        value: |          mvn clean package -U -P @{$env.mvn.profile}@ -Dmaven.test.skip=true@{/* 构建镜像 */}@- name: docker  template: docker  depends: [mvn-@{$type}@]  arguments:    parameters:      - name: stage        value: @{$.sys.stage}@      - name: name        value: @{ $parent.name }@      - name: image        value: @{ $parent.settings._image }@      - name: repoName        value: @{ $repoName }@#要害命令如下:依赖Dockerfile#executor --cache=true --cache-dir=/cache --context=dir:///workspace --custom-platform=@{or .sys.annotations.platform "linux/amd64" }@ \#--dockerfile=/workdir/{{inputs.parameters.name}}.Dockerfile \#--destination={{inputs.parameters.image}} \#--push-retry=5

执行脚本对应的配置模板(Dockerfile)示例:

@{- $platform := "" -}@@{- if and .sys.annotations.platform (not (contains .sys.annotations.platform "amd64")) -}@@{- $platform = "-arm64" -}@@{- end -}@FROM openjdk:8.0.4@{- $platform }@WORKDIR /ARG JAR_FILE=app.jarCOPY ${JAR_FILE} app.jarENV TZ=Asia/Shanghai#设置变量 JAVA_OPTSENV JAVA_OPTS=""CMD @{ $cmdPrefx }@ /sbin/tini -- java \-Duser.language=zh -Duser.country=CN -Duser.timezone=Asia/Shanghai \-Djava.security.egd=file:///dev/urandom \-Dsun.net.client.defaultConnectTimeout=5000 -Dsun.net.client.defaultReadTimeout=60000 \-Dspring.jmx.enabled=false -Dspring.backgroundpreinitializer.ignore=true \-Djava.util.concurrent.ForkJoinPool.common.parallelism=10 \-cp "/app:/app/lib/*" \$JAVA_OPTS -jar /app.jar

模板的利用

平台与我的项目/部门的根本流程如下图

阐明:不同色彩:示意不同我的项目/部门的整条链路都要差别解决,即各模板的定义、构造和实现都存在差别

结语

基于模板治理编排,使编排极易保护和扩大,相比仓库治理编排效率进步100倍不止。

TODO:行将补充残缺模板利用案例

请<font style="color:red;font-weight:bold">同学</font> 关注下 ,我专一云原生DevOps落地,将按段公布上述能力的落地计划。

本文由mdnice多平台公布