<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>workflow | 伪架构师</title>
    <link>/tags/workflow/</link>
      <atom:link href="/tags/workflow/index.xml" rel="self" type="application/rss+xml" />
    <description>workflow</description>
    <generator>Source Themes Academic (https://sourcethemes.com/academic/)</generator><language>zh</language><lastBuildDate>Thu, 18 Jul 2024 22:59:35 +0800</lastBuildDate>
    <image>
      <url>/img/logo-wide.png</url>
      <title>workflow</title>
      <link>/tags/workflow/</link>
    </image>
    
    <item>
      <title>用 Kyverno 让 Argo Workflow 单步执行</title>
      <link>/post/%E7%94%A8-kyverno-%E8%AE%A9-argo-workflow-%E5%8D%95%E6%AD%A5%E6%89%A7%E8%A1%8C/</link>
      <pubDate>Thu, 18 Jul 2024 22:59:35 +0800</pubDate>
      <guid>/post/%E7%94%A8-kyverno-%E8%AE%A9-argo-workflow-%E5%8D%95%E6%AD%A5%E6%89%A7%E8%A1%8C/</guid>
      <description>

&lt;p&gt;AWS 的 SSM Automation 中，有个有趣的特性就是单步执行，在编写自动化脚本的时候，这个功能对调试非常有帮助。Argo Workflow 也有个暂停特性，官网给出的例子是这样的：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: pause-after-
spec:
  entrypoint: whalesay
  templates:
    - name: whalesay
      container:
        image: argoproj/argosay:v2
        env:
          - name: ARGO_DEBUG_PAUSE_AFTER
            value: &#39;true&#39;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;把他提交到 Argo 会看到暂停的情况：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-command&#34;&gt;$ argo submit --watch debug.yml
Name:                pause-after-hpvg9                                                                                                                                          [0/1455]
Namespace:           default
ServiceAccount:      unset (will run with the default ServiceAccount)
Status:              Running
Conditions:
 PodRunning          True
Created:             Thu Jul 18 23:18:46 +0800 (18 seconds ago)
Started:             Thu Jul 18 23:18:46 +0800 (18 seconds ago)
Duration:            18 seconds
Progress:            0/1

STEP                  TEMPLATE  PODNAME            DURATION  MESSAGE
 ● pause-after-hpvg9  whalesay  pause-after-hpvg9  18s
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;你会发现，这个 Workflow 会一直冻结在这个状态，&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-command&#34;&gt;$ argo list
NAME                STATUS      AGE   DURATION   PRIORITY   MESSAGE
pause-after-hpvg9   Running     11m   11m        0
...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;这时候只要进入 Pod，执行一个命令，工作流就会完成：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-command&#34;&gt;$ kubectl exec -it pause-after-hpvg9 -- bash
root@pause-after-hpvg9:/# touch /proc/1/root/var/run/argo/ctr/main/after
root@pause-after-hpvg9:/# command terminated with exit code 137
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;可以看到 Argo 的 Watch 也发生了变化：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-command&#34;&gt;STEP                  TEMPLATE  PODNAME            DURATION  MESSAGE
 ✔ pause-after-hpvg9  whalesay  pause-after-hpvg9  21m
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;问题来了，正常的工作流不会只有一个步骤，要实现单步执行的效果，就需要给每个步骤加入环境变量，是不是有点麻烦？我想到一个办法——用 Kyverno 做个自动补丁。只要 Workflow 加上一个 &lt;code&gt;debug&lt;/code&gt; 标签，就给所有步骤加入暂停标志。&lt;/p&gt;

&lt;p&gt;废话不多说，上策略代码：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: add-argo-debug-env
spec:
  rules:
    - name: add-debug-env-var
      match:
        resources:
          kinds:
            - argoproj.io/v1alpha1/Workflow
          selector:
            matchLabels:
              debug: &amp;quot;true&amp;quot;
          operations:
          - CREATE
      mutate:
        foreach:
          - list: request.object.spec.templates[]
            patchesJson6902: |-
              - path: /spec/templates/{{elementIndex}}/container/env/-
                op: add
                value:
                  name: ARGO_DEBUG_PAUSE_AFTER
                  value: &amp;quot;true&amp;quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;这段策略有几个要点：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;selector&lt;/code&gt; 指定，只处理带有 Debug 标签，并且操作为 &lt;code&gt;CREATE&lt;/code&gt; 的&lt;/li&gt;
&lt;li&gt;使用 &lt;code&gt;foreach&lt;/code&gt; 语法，处理工作流中出现的每一个步骤&lt;/li&gt;
&lt;li&gt;用 &lt;code&gt;patchesJson6902&lt;/code&gt; 方式，给每个步骤的容器加入 &lt;code&gt;ARGO_DEBUG_PAUSE_AFTER&lt;/code&gt; 环境变量。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;提交策略之后，用如下任务脚本测试一下：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: debug314159-
  labels:
    debug: &amp;quot;true&amp;quot;
spec:
  entrypoint: whalesay
  templates:
    - name: whalesay
      container:
        image: argoproj/argosay:v2
    - name: whalesayagain
      container:
        image: argoproj/argosay:v2
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;提交工作流：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-command&#34;&gt;$ argo submit debug.yml
Name:                debug314159-dvqmw
Namespace:           default
ServiceAccount:      unset (will run with the default ServiceAccount)
Status:              Pending
Created:             Fri Jul 19 00:11:15 +0800 (now)
Progress:
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;查看生成的工作流：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-command&#34;&gt;apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
...
  labels:
    debug: &amp;quot;true&amp;quot;
    workflows.argoproj.io/completed: &amp;quot;false&amp;quot;
    workflows.argoproj.io/phase: Running
  name: debug314159-dvqmw
  namespace: default
...
spec:
...
  - container:
      env:
      - name: ARGO_DEBUG_PAUSE_AFTER
        value: &amp;quot;true&amp;quot;
      image: argoproj/argosay:v2
...
  - container:
      env:
      - name: ARGO_DEBUG_PAUSE_AFTER
        value: &amp;quot;true&amp;quot;
      image: argoproj/argosay:v2
      name: &amp;quot;&amp;quot;
...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;可以看到，Kyverno 给每个步骤都加入了环境变量，这样一来，就实现了单步执行的效果。&lt;/p&gt;

&lt;h2 id=&#34;后记&#34;&gt;后记&lt;/h2&gt;

&lt;p&gt;这个办法还有个问题，就是恢复太麻烦了，我打算接下来用 Shell Operator 来解决。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;不明白为什么 Argo Workflow 没有给这种步骤设置一个暂停状态。&lt;/p&gt;
&lt;/blockquote&gt;
</description>
    </item>
    
    <item>
      <title>Drupal工作流概览</title>
      <link>/post/drupal-workflow-summary/</link>
      <pubDate>Wed, 05 Aug 2015 10:32:19 +0800</pubDate>
      <guid>/post/drupal-workflow-summary/</guid>
      <description>

&lt;p&gt;现在，一个商业公司如果发布了静态或者过时的Web内容，会给人造成不合时宜、步履蹒跚的印象，因此，各种机构都体会到了要频繁创作Web内容，更新现有内容以及同在线用户分享文档的持续增长的压力。&lt;/p&gt;

&lt;p&gt;内容维护的压力使得内容采编人员的编制随之增长，人数的增长就要求组织利用Drupal这样的内容管理系统，来开发并执行一套内容采编流程。最主要的挑战是如何为众多的采编人员提供一个环境，这一环境能够在不影响现有的内容，也不降低安全性的前提下，让采编人员能够发布内容。在此基础上，还要建立品牌标准并提供质量保障。这一过程涉及到的内容编写和审批的职责：&lt;/p&gt;

&lt;h3 id=&#34;编辑-审批&#34;&gt;编辑/审批&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;审查：是否有淫秽或者其他的负面内容？&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;可读性：有没有语法、格式拼写或者其他类似问题？&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;准确性：内容是否真实？其中涉及到的统计数字以及事实是否需要再次确认？&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;品牌：是否正确使用公司的字体、颜色以及图片？内容、语气以及技术术语是否符合公司的标准？&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;版权：公司是否有权发布这些内容、图像以及外部文档？所有的来源引用是否都有标明？&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&#34;作者&#34;&gt;作者&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;提供能够准确体现公司信息的内容。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;准确，专业，及时&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;务必保证内容能够被团队以及其他受众接受，耸人听闻、哗众取宠永远不是好主意。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;发布内容应有保存价值，好内容的价值会持续较长的时间。别发什么公司野炊之类的破事，一周后就没人记得这回事了。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;上面列出了两种角色，接下来我们看看Drupal 7能为这种场景提供什么样的解决方案。&lt;/p&gt;

&lt;p&gt;Drupal 7核心目前并未提供发布内容的流程管理。一个内容Node(页面)只能是发布或者未发布状态。然而，有些第三方模块实现了我们需要的功能。&lt;/p&gt;

&lt;h2 id=&#34;workbench模块&#34;&gt;Workbench模块&lt;/h2&gt;

&lt;p&gt;&lt;img src=&#34;/sites/default/files/get_image/2385d1132ee3f1b452fd5592677ae081.png&#34; alt=&#34;Workbench&#34; /&gt;&lt;/p&gt;

&lt;p&gt;对内容管理工作流程，&lt;a href=&#34;http://drupal.org/project/workbench&#34; target=&#34;_blank&#34;&gt;Workbench&lt;/a&gt;提供了模块化的支持能力。有很多模块可以启用或者禁用，以此来定制不同类型的工作流。这个模块包含大量代码，涉及到方方面面。还可以编写自己的模块对Workbench进行扩展。&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;http://drupal.org/documentation/modules/workbench&#34; target=&#34;_blank&#34;&gt;WorkBench套件&lt;/a&gt;有很完备的演示视频、文档以及相关模块的连接。在这里必须夸奖一下他的高质量代码、文档以及深思熟虑的模块结构。这些模块以经典的Drupal模式构建，易于配置浏览和使用。Workbench的弹性令人印象深刻。他能简单的生成常见的简单工作流，也能针对各种环境，通过定制实现复杂的应用流程。&lt;/p&gt;

&lt;p&gt;##Workflow模块&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;http://drupal.org/project/workflow&#34; target=&#34;_blank&#34;&gt;Workflow&lt;/a&gt;是本文中三个模块中最成熟的一个。他为内容发布状态管理提供了一个简单的工作流方案，他为指定的内容类型提供了包含草稿、审核以及发布状态。&lt;/p&gt;

&lt;p&gt;用于承载状态的Field在内容编辑界面可以进行控制，同时也为管理员提供了简单的配置页面。还可以利用Views列出不同状态下的内容。&lt;/p&gt;

&lt;p&gt;##Maestro模块&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;/sites/default/files/get_image/8e9a3bc4620911d5aa8727e5b5d63057.png&#34; alt=&#34;Maestro&#34; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;http://drupal.org/project/maestro&#34; target=&#34;_blank&#34;&gt;Maestro&lt;/a&gt;是Drupal 7下面的一个非常强大的工作流系统，他通常见于出版性网站。有&lt;a href=&#34;http://www.nutshell.nu/comment/72&#34; target=&#34;_blank&#34;&gt;视频&lt;/a&gt;演示了一篇内容从草稿状态转变为发布状态的过程。这一系统可以满足出版者任何复杂需要，他也可以用极简的方式进行配置。&lt;/p&gt;

&lt;p&gt;Maestor的最为独特的功能就是图形化的工作流设计器了。这一特性以图形界面提供了直觉化的工作流设计功能，其中以令人惊叹的方式提供了必要的配置功能。然而，这依然需要一些学习，新潮的界面和交互，以及右键菜单，都需要学习和适应。&lt;/p&gt;

&lt;p&gt;抛开实现问题不谈，最重要的是识别工作流的需求。推荐下面的检查表，该列表用于确认需求的要点是否都被满足：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;版本：必须能够记录、回滚，并能够进行版本之间的比较。Drupal核心提供了版本控制能力，不过有些工作流模块提供了更好的扩展。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;备注：应该具有一个备注字段，让编辑和作者能够留下各自的备注。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;时间表：内容定时过期或定时撤回已发布内容是一个很有用的功能。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;审核队列：审核队列需要非常易用，这方面是否便利，会直接影响到系统的选型工作。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;多重审核：在内容发布之前，进行多步审核是很有帮助的。例如，可能三个或者四个部门经理需要在内容发布之前进行确认。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;最后，工作流系统的合理建设，能够通过结构化的通信和有组织的内容，让组织内的各种角色更好的参与内容发布过程，极大的提高在线内容的质量。&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
