<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>deploy | 伪架构师</title>
    <link>/tags/deploy/</link>
      <atom:link href="/tags/deploy/index.xml" rel="self" type="application/rss+xml" />
    <description>deploy</description>
    <generator>Source Themes Academic (https://sourcethemes.com/academic/)</generator><language>zh</language><lastBuildDate>Sat, 20 Oct 2018 00:46:47 +0800</lastBuildDate>
    <image>
      <url>/img/logo-wide.png</url>
      <title>deploy</title>
      <link>/tags/deploy/</link>
    </image>
    
    <item>
      <title>在 Kubernetes 和 Istio 环境下进行蓝绿部署</title>
      <link>/post/tutorial-blue-green-deployments-with-kubernetes-and-istio/</link>
      <pubDate>Sat, 20 Oct 2018 00:46:47 +0800</pubDate>
      <guid>/post/tutorial-blue-green-deployments-with-kubernetes-and-istio/</guid>
      <description>

&lt;p&gt;原文：&lt;a href=&#34;https://thenewstack.io/tutorial-blue-green-deployments-with-kubernetes-and-istio/&#34; target=&#34;_blank&#34;&gt;Tutorial: Blue/Green Deployments with Kubernetes and Istio&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;作者：&lt;a href=&#34;https://thenewstack.io/author/janakiram/&#34; target=&#34;_blank&#34;&gt;Janakiram MSV&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;作为一个服务网格系统，Istio 为服务间通信提供稳定性、透明性和安全性方面的保障。不论集群内外的服务，只要其访问目标是网格内的服务，就都会被 Istio 所拦截并进行处理。&lt;/p&gt;

&lt;p&gt;Istio 有很多功能，例如服务间通信的加密、自动的指标记录、访问控制策略、频率限制以及配额等，这里我们仅着眼于最常用的流量管理能力。&lt;/p&gt;

&lt;p&gt;Istio 让 DevOps 团队有能力为内部服务创建智能的路由规则。断路器、超时和重试之类的服务级属性非常容易配置，配置包含蓝绿部署及金丝雀发布的过程也很轻松。&lt;/p&gt;

&lt;p&gt;本文教程用于帮助读者理解配置 Kubernetes + Istio 环境下的蓝绿部署过程。无需很多知识背景，只要理解一些在 Kubernetes 中部署 Pod 和服务的基础概念就好。我们会在 Minikube 和 Istio 中完成示例。&lt;/p&gt;

&lt;p&gt;教程包含四个步骤：安装 Minikube、安装 Istio 并进行验证、安装一个应用的两个版本，最后配置服务的蓝绿部署。我们会使用两个简单的构建好了的镜像，分别作为蓝（v1）、绿（v2）两个版本。&lt;/p&gt;

&lt;h2 id=&#34;步骤-1-安装-minikube&#34;&gt;步骤 1：安装 Minikube&lt;/h2&gt;

&lt;p&gt;为了降低依赖，我们会使用 Minikube 作为测试平台。因为需要自定义配置，所以要删除已经存在的配置，并使用额外参数重新启动集群：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;minikube start --memory=8192 --cpus=4 --kubernetes-version=v1.10.0 \
--extra-config=controller-manager.cluster-signing-cert-file=&amp;quot;/var/lib/localkube/certs/ca.crt&amp;quot; \
--extra-config=controller-manager.cluster-signing-key-file=&amp;quot;/var/lib/localkube/certs/ca.key&amp;quot; \
--vm-driver=virtualbox
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;要在 Minikube 上运行 Istio，需要至少 8G 内存和 4 个 CPU 核心。等集群启动：&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;images/b1cfb731-istio-0-1024x431.png&#34; alt=&#34;minikube startup&#34; /&gt;&lt;/p&gt;

&lt;h2 id=&#34;步骤-2-安装-istio&#34;&gt;步骤 2：安装 Istio&lt;/h2&gt;

&lt;p&gt;Kubernetes 集群成功启动之后，就可以安装 Istio 了。用下面的步骤完成：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;curl -L https://git.io/getLatestIstio | sh -
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;在运行上述命令的目录中会发现一个 &lt;code&gt;istio-1.0.2&lt;/code&gt; 目录，可以把 &lt;code&gt;istio-1.0.2/bin&lt;/code&gt; 目录加入 &lt;code&gt;PATH&lt;/code&gt; 变量，方便后面的命令执行过程。&lt;/p&gt;

&lt;p&gt;由于我们在 Minikube 环境下运行的 Istio，所以我们要在下一步进行之前，要把 Ingress Gateway 服务从 &lt;code&gt;LoadBalancer&lt;/code&gt; 改为 &lt;code&gt;NodePort&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;打开文件 &lt;code&gt;istio-1.0.2/install/kubernetes/istio-demo.yaml&lt;/code&gt;，查找并替换：&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;images/2a64731e-istio-1.png&#34; alt=&#34;Changing Service Type&#34; /&gt;&lt;/p&gt;

&lt;p&gt;Istio 中包含了很多 CRD，可以帮用户来进行虚拟服务、规则、网关以及其他对象的管理。在部署服务网格之前首先要部署一下这些 CRD：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;kubectl apply -f install/kubernetes/helm/istio/templates/crds.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;最后，在 Kubernetes 中安装 Istio：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;kubectl apply -f install/kubernetes/istio-demo.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;上面的步骤会创建新的命名空间（&lt;code&gt;istio-system&lt;/code&gt;）：&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;images/38e93379-istio-3.png&#34; alt=&#34;kubectl get ns&#34; /&gt;&lt;/p&gt;

&lt;p&gt;会看到这里还有很多服务：&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;images/38e93379-istio-3-1024x524.png&#34; alt=&#34;kubectl get svc&#34; /&gt;&lt;/p&gt;

&lt;p&gt;稍候片刻，会看到很多 Pod：&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;images/846a8174-istio-4-1024x498.png&#34; alt=&#34;kubectl get po&#34; /&gt;&lt;/p&gt;

&lt;p&gt;Istio 如果成功部署，所有这些 Pod 只能是 &lt;code&gt;Running&lt;/code&gt; 或者 &lt;code&gt;Completed&lt;/code&gt; 状态。&lt;/p&gt;

&lt;p&gt;下一步就要准备用于蓝绿部署的应用了。&lt;/p&gt;

&lt;h2 id=&#34;步骤-3-安装同一应用的两个版本&#34;&gt;步骤 3：安装同一应用的两个版本&lt;/h2&gt;

&lt;p&gt;为了展示应用的不同版本，我构建了基于 Nginx 的简单镜像 - &lt;code&gt;janakiramm/myapp:v1&lt;/code&gt; 和 &lt;code&gt;janakiramm/myapp:v2&lt;/code&gt;。部署之后，会展示蓝色或者绿色的背景。&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: v1
kind: Service
metadata:
  name: myapp
  labels:
    app: myapp
spec:
  type: ClusterIP
  ports:
  - port: 80
    name: http
  selector:
    app: myapp
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: myapp-v1
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: myapp
        version: v1
    spec:
      containers:
      - name: myapp
        image: janakiramm/myapp:v1
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: myapp-v2
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: myapp
        version: v2
    spec:
      containers:
      - name: myapp
        image: janakiramm/myapp:v2
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;也可以在 &lt;a href=&#34;https://gist.github.com/janakiramm/123dc67b78ef187a109e7f928d6a6878&#34; target=&#34;_blank&#34;&gt;Github&lt;/a&gt; 上看到这些代码。&lt;/p&gt;

&lt;p&gt;接着就要创建 YAML 文件来定义 v1 和 v2 服务了。注意 Pod 标签的差异代表了不同的版本 —— &lt;code&gt;app&lt;/code&gt; 保持一致，但 &lt;code&gt;version&lt;/code&gt; 是不同的。这样一来，Istio 就会认为这是同一应用的不同版本。&lt;/p&gt;

&lt;p&gt;而服务中的选择器定义只针对 &lt;code&gt;app&lt;/code&gt; 标签进行设置，也就是说不同版本的 Pod 都会参与这一服务。&lt;/p&gt;

&lt;p&gt;用 &lt;code&gt;kubectl&lt;/code&gt; 创建 &lt;code&gt;Service&lt;/code&gt; 和 &lt;code&gt;Deployment&lt;/code&gt;。注意这个简单的应用对 Istio 一无所知。Istio 和应用的唯一可见的连接就是标签：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;kubectl apply -f myapp.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;img src=&#34;images/7ddbc930-istio-5.png&#34; alt=&#34;apply -f yaml&#34; /&gt;&lt;/p&gt;

&lt;p&gt;配置 Istio 路由之前，首先检查一下应用的版本。可以使用端口转发的方式来访问 Pod。&lt;/p&gt;

&lt;p&gt;要访问应用的 &lt;code&gt;v1&lt;/code&gt; 版本，可以运行下面的命令，然后访问 &lt;code&gt;localhost:8080&lt;/code&gt;，验证完成之后，按 &lt;code&gt;CTRL+C&lt;/code&gt; 结束端口映射命令。&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;kubectl port-forward deployment/myapp-v1 8080:80
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;img src=&#34;images/b5088c7c-istio-6-300x183.png&#34; alt=&#34;app image blue&#34; /&gt;&lt;/p&gt;

&lt;p&gt;要访问应用的 &lt;code&gt;v2&lt;/code&gt; 版本，可以运行下面的命令，然后访问 &lt;code&gt;localhost:8081&lt;/code&gt;，验证完成之后，按 &lt;code&gt;CTRL+C&lt;/code&gt; 结束端口映射命令。&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;kubectl port-forward deployment/myapp-v2 8081:80
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;img src=&#34;images/a187169b-istio-7-300x183.png&#34; alt=&#34;app image green&#34; /&gt;&lt;/p&gt;

&lt;h2 id=&#34;步骤-4-配置蓝绿部署&#34;&gt;步骤 4：配置蓝绿部署&lt;/h2&gt;

&lt;p&gt;我们的目标是在不停机的情况下，让流量选择性的进入某一版本。为了完成这一目的，就需要告知 Istio 根据权重进行路由。完成这一任务需要三个对象：&lt;/p&gt;

&lt;h3 id=&#34;gateway&#34;&gt;Gateway&lt;/h3&gt;

&lt;p&gt;Istio Gateway 描述了网格边缘的负载均衡组件，用于 HTTP/TCP 连接的接收和发出。定义中包含一组要开放的端口、使用的协议、负载均衡的 SNI 等。下面的定义中我们将 Gateway 指向 Istio 部署过程中建立的缺省的 Ingress Gategeway。&lt;/p&gt;

&lt;p&gt;用 Kubernetes 的方式创建 Gateway 对象：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: app-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - &amp;quot;*&amp;quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;目标规则&#34;&gt;目标规则&lt;/h3&gt;

&lt;p&gt;Istio &lt;code&gt;DestinationRule&lt;/code&gt; 定义了在一个服务成为路由目标之后的行为。注意一下这一规则中是如何通过标签来对 Kubernetes 的原生 Deployment 进行区分的：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: myapp
spec:
  host: myapp
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;虚拟服务&#34;&gt;虚拟服务&lt;/h3&gt;

&lt;p&gt;虚拟服务中定义了一组流量路由规则，在其中的 &lt;code&gt;host&lt;/code&gt; 被访问时就会触发。每个路由规则中都定义了对某一协议进行匹配的标准。如果流量匹配这一标准，那么就发送给对应的区分了版本的目标服务。&lt;/p&gt;

&lt;p&gt;下面的定义中我们定义两个版本的服务权重都是 50，也就是说流量会在版本间进行平均分配：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: myapp
spec:
  hosts:
  - &amp;quot;*&amp;quot;
  gateways:
  - app-gateway
  http:
    - route:
      - destination:
          host: myapp
          subset: v1
        weight: 50
      - destination:
          host: myapp
          subset: v2
        weight: 50
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;所有这些都可以定义在同一个 YAML 文件中，然后用 &lt;code&gt;kubectl&lt;/code&gt; 提交给集群，同样可以在 &lt;a href=&#34;https://gist.github.com/janakiramm/35078d95730745caa62f81d917d6d553&#34; target=&#34;_blank&#34;&gt;Gtihub&lt;/a&gt; 中获取这一文件。&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;kubectl apply -f app-gateway.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;img src=&#34;images/b64331f6-istio-8-300x75.png&#34; alt=&#34;app gateway&#34; /&gt;&lt;/p&gt;

&lt;p&gt;接下来就可以尝试访问这一服务了。因为我们使用的是 NodePort 模式的服务，所以就需要首先判断一下 Ingress Gateway 所在的端口。&lt;/p&gt;

&lt;p&gt;运行下面的命令来访问 MiniKube 的 Ingress 端口。&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;$ export INGRESS_HOST=$(minikube ip)

$ export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath=&#39;{.spec.ports[?(@.name==&amp;quot;http2&amp;quot;)].nodePort}&#39;)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;从浏览器访问这个 URL，会看到流量被均等的在蓝色和绿色版本之间进行分配。&lt;/p&gt;

&lt;p&gt;也可以在终端里面查看命令结果。运行下面的命令会看到 V1 和 V2 的响应：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;while : ;do export GREP_COLOR=&#39;1;33&#39;;curl -s  192.168.99.100:31380 \
 |  grep --color=always &amp;quot;V1&amp;quot; ; export GREP_COLOR=&#39;1;36&#39;;\
 curl -s  192.168.99.100:31380 \
 | grep --color=always &amp;quot;vNext&amp;quot; ; sleep 1; done
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;img src=&#34;images/840d897c-istio-9-1024x674.png&#34; alt=&#34;curl&#34; /&gt;&lt;/p&gt;

&lt;p&gt;上面的命令会循环运行，我们可以返回编辑 &lt;code&gt;gateway.yaml&lt;/code&gt;，修改其中的权重分配。把 V1 的权重设置为 0，V2 的权重设置为 100.&lt;/p&gt;

&lt;p&gt;把新的定义提交到 Istio。&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;$ istioctl replace -f app-gateway.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;img src=&#34;images/0b6f6f9e-istio-10-300x59.png&#34; alt=&#34;replace&#34; /&gt;&lt;/p&gt;

&lt;p&gt;更新权重之后，V2 的响应比例会提升到 100%。这一结果会体现在输出之中：&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;images/82d4e75d-istio-11.png&#34; alt=&#34;v2-100%&#34; /&gt;&lt;/p&gt;

&lt;p&gt;可以继续对权重进行修改，查看路由的动态变化过程。&lt;/p&gt;

&lt;p&gt;流量管理只是 Istio 的一个功能，后续文章中尝试更多其他特性。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Deploy 的基本用法</title>
      <link>/post/deploy-module-in-drupal-basic/</link>
      <pubDate>Thu, 13 Aug 2015 23:48:37 +0800</pubDate>
      <guid>/post/deploy-module-in-drupal-basic/</guid>
      <description>

&lt;p&gt;在这个演示中，我们会创建和部署一个新的 Node，然后发布一个针对该 Node 的更新。&lt;/p&gt;

&lt;h2 id=&#34;部署&#34;&gt;部署&lt;/h2&gt;

&lt;p&gt;一次部署分为两个阶段：把内容添加到部署计划，发布部署计划。部署计划的发布将内容添加到目标服务器。&lt;/p&gt;

&lt;h2 id=&#34;部署计划&#34;&gt;部署计划&lt;/h2&gt;

&lt;p&gt;一个部署计划包含一组将要发布到目标服务器上的内容。这些内容可以手工添加到部署计划中，也可以使用 Views 聚合或者 Rules 进行自动化操作。&lt;/p&gt;

&lt;h3 id=&#34;手工添加内容&#34;&gt;手工添加内容&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;在源服务器进入&lt;code&gt;node/add/article&lt;/code&gt;，创建一个新的 Article。然后随便选一些选项并保存。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;进入&lt;code&gt;admin/content/node&lt;/code&gt;，查看刚新建的 Node，从 Update options 中，&lt;code&gt;Add to managed deployment plan&lt;/code&gt;下选择部署计划，点击 Update 按钮，然后在其他需要添加的内容上做同样的操作。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;要发布这个计划，进入&lt;code&gt;admin/structure/deploy&lt;/code&gt;然后点击 Deploy 连接，点击 Deploy 按钮进行确认。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;在源服务器上运行Cron（这是因为在 Deploy 安装指南中选择 Queue API 作为 Deployment 处理器）。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;编辑步骤1中提到的Node并保存。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;重复第二和第三步。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;在源服务器上运行Cron。&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;注：可以在 &lt;code&gt;admin/reports/dblog&lt;/code&gt;  上查看部署消息。&lt;/p&gt;

&lt;h3 id=&#34;自动部署计划&#34;&gt;自动部署计划&lt;/h3&gt;

&lt;p&gt;上文中我们通过手工添加内容到部署计划的方式发布了一个Node，接下来我们看看更自动化的方式。&lt;/p&gt;

&lt;h3 id=&#34;views-aggregation&#34;&gt;Views Aggregation&lt;/h3&gt;

&lt;p&gt;确认你完成了 &lt;a href=&#34;http://drupal.org/node/1406134&#34; target=&#34;_blank&#34;&gt;Deploy 安装&lt;/a&gt;中的所有步骤。我们要创建一个 Views Aggregator（和一个 View），而不是用一个 Managed aggregator。&lt;/p&gt;

&lt;p&gt;在源服务器：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;启用如下模块：Views deployment aggregator&lt;/p&gt;

&lt;p&gt;drush en deploy_aggregator_views&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;创建一个包含你想要添加到 Deployment plan 中的内容的 View（也可以直接使用首页 View）。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;接下来，利用 Views aggragator 创建一个部署计划：进入&lt;code&gt;admin/structure/deploy/plans&lt;/code&gt;，点击&amp;rdquo;Add&amp;rdquo;。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;给计划命名，例如 &amp;ldquo;Push to live server&amp;rdquo;。Aggregator 选择 Views aggregator；清空 Fetch only 选项；Deploy processor 使用 Queue API；Endpoints 设置为 &lt;a href=&#34;http://drupal.org/node/1406134&#34; target=&#34;_blank&#34;&gt;Deploy 安装&lt;/a&gt;中的设置内容。点击 &amp;ldquo;Continue&amp;rdquo; 进入下一步。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;选择刚才新建的 Aggregator View（或者选择缺省的首页视图）。&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;code&gt;admin/structure/deploy&lt;/code&gt;点击 Deploy 连接，确认发布。&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;所有出现在指定视图中的内容都会被添加到部署计划中。创建视图之后发布的内容也会包含进来。如果有内容在发布的同时进入该视图，那么他会被加入部署计划，并推送到目标服务器。&lt;/p&gt;

&lt;h2 id=&#34;rule-actions&#34;&gt;Rule Actions&lt;/h2&gt;

&lt;h3 id=&#34;在源服务器上&#34;&gt;在源服务器上：&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;确认按照&lt;a href=&#34;http://drupal.org/node/1406134&#34; target=&#34;_blank&#34;&gt;Installing Deploy&lt;/a&gt;中讲到的方法创建一个Managed aggregator，记住点击&amp;rdquo;Delete successfully deployed items(删除发布成功的内容)&amp;ldquo;。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;下载&lt;a href=&#34;http://drupal.org/project/rules&#34; target=&#34;_blank&#34;&gt;Rules&lt;/a&gt;模块。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;drush dl rules
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;启用Rules以及Rules UI模块。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;drush en rules rules_admin
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;进入 &lt;code&gt;admin/config/workflow/rules&lt;/code&gt;，点击 &lt;code&gt;Add new rule&lt;/code&gt;。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;输入 &lt;code&gt;Content to Deployment plan&lt;/code&gt; ，或者其他什么名字，在 &lt;code&gt;React on event&lt;/code&gt; 中选择&lt;code&gt;After saveing new content&lt;/code&gt; (新建内容之后)（这个选项位于 Node 的下级）。点击&lt;code&gt;Add&lt;/code&gt;。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;点击 &lt;code&gt;Add Event&lt;/code&gt;（添加事件）。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;选择 &lt;code&gt;After updating existing content&lt;/code&gt; (更新现有内容)，点击&lt;code&gt;Add&lt;/code&gt;。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;点击 &lt;code&gt;Add Condition&lt;/code&gt;(添加条件).&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;在 &lt;code&gt;Select the condition to add&lt;/code&gt; 中选择 &lt;code&gt;Content is of type&lt;/code&gt;(内容属于某类)。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;在 Data Selector 中选择 Node，并在 Content type 检查条件中选择 Article。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;点击 &lt;code&gt;Add action&lt;/code&gt;。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;在 &lt;code&gt;Select the action to add&lt;/code&gt; 中选择 &lt;code&gt;Add an entity to a managed deployment plan&lt;/code&gt;。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;在 Value 中选择之前创建的 Managed aggregator 计划，在 Data Selector 中选择 node，点击 Save。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;在 &lt;code&gt;node/add/article&lt;/code&gt; 中创建新的 Article。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;进入 &lt;code&gt;admin/structure/deploy&lt;/code&gt;，可以看到刚创建的 Article 已经在第 13 步中的计划之中了。现在开始，所有新创建和更新的 Articles 都会被自动加入部署计划。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;要发布计划，进入 &lt;code&gt;adimin/structure/deploy&lt;/code&gt;，点击 &amp;ldquo;Deploy&amp;rdquo; 按钮，然后利用 &amp;ldquo;Deploy&amp;rdquo; 按钮确认。&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;另外，要把部署计划做成自动化部署，可以添加一个 Rule Action &amp;ldquo;Deploy a plan&amp;rdquo;，使得每次 Aticle 的创建和编辑都触发部署计划的发布。这种做法并不推荐。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>使用Deploy和Features导出Entities</title>
      <link>/post/drupal-export-entity-with-deploy-and-features/</link>
      <pubDate>Thu, 13 Aug 2015 23:48:21 +0800</pubDate>
      <guid>/post/drupal-export-entity-with-deploy-and-features/</guid>
      <description>&lt;p&gt;Deploy Module可以把任何支持UUID的Entity导出到Features中。这个功能在创建安装范本或演示时非常有用，或者用于处理一些既非配置，也非内容的对象。&lt;/p&gt;

&lt;p&gt;使用Deploy导出内容：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&#34;http://drupal.org/node/1406134&#34; target=&#34;_blank&#34;&gt;安装Deploy&lt;/a&gt;和&lt;a href=&#34;http://drupal.org/project/features&#34; target=&#34;_blank&#34;&gt;Features&lt;/a&gt;。如果不需要使用Deploy进行Drupal站点之间的内容同步，知识想要导出到Features的话，就无需关心Service Module的安装了。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;进入&lt;code&gt;admin/structure/deploy/plans/add&lt;/code&gt;建立一个新的部署计划。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;选择聚合方式，参考&lt;a href=&#34;http://drupal.org/node/1406136&#34; target=&#34;_blank&#34;&gt;Deploy基础用法&lt;/a&gt;，来获取关于将内容加入部署计划的不同方法。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;选择&lt;code&gt;Fetch only&lt;/code&gt;，因为我们不需要部署处理，也不需要服务节点，而且没有选择这个选项的话，部署计划也不会出现在Features界面中。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;进入&lt;code&gt;admin/structure/features/create&lt;/code&gt;菜单。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;在&lt;code&gt;Deployment(deploy_pnas)&lt;/code&gt;中，为新建的部署计划选择组件。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;在&lt;code&gt;UUID Entities(uuid_entities)&lt;/code&gt;中，会发现一个和部署计划同名的组件，选择之。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;注意，上文提到的选择，不会自动提供对内容类型、字段、模块等依赖关系的处理。所以要清楚导出内容的外部依赖。如果只是导出内容到相似或相同的站点，或者利用其他的Features来解决依赖关系，最好只导出部署计划以及相关的Entity组件。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;需要导出的内容需要支持UUID。&lt;a href=&#34;http://drupal.org/project/entity_uuid&#34; target=&#34;_blank&#34;&gt;Entity UUID&lt;/a&gt;项目为非核心Entity提供了支持。要给Commerce Entity提供UUID支持，可移步到&lt;a href=&#34;http://drupal.org/project/commerce_uuid&#34; target=&#34;_blank&#34;&gt;Commerce UUID&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;变通做法：&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;http://drupal.org/project/uuid_features&#34; target=&#34;_blank&#34;&gt;UUID Features Integration&lt;/a&gt;模块提供了一种简单的导出内容到Features的方式，不过她主要支持的是核心Entity。使用Deploy，只要有UUID支持的Entity都是可导出的。如果你只是想要导出核心Entity，那么这种无需更多配置的方式可能更简单。&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
