簡體   English   中英

groovy 中的復雜模板

[英]Complex templating in groovy

我想做一些模板,我可以用 Jinja2 或 Jenkins 共享庫中的 Helm 模板語言來做。

本質上,我想像這樣動態呈現一個 pod 定義(用作 kubernetets 代理):

renderPod() {
    return '''
apiVersion: v1
kind: Pod
metadata:
  labels:
    type: ephemeral-jenkins-agent
    pipeline: generic_pipeline
spec:
  containers:
  - name: alpine
    image: alpine:3.12.3
    command:
    - cat
    tty: true
<% if dockerBuild() %>
  - name: docker
    image: docker:18.05-dind
    securityContext:
      privileged: true
    volumeMounts:
    - name: dind-storage
      mountPath: /var/lib/docker
<% end %>
<% if dockerBuild() %>
  volumes:
    - name: dind-storage
      emptyDir: {}
<% else %>
  volumes: {}
<% end %>
    '''
}

我目前有一些意大利面條代碼可以以功能方式通過字符串連接來執行此操作,但是我團隊中的其他人(或 6 個月后的我)很難將他們的(我的)頭圍起來。 因此,我希望使用模板引擎渲染 pod,使其易於理解和維護。

從我在這里閱讀的代碼示例中,現有的模板引擎似乎沒有這個功能,但我希望有人能證明我錯了。

您可以使用內置的 SimpleTemplateEngine:

String renderTemplate(Map binding, String template) {
    return new groovy.text.SimpleTemplateEngine().createTemplate(template).make(binding).toString()
}

def binding = [
    dockerBuild: {
        true
    },
    version: 'v1',
    kind: 'Pod',
    labels:[
        type: 'ephemeral-jenkins-agent',
        pipeline: 'generic_pipeline'
    ]
]

def template =     '''\
apiVersion: ${version}
kind: <%= kind %>
metadata:
  labels:
<% for(label in labels){ %>\
    ${label.key}: ${label.value}
<% } %>\
spec:
  containers:
  - name: alpine
    image: alpine:3.12.3
    command:
    - cat
    tty: true
<% if( dockerBuild() ){ %>\
  - name: docker
    image: docker:18.05-dind
    securityContext:
      privileged: true
    volumeMounts:
    - name: dind-storage
      mountPath: /var/lib/docker
<% } %>\
<% if( dockerBuild() ){ %>\
  volumes:
    - name: dind-storage
      emptyDir: {}
<% } else { %>\
  volumes: {}
<% } %>\
    '''

println renderTemplate(binding,template)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM