fourkitchens/project_ci

此包已被废弃且不再维护。作者建议使用 fourkitchens/pots 包。

推送到站点。用于帮助部署 Drupal 站点的脚本。

安装次数: 15,197

依赖项: 0

推荐者: 0

安全性: 0

星级: 0

关注者: 13

分支: 2

开放问题: 28

语言:Shell

0.5.8 2024-09-16 13:37 UTC

README

此 Composer 包提供了在 Acquia 等托管平台上测试和部署网站所需的基础。

目录

升级

如果您使用的是此包中包含的标准脚本,则升级应该更简单。每次版本升级时,您都应该检查您的 .circleci/config.yml 文件与这里的 config.yml 文件之间的更改。

为此,最简单的方法是使用标准化的 diff 工具,并使用 diff .circleci/config.ymlconfig.yml。一个示例可能如下所示

diff -u --color .circleci/config.yml ./vendor/fourkitchens/pots/config.yml

验证更改并移动您想要保留的更改。

依赖项

此包期望您的项目具有以下支持框架以运行即用

  • composer 脚本 lint 和 code-sniff。示例
     "scripts": {
        "lint": [
           "./node_modules/.bin/eslint ./",
           "find web/modules/custom web/themes/custom \\( -iname  '*.php' -o -iname '*.inc' -o -iname '*.module' -o -iname '*.install'-o -iname '*.theme' \\) '!' -path '*/node_modules/*' -print0 | xargs -0 -n1 -P8 php -l"
        ],
        "code-sniff": [
           "./vendor/bin/phpcs"
        ]
     }
    
  • 包含构建主题脚本的 package.json。示例
       "scripts": {
          "theme-build": "cd ./docroot/themes/custom/sdsu && npm run build"
       }
    
  • package.lock 或 shrinkwrap。
  • 最好有一个 .nvmrc
  • .gitignore 文件中有剪断行,用于区分源代码和工件。以下是一个示例 .gitignore

Circle 任务设置假设您使用机器人用户执行此操作。请确保您使用的机器人用户在您的网站所在的 GitHub 组织和托管提供商上都有账户。您需要

  • 作为机器人用户在 GitHub 和托管提供商上登录的能力
  • SSH 密钥(私钥和公钥)
  • 托管工具的 API 或机器令牌,例如 terminus 或 acli

安装

  1. 安装此包并复制模板 config.yml

    composer require fourkitchens/pots
    mkdir .circleci
    cp vendor/fourkitchens/pots/config.yml .circleci/config.yml
    
  2. 确保您的 composer.json 和 package.json 符合默认脚本的要求数据。

  3. 将更改推送到公开的 GitHub 分支。

  4. 登录到 https://app.circleci.com/

  5. 通过点击左上角您的名字处的图标并选择正确的选项,导航到您的网站代码所在的组织。

  6. 导航到“项目”

  7. 找到您网站的存储库名称

  8. 点击旁边的“设置项目”按钮

  9. 选择最快的

  10. 在对话框中的“git branch”图标处输入您推送到分支的名称。

  11. 验证扳手图标变为绿色,并告知您找到了 config.json。

  12. 点击“设置项目”。

第一次尝试总是会失败。转到配置步骤。

配置环境

某些配置步骤在托管环境中是共享的。请确保检查您推送到该环境的特定设置。

共享

部署机器人设置

需要一个 Deploy Bot 用户。此工具假定 Bender(Four Kitchens 的部署机器人)为默认设置,但不会提供您设置工具所需的任何凭据。向 Web Chef 询问 Bender,让您正在合作的组织创建一个新的机器人,或者按照以下步骤为他们创建新的机器人。您需要以该机器人的身份登录以进行一些配置。

为部署机器人创建 GitHub 账户
  1. 打开一个新的浏览器实例或从您当前的 GitHub 实例登出。
  2. 转到 https://github.com/join
  3. 输入用户名、您的电子邮件地址和密码。注意:确保您输入的电子邮件地址指向一个真实的电子邮件账户。如果您使用 Gmail,您可以使用电子邮件中的“+”来创建多个指向同一账户的“地址”。请参阅如何 创建特定任务的电子邮件地址
  4. 选择“注册 GitHub”,然后按照说明操作。
  5. 安全地向客户端提供凭据。
  6. 在新浏览器实例中,以拥有该网站的组织的管理员身份,邀请机器人用户加入组织

配置 SSH 密钥

需要一个 SSH 密钥,才能从 circleci 推送提交到托管提供商的 git 仓库。在某些情况下,相同的 SSH 密钥也需要用于能够通过 ssh 登录到托管平台。请客户生成 SSH 密钥对或生成并安全地向客户提供 SSH 密钥对。

  1. 登录到 https://app.circleci.com/
  2. 通过点击左上角您的名字处的图标并选择正确的选项,导航到您的网站代码所在的组织。
  3. 导航到“项目”
  4. 找到您网站的仓库名称,并点击它。
  5. 验证您是否看到了失败的流程。
  6. 点击“项目设置”。
  7. 点击“SSH 密钥”。
  8. 导航到“其他 SSH 密钥”。
  9. 点击“添加 SSH 密钥”。
  10. 将提供给您的机器人用户的私有 SSH 密钥的内容复制到出现的对话框中的“私有密钥”字段。
  11. 确保您没有多余的空格或换行符。
  12. 点击“添加 SSH 密钥”关闭对话框并接受更改。
  13. 注意指纹以供将来使用。注意:您可以通过验证 circleci 中的指纹与命令 ssh-keygen -l -E md5 -f id_rsa 显示的内容相同来检查文件是否正确复制,其中 idrsa 是您的密钥的文件名。

获取 Github 令牌

您必须有一个 GitHub 令牌,以便 Deploy Bot 可以将评论发布到提交或拉取请求。这允许它提供有关它创建的环境的链接和信息。

如果您跳到了这里,请确保您遵循“配置 SSH 密钥”中的步骤 1-6,以到达 Circle 的项目设置。

  1. 在新浏览器实例中,以 Deploy Bot 身份登录 GitHub。
  2. 遵循 创建个人访问令牌 的说明。
  3. 选择“完整仓库访问”选项。
  4. 安全地保存访问令牌,以便您可以访问它。它只会显示一次。

配置环境变量

在此处,您将配置通用环境变量。特定于托管的变量和步骤将在下面提供。要配置的变量如下。

  • GITHUB_TOKEN GitHub访问令牌,以便机器人用户可以在提交上回复评论。
  • GIT_EMAIL 用于构建工件时的提交者使用的任意电子邮件。
  • CANONICAL_ENV 获取规范数据库和文件的 环境。

如果您跳到了这里,请确保您遵循“配置 SSH 密钥”中的步骤 1-6,以到达 Circle 的项目设置。

  1. 切换回您的浏览器实例,其中您已登录到CircleCI -> 项目设置
  2. 在左侧单击“环境变量”。
  3. 单击“添加环境变量”。
  4. 在名称中输入“GITHUB_TOKEN”。
  5. 将令牌值复制到“值”中。
  6. 单击“添加环境变量”以接受更改。
  7. 单击“添加环境变量”。
  8. 在名称中输入“GIT_EMAIL”。
  9. 将与部署机器人关联的电子邮件地址输入到“值”中。
  10. 单击“添加环境变量”以接受更改。

Pantheon

  • SITE_NAME:用于运行terminus命令的Pantheon站点ID。
  • TERMINUS_TOKEN:用于操作terminus的Pantheon机器令牌。

为部署机器人创建 Pantheon 账户

对于Pantheon托管站点,我们需要为我们的部署机器人创建一个账户,以便我们的部署与任何Pantheon用户关联。

  1. 以您的Pantheon组织管理员身份登录。
  2. 在仪表板右上角单击您的用户名。
  3. 导航到您想要创建用户的组织名称。
  4. 单击“人员”选项卡。
  5. 单击“添加用户”按钮。
  6. 选择“团队成员”作为角色。
  7. 添加您之前为GitHub账户创建的相同电子邮件地址。
  8. 单击“添加用户”。
  9. 在新的浏览器实例中,检查与该用户关联的电子邮件。
  10. 接受邀请。

设置 SSH 密钥

您的机器人需要一个配置好的ssh密钥,以便能够将提交推送到Pantheon。使用“配置SSH密钥”部分生成的密钥对中的公钥。

从您的Pantheon账户登出或使用单独的浏览器实例,按照Pantheon的说明将您的SSH密钥添加到Pantheon

获取 Terminus 令牌(或机器令牌)

  1. 在上述相同的浏览器实例中,按照Pantheon的说明创建机器令牌
  2. 安全地保存机器令牌,以便您可以使用它。它只会显示一次。

配置更多 CircleCi 环境变量

  1. 导航回您的CircleCI -> 项目设置 -> 环境变量浏览器实例。
  2. 单击“添加环境变量”。
  3. 在名称中输入“SITE_NAME”。
  4. 将您的Pantheon站点的站点ID(或TERMINUS SITE ID)输入到“值”中。注意:您可以在Pantheon中查看站点的仪表板以找到站点ID。如果您点击任何环境的“访问站点”按钮,则url的格式为https://{{TERMINUS ENV}}-{{TERMINUS SITE}}.pantheonsite.io/
  5. 单击“添加环境变量”以接受更改。
  6. 单击“添加环境变量”。
  7. 在名称中输入“TERMINUS_TOKEN”。
  8. 将您之前保存的机器令牌值复制到“值”中。
  9. 单击“添加环境变量”以接受更改。

Acquia

  • SITE_NAME:用于运行Acquia Cloud API命令的Acquia站点ID。
  • ACQUIA_REALM:Cloud API领域。通常是“prod”或“devcloud”。
  • ACQUIA_REPO:Acquia git仓库。

为部署机器人创建 Acquia 账户

待办事项:填写此部分

设置 SSH 密钥

您的机器人需要一个配置好的ssh密钥,以便能够将提交推送到Acquia。使用“配置SSH密钥”部分生成的密钥对中的公钥。

从您的Acquia账户登出或使用单独的浏览器实例,按照Acquia的说明向Acquia配置文件添加公钥

配置更多 CircleCi 环境变量

  1. 导航回您的CircleCI -> 项目设置 -> 环境变量浏览器实例。
  2. 单击“添加环境变量”。
  3. 在名称中输入“ACQUIA_REPO”。
  4. 将Acquia仓库url输入到“值”中。待办事项:更详细地说明如何获取它
  5. 单击“添加环境变量”以接受更改。
  6. 单击“添加环境变量”。
  7. 在名称中输入“ACQUIA_REALM”。
  8. 将Acquia领域ID输入到“值”中。待办事项:更详细地说明如何获取它
  9. 单击“添加环境变量”以接受更改。
  10. 单击“添加环境变量”。
  11. 在名称中输入“SITE_NAME”。
  12. 将Acquia站点ID复制到“值”中。待办:提供更多获取方法
  13. 单击“添加环境变量”以接受更改。
  14. 单击“添加环境变量”。
  15. 在名称中输入“ZD_REQUESTER_ID”。
  16. 将客户端请求者ID输入到“值”中。用户ID可以从用户的URL中获得。例如:https://advomatic.zendesk.com/agent/users/378771022972/requested_tickets
  17. 单击“添加环境变量”以接受更改。
  18. 单击“添加环境变量”。
  19. 在名称中输入“ZD_TOKEN”。
  20. 将Zendesk令牌值ID输入到“值”中。此令牌存储在1password中。
  21. 单击“添加环境变量”以接受更改。
  22. 单击“添加环境变量”。
  23. 在名称中输入“ZD_LEAD_EMAIL”。
  24. 将项目负责人电子邮件值ID输入到“值”中。这是项目负责人的电子邮件。
  25. 单击“添加环境变量”以接受更改。

配置 CircleCI config.yml

您有多种选项,其中一些是共享的,一些是特定于托管。

管道参数默认值

目前,您可以通过设置一些管道参数默认值来配置整个脚本。这些可以通过API调用(高级用法)进行更改,但在您直接向存储您的.circleci/config.yml文件的仓库提交拉取请求或提交时,将使用默认值。

在每一个中,更改default:键后面的值。例如,要更改整个项目的docroot,更改

  docroot:
    description: "Where composer installs drupal."
    default: "web"
    type: string

  docroot:
    description: "Where composer installs drupal."
    default: "docroot" #NOTE I CHANGED THIS
    type: string

以下参数存在

php-version

这是一个表示整个构建中使用的PHP版本号的字符串。

如果您使用Pantheon作为主机变体,则这只能是一个主要版本号,例如"8.1",因为Pantheon Docker容器只允许两位数的版本。

在其他托管平台上,您可以使用三位数的版本号(主要版本.次要版本.补丁),例如如果需要,可以使用"8.1.4",但是允许两位数。

tz

这是一个表示时区的字符串。这可能很重要,因为这样就可以确保执行时间计算、打印时间戳或提交的作业是准确的。请参阅时区值的完整列表,以找到适合您使用的时区。

host-variant

这影响整个构建的行为以及您可用的配置。当前选项是“pantheon”、“acquia”和“general”。我们所有的工作流程都将提供您“工件构建”,并提交适当的存储库。这允许您使用Git历史记录将构建回溯到我们在开发中使用的源提交。

pantheon

Pantheon为您提供构建多开发环境的流程,有关开发分支的选项,以及通过CircleCI用户界面审批部署代码的流程。此设置提供的部署过程使用Pantheon的TerminusBuild Tools插件来创建工件构建。这些更改仅提交到Pantheon的git存储库,而不是您的“源存储库”,即在您进行编码更改时创建的存储库。

acquia

Acquia为您提供一个非常基础的流程,但是它确实提供了构建过程中的一部分acquia cli。这允许您使用支持部署方法,如我们的cloud hooks来简化部署过程。对于多开发功能,建议使用tugboat。这些设置提供的部署过程使用一些标准git命令创建工件构建。这些更改仅提交到Acquia的git存储库,而不是您的“源存储库”,即在您进行编码更改时创建的存储库。

general

“General”为您提供了最基本的部署,将工件构建提交到源存储库下的新分支,该分支遵循命名约定deploy-{BRANCHNAME}。例如,如果您的分支名称为test,您将在deploy-test分支中有一个工件构建提交。

docroot

此设置应设置为您的Drupal安装所在文件夹。这应该与extra.drupal-scaffold.locations.web-root中的设置相匹配。这通常是Pantheon的web或Acquia的docroot,但也可能是像public_html这样的通用主机上的任何东西。

artifact_workspace

此设置移动构建工件的位置。当您想从构建中选择项目,而不是将整个工件发送到主机时,这尤其有用。~/project目录始终提交到“工件构建”。因此,通过将此目录更改为类似/tmp/project的东西,您可以使用rsync将先前构建脚本构建的部分移动到~/project。默认情况下,此设置的值是~/project,因此所有在“构建”作业期间构建的内容都会推送到主机。

其他配置

有一些配置无法通过API调用进行更改,如果您想临时或永久更改它们,则需要直接修改config.yml。

persisting_dirs

这些目录将从工作流程的构建部分完整复制到部署部分。您可能还想包括像node_modulessimplesamlprivate这样的其他根目录。我们排除大多数顶级目录,因为它们在托管系统本身中不需要。

可配置环境变量

可以使用CircleCI环境变量界面配置环境变量,或者您可以直接在.circleci/config.yml中设置它们。在界面中更改它们会使升级.circleci/config.yml时出现的问题更少,但它会隐藏您可能正在使用的某些开关。根据最佳实践,请确保任何密钥都在CircleCI UI中配置。我们还将所有必需的环境变量以此方式包含在内。

共享

  • GITHUB_TOKEN必需 GitHub访问令牌,以便机器人用户可以对提交或PR进行评论,并删除不需要的多开发版本。

  • SITE_NAME:用于运行terminus/acli命令的Pantheon或Acquia站点ID。默认为GitHub存储库名称。

  • GIT_EMAIL:用作构建工件提交者的任意电子邮件。默认为bender@fourkitchens.com

  • CANONICAL_ENV:从中获取规范数据库和文件的环境。可能的值

    • Acquia:dev、test、prod
    • Pantheon:dev、test、live

    默认值:在Acquia上为“prod”。在Pantheon上为“live”

  • SANITIZE_SCRIPT:用于清理数据库的脚本。仅在CANONICAL_ENV不是dev时使用。没有默认值。

  • SYNC_CONFIG:启用或关闭配置同步的能力。默认情况下,如果./config目录(包括)中的任何目录包含system.site.yml,则为是。例如:如果存在./config/system.site.yml./config/default/system.site.yml./config/sync/system.site.yml,则为是。可能的值是YESNO

Pantheon 专用

  • TERMINUS_TOKEN必需 Pantheon机器令牌。
  • CI_BUILD:在Pantheon上的每次提交上构建CI多开发版本。这样您就可以得到ci-*环境。这可能对视觉回归测试或没有PR的工作流程很有用。默认值为NO。可能的值是YESNO
  • MAIN_BRANCH:定义从哪个主分支切割发布。如果分支存在,默认值为main,否则为master
  • DEVELOPMENT_BRANCH:定义在GitHub上发生积极开发的开发分支。此分支在gitflow开发模式中使用得最多。默认值为develop
  • REBUILD_MULTIDEV_ENV_EVERY_PUSH:每次将内容推送到Pantheon时,都会重新同步多开发版本的内容。默认值为NO。可能的值是YESNO
  • REBUILD_DEVELOPMENT_ENV_EVERY_PUSH:每次将内容推送到DEVELOPMENT_BRANCH分支时,都会重新同步GitHub开发多开发版本的内容。默认值为NO。可能的值是YESNO
  • DEVELOPMENT_ENV:定义用于GitHub开发分支的多环境名称。必须遵循Pantheon的多环境命名规范。默认为github-dev

Acquia 专用

  • ACQUIA_REPO必填 Acquia git仓库地址。例如:sitename@svn-21939.prod.hosting.acquia.com:sitename.git
  • ACQUIA_REALM必填 Acquia Cloud API域。通常是"prod"或"devcloud"。见文档。默认为prod

辅助环境变量

这些环境变量不可配置。它们被设置为帮助您在自己的环境中开发脚本。其中一些包含之前提到的管道参数的值。

  • HOST_VARIANT:包含由host-variant管道参数提供的值。
  • DATE_TIMEZONE:包含由tz管道参数提供的值。
  • DOCROOT:包含由docroot管道参数提供的值。
  • TERM:"xterm"。

配置 composer.json

有两个脚本,默认脚本需要您构建,以便在整个项目中重复使用。您必须在项目中能够运行以下命令。

composer run lint
composer run code-sniff

请参阅依赖关系部分以获取示例。

配置脚本

此框架提供的几乎所有操作都是可重载的。只需在.circleci/scripts的正确位置提供一个脚本,您就可以使此工具执行任何所需的步骤。我们在本存储库的脚本部分提供了一个默认的操作集,您可以基于这些操作编写自定义脚本。

可重载的脚本如下

  • test/static:提供静态代码测试,如代码风格检查和代码标准验证。默认情况下,它运行composer run lint; composer run code-sniff
  • build/php:提供构建应用程序的功能。默认情况下,这只是优化一个已准备好的依赖项安装。
  • build/theme:提供构建自定义主题的功能。默认情况下,它运行npm run theme-build并遍历$DOCROOT/themes/custom,对每个.gitignore执行“cut”操作,因此您可以在编码时提供一个应忽略的项目列表,以及构建工件时忽略的项目列表。
  • deploy:将工件构建推送到远程托管环境的所有操作。在Pantheon上,这包括创建和构建多环境。在Acquia和通用托管上,这仅将工件代码推送到其应存在的仓库。

Pantheon 专用脚本

  • drush-commands:提供基本的部署drush命令,用于运行更新钩子、清除缓存和同步配置。
  • drush-config-import:提供导入配置的命令。默认情况下,这提供了drupal 8+的命令,如drush cim,但可以替换为类似drush fra的东西,如果使用drupal 7或具有基于功能的网站配置设置。
  • post-drush-commands:某些网站可能需要更改外部系统,如solr、第三方缓存,或希望运行drush deploy:hook以允许drush运行某些后部署清理代码HOOK_deploy_NAME()。见Drush文档
  • deploy-to-test:提供将更改部署到预发布环境的逻辑。默认情况下,它提供“部署”服务,将实时同步到测试环境,并进行标准部署。
  • deploy-to-live:提供将更改部署到生产环境的逻辑。默认情况下,它提供备份服务、“部署”服务以及标准部署。

自动安全更新。

POTS包含自动查找安全更新并将它们安装到不同贡献项目的步骤和脚本。

这个项目是利用CircleCI管道参数触发的CI作业来运行检查和安全更新的脚本构建的。

为了能够重复触发,我们有几种选择

  • Evercurrent(推荐)
  • CircleCi触发接口

为了使自动安全更新适用于我们的项目,我们需要按照以下步骤操作

  • 创建一组新的SSH密钥,以便将更改推回GitHub(GitHub部署密钥)
  • 配置Zendesk集成(环境变量 - 已在顶部文档化)
  • (可选)配置IA集成(Open IA)

设置密钥的步骤

当在项目上配置持续集成时,CircleCI会生成一组SSH密钥,并将私钥自动添加到CircleCI,公钥添加到GitHub。这样,CircleCI将能够访问GitHub上的仓库,但这种访问只是只读的。最初,对于POTS,这种访问就足够了,因为它只需要读取GitHub上的仓库,并在托管网站的平台(Acquia、Pantheon、Platform等)上写入。

随着AutoSec的到来,这组SSH密钥不再足够,因为AutoSec需要读取仓库、执行安全更新并将更改发送到GitHub,因此从AutoSec开始,需要具有读写权限的密钥。CircleCI不能生成具有写入权限的密钥,因此需要外部创建一组SSH密钥并将其手动添加到CircleCI和GitHub。

  1. 密钥可以通过在控制台通过此指南中的命令生成,或者也可以通过1password生成。
  2. 将私钥添加到CircleCI:在“项目设置 -> SSH密钥 -> 其他SSH密钥”中操作。
  3. 将公钥添加到GitHub:在“项目设置 -> 部署密钥”中操作。

设置 IA 密钥的步骤

AutoSec已开发用于使用IA并获取其自动更新的软件包的一些功能测试。这些步骤已添加到PR文档中,从而为执行测试的开发者提供重要信息。

AI实现是通过ChatGPT API完成的,因此需要生成并添加到CircleCI中的一个密钥。重要的是要说明,使用此密钥每次请求都有成本,因此配置此密钥是完全可选的,系统是制作来检查是否配置了密钥,它向ChatGPT请求步骤,如果没有配置密钥,它不会进行任何请求。

  1. 生成新的API密钥,导航到OpenIA页面并登录,选择API控制台。
  2. 在左侧边栏中导航到“API密钥”(悬停在OpenIA标志上)。
  3. 单击“创建新秘密密钥”按钮并复制哈希码。
  4. 将API密钥添加到CircleCI,导航:在“项目设置 -> SSH密钥 -> 环境变量”中操作。
  5. 单击“添加环境变量”按钮。
  6. 变量名必须是:OPENAI_API_KEY,并将步骤3中复制的哈希码粘贴到值中。