【发布时间】:2018-10-23 23:03:55
【问题描述】:
这乍一看似乎很简单。但我可以告诉你,我已经为此绞尽脑汁好几天了。我已经阅读了很多文档,与人们一起坐在 IRC 上,并与同事交谈过,在这一点上,我没有一个我真正认为站得住脚的答案。
我研究了几种可能的方法
- 反应堆
- 编排运行器
我不喜欢这两个,因为自上而下执行的必要性......它们似乎是为协调多个节点状态而不是单个节点中的工作流量身定制的。
- 自定义状态
这是我非常想避免的事情,因为这是一个重复的工作流程,我不想构建这样的自定义。如果我和我的队友一起走这条路,就会有太多难以辨认的空间。
- 需要/观看
这些没有重复应用状态或以逻辑顺序/工作流程应用状态的概念(我知道)。
还有一些我不会提及的。
没有进一步的讨论,这是我的困境。
目标:
- Jenkins Master 已部署
- 我们可以在部署过程中对部署进行单元测试
- 我们只在必要时重启 Tomcat
- 我们可以根据每个包更新插件
- 非常强调良好的清洁直观清晰的盐配置
Jenkins 部署非常简单。我们放入包和配置,然后我们就设置好了。
单元测试更难。例如,我有这个状态文件。
actions/version.sls:
# Hit's the jenkins CLI interface to check for version info
# This can be used to verify that jenkins is active and the version we want
# Import some info
{%- from 'jenkins/init.sls' import jenkins_home with context %}
# Install plugins in jenkins_plugins list
jenkins_version:
cmd.run:
- name: java -jar jenkins-cli.jar -s "http://127.0.0.1:8080" version
- cwd: /var/lib/tomcat/webapps/ROOT/WEB-INF/
- user: jenkins
actions.version 基本上验证了 jenkins 是否正在运行且可查询。我们希望在构建过程中的几个点上确定这一点。
示例... tomcat 需要时间来启动。我们不得不为重新启动操作添加延迟。如果您查看下面的 start.sls,您可以看到该操作正在发生。注意在 init_delay 上打开的错误:.
actions/start.sls:
# Starts the tomcat service
tomcat_start:
service.running:
- name: tomcat
- enable: True
- full_restart: True
# Not functional atm see --> https://github.com/saltstack/salt/issues/20631
# - init_delay: 120
# initiate a 120 second delay after any service start to let tomcat come up.
tomcat_wait:
module.run:
- name: test.sleep
- length: 60
include:
- jenkins.actions.version
现在我们通过执行actions.stop 和actions.start 来获得这种重启能力。我们有这个 actions.version 状态,我们可以使用它来验证系统是否准备好继续执行 jenkins 特定的状态工作流。
我想做一些这样的事情......
Install Jenkins --> Grab yaml of plugins --> install plugins that need it
非常直接。
除了循环遍历我正在使用 Jinja 的插件的 yaml。
而现在我没有办法调用并确保 start.sls 和 version.sls 状态可以重复应用。
我正在寻找一个好方法。
这类似于 jenkins.sls
{% set repo_username = "foo" -%}
{% set repo_password = "bar" -%}
include:
- jenkins.actions.version
- jenkins.actions.stop
- jenkins.actions.start
# Install Jenkins
jenkins:
pkg:
- installed
# Import Jenkins Plugins as List, and Working Path
{%- from 'jenkins/init.sls' import jenkins_home with context %}
{%- import_yaml "jenkins/plugins.sls" as jenkins_plugins %}
{%- import_yaml "jenkins/custom-plugins.sls" as custom_plugins %}
# Grab updated package list
jenkins-contact-update-server:
cmd.run:
- name: curl -L http://updates.jenkins-ci.org/update-center.json | sed '1d;$d' > {{ jenkins_home }}/updates/default.json
- unless: test -d {{ jenkins_home }}/updates/default.json
- require:
- pkg: jenkins
- service: tomcat
# Install plugins in jenkins_plugins list
{% for plugin in jenkins_plugins %}
jenkins-plugin-{{ plugin }}:
cmd.run:
- name: java -jar jenkins-cli.jar -s "http://127.0.0.1:8080" install-plugin "{{ plugin }}"
- unless: java -jar jenkins-cli.jar -s "http://127.0.0.1:8080" list-plugins | grep "{{ plugin }}"
- cwd: /var/lib/tomcat/webapps/ROOT/WEB-INF/
- user: jenkins
- require:
- pkg: jenkins
- service: tomcat
这是我卡住的地方。要求不会这样做。并列出 的行动似乎并没有在盐中线性安排。我需要 能够验证 jenkins 是否已启动并准备就绪。我需要 能够在单个插件后重新启动tomcat 添加了迭代。我需要能够做到这一点才能满足 插件顺序中的依赖关系。
- sls: jenkins.actions.version
- sls: jenkins.actions.stop
- sls: jenkins.actions.start
# This can't work for several reasons
# - watch_in:
# - sls: jenkins-safe-restart
{% endfor %}
# Install custom plugins in the custom_plugins list
{% for cust_plugin,cust_plugin_url in custom_plugins.iteritems() %}
# manually downloading the plugin, because jenkins-cli.jar doesn't seem to work direct to artifactory URLs.
download-plugin-{{ cust_plugin }}:
cmd.run:
- name: curl -o {{ cust_plugin }}.jpi -O "https://{{ repo_username }}:{{ repo_password }}@{{ cust_plugin_url }}"
- unless: java -jar jenkins-cli.jar -s "http://127.0.0.1:8080" list-plugins | grep "{{ cust_plugin }}"
- cwd: /tmp
- user: jenkins
- require:
- pkg: jenkins
- service: tomcat
# installing the plugin ( REQUIRES TOMCAT RESTART AFTER )
custom-plugin-{{ cust_plugin }}:
cmd.run:
- name: java -jar jenkins-cli.jar -s "http://127.0.0.1:8080" install-plugin /tmp/{{ cust_plugin }}.jpi
- unless: java -jar jenkins-cli.jar -s "http://127.0.0.1:8080" list-plugins | grep "{{ cust_plugin }}"
- cwd: /var/lib/tomcat/webapps/ROOT/WEB-INF/
- user: jenkins
- require:
- pkg: jenkins
- service: tomcat
{% endfor %}
【问题讨论】:
标签: salt-stack jinja2