如何连接 GitLab 和 Pantheon 并优化 Drupal 和 WordPress 工作流程

如何连接 GitLab 和 Pantheon 并优化 Drupal 和 WordPress 工作流程
我们 Pantheon 的客座开发人员工具创建者谈论如何使用 GitLab CI/CD 自动化 WordPress 部署。

В 万神殿 我从事开发人员关系工作,因此我一直在寻找新方法来帮助 WordPress 和 Drupal 开发人员解决工作流程中的自动化问题。 为此,我喜欢尝试新工具并将它们相互结合以有效地工作。

我经常看到开发人员在单个临时服务器上苦苦挣扎。

等待轮到您使用中间服务器或向客户端发送带有注释的 URL 是一件很愉快的事情:“看这里,但先不要看这里。”

多开发环境 - 很酷的 Pantheon 工具之一 - 解决了这个问题,因为使用它们您可以按需为 Git 分支创建环境。 每个多开发环境都有自己的 URL 和数据库,因此开发人员可以安静地工作、检查质量并获得批准,而无需互相打扰。

但 Pantheon 没有用于版本控制或持续集成和部署 (CI/CD) 的工具。 但它是一个灵活的平台,您可以集成任何工具。

我还注意到,团队使用某些工具进行开发,并使用不同的工具进行组装和部署。

例如,他们有不同的版本控制和 CI/CD 工具。 您必须摆弄并在工具之间切换来编辑代码和诊断问题。

GitLab 有一套完整的开发工具:用于版本控制、票证、合并请求、一流的 CI/CD 管道、容器注册表以及类似的一切。 我还没有遇到过一个应用程序可以提供如此多的功能来管理您的开发工作流程。

我喜欢自动化,所以我学习了如何将 Pantheon 连接到 GitLab,以便将 GitLab 上主分支的提交部署到 Pantheon 的主开发环境中。 GitLab 上的合并请求可以创建代码并将其部署到 Pantheon 中的多开发环境。

在本教程中,我将引导您了解如何在 GitLab 和 Pantheon 之间建立连接并优化您的 WordPress 和 Drupal 工作流程。

当然有可能, 镜像 GitLab 存储库,但我们会用双手去钻研一切 亚搏体育app CI 并且将来不仅可以使用此工具进行部署。

介绍

对于这篇文章,您需要了解 Pantheon 将每个站点分为三个元素:代码、数据库和文件。

该代码包括 CMS 文件,例如 WordPress 核心、插件和主题。 这些文件管理在 Git 存储库,由 Pantheon 托管,这意味着我们可以使用 Git 将代码从 GitLab 部署到 Pantheon。
Pantheon 中的文件是媒体文件,即站点的图像。 通常它们是由用户上传的,Git 会忽略它们。

创建一个免费帐户,了解更多关于 万神殿工作流程 или 报名参加演示 在 pantheon.io。

假设

我在 Pantheon 和 GitLab 上的项目叫做 pantheon-gitlab-blog-demo。 项目名称必须是唯一的。 在这里,我们将使用 WordPress 网站。 您可以使用 Drupal,但您需要更改一些内容。

我会用 git 命令行你可以在 图形界面, 如果你想。

创建一个项目

首先,我们来创建 亚搏体育appGitLab项目 (我们稍后会再讨论这一点)。

现在 在 Pantheon 上创建 WordPress 网站。 然后我们为网站仪表板安装 WordPress。

如果您渴望更改某些内容,例如删除或添加插件,请耐心等待。 该站点尚未连接到 GitLab,我们希望所有代码更改都通过 GitLab。

安装 WordPress 后,返回 Pantheon 网站仪表板并将开发模式更改为 Git。

如何连接 GitLab 和 Pantheon 并优化 Drupal 和 WordPress 工作流程

GitLab 上的初始提交

现在您需要将初始 WordPress 代码从 Pantheon 站点传输到 GitLab。 为此,我们从本地 Pantheon 站点的 Git 存储库克隆代码,然后将其发送到 GitLab 存储库。

为了让一切变得更简单、更安全, 将 SSH 密钥添加到 Pantheon 每次克隆 Pantheon Git 存储库时,我们都不必输入密码。 同时已经 将 SSH 密钥添加到 GitLab.

为此,请从站点仪表板上的“使用 Git 克隆”字段复制命令,在本地克隆 Pantheon 站点。

如何连接 GitLab 和 Pantheon 并优化 Drupal 和 WordPress 工作流程
如果您需要帮助,请阅读文档 万神殿的 Git 入门.

现在让我们改变一下 git remote origin指向 GitLab 而不是 Pantheon。 可以办到 командой git remote.

让我们转到 GitLab 项目并从项目详细信息页面上的“克隆”下拉列表中复制存储库 URL。 让我们选择“Clone with SSH”选项,因为我们已经配置了 SSH 密钥。

如何连接 GitLab 和 Pantheon 并优化 Drupal 和 WordPress 工作流程

默认情况下, git remote 对于代码存储库的本地副本 - origin。 这可以改变c git remote set-url origin [URL репозитория GitLab],我们输入实际的 URL,而不是括号。

最后,我们推出 git push origin master --force将 WordPress 代码从 Pantheon 推送到 GitLab。

–force 选项仅需要一次。 然后分队进行 git push 它不会出现在 GitLab 上。

设置凭据和变量

还记得我们如何在本地添加 SSH 密钥来登录 Pantheon 和 GitLab 吗? SSH 令牌可用于授权 GitLab 和 Pantheon。

GitLab 拥有优秀的文档。 让我们来看看 有关在 GitLab CI/CD 中使用 SSH 密钥的文档中有关使用 Docker 执行器时的 SSH 密钥的部分.

我们现在将完成前两个步骤: 让我们使用 ssh-keygen 在本地创建一个新的 SSH 密钥对,并将私钥作为变量添加到项目中.

然后我们会问 SSH_PRIVATE_KEYGitLab CI/CD 环境变量 在项目设置中。
在第三步和第四步中我们将创建一个文件 .gitlab-ci.yml 内容如下:

before_script:
  # See https://docs.gitlab.com/ee/ci/ssh_keys/README.html
  - eval $(ssh-agent -s)
  - echo "$SSH_PRIVATE_KEY" | tr -d 'r' | ssh-add - > /dev/null
  - mkdir -p $HOME/.ssh && echo "StrictHostKeyChecking no" >> "$HOME/.ssh/config"
  - git config --global user.email "$GITLAB_USER_EMAIL"
  - git config --global user.name "Gitlab CI"

我们先不要提交文件 .gitlab-ci.yml,那么您需要向其中添加其他内容。

现在我们执行第五步 将您在第一步中创建的公钥添加到您需要在构建环境中访问的服务.

在我们的例子中,我们希望从 GitLab 访问 Pantheon。 我们遵循 Pantheon 文件中的说明 向 Pantheon 添加 SSH 密钥 并执行此步骤。

请记住:私有 SSH 在 GitLab 中,开放 SSH 在 Pantheon 中。

让我们再设置一些环境变量。 第一个称为 PANTHEON_SITE。 它的值是您计算机上的 Pantheon 站点的名称。

计算机上的名称列在使用 Git 克隆命令的末尾。 您已经在本地克隆了该站点,因此这将是本地存储库目录的名称。

如何连接 GitLab 和 Pantheon 并优化 Drupal 和 WordPress 工作流程

接下来我们来设置一下环境变量 PANTHEON_GIT_URL。 这是我们已经使用过的 Pantheon 站点的 Git 存储库 URL。

仅输入 SSH 存储库 URL,不输入 git clone 以及最后机器上的站点名称。

唷。 完成了,现在我们可以完成我们的文件了 .gitlab-ci.yml.

创建部署任务

我们最初使用 GitLab CI 所做的事情与我们过去使用 Git 存储库所做的事情非常相似。 但这一次,我们将 Pantheon 存储库添加为第二个远程 Git 源,然后将代码从 GitLab 推送到 Pantheon。

为此,我们需要配置 阶段 deploy и 任务 deploy:dev,因为我们将部署到Pantheon上的开发环境。 生成的文件 .gitlab-ci.yml 将如下所示:

stages:
- deploy

before_script:
  # See https://docs.gitlab.com/ee/ci/ssh_keys/README.html
  - eval $(ssh-agent -s)
  - echo "$SSH_PRIVATE_KEY" | tr -d 'r' | ssh-add - > /dev/null
  - mkdir -p $HOME/.ssh && echo "StrictHostKeyChecking no" >> "$HOME/.ssh/config"
  - git config --global user.email "$GITLAB_USER_EMAIL"
  - git config --global user.name "Gitlab CI"

deploy:dev:
  stage: deploy
  environment:
    name: dev
    url: https://dev-$PANTHEON_SITE.pantheonsite.io/
  script:
    - git remote add pantheon $PANTHEON_GIT_URL
    - git push pantheon master --force
  only:
    - master

变量 SSH_PRIVATE_KEY, PANTHEON_SITE и PANTHEON_GIT_URL 应该看起来很熟悉 - 我们之前设置了这些环境变量。 有了这些变量,我们就可以使用文件中的值 .gitlab-ci.yml 多次更新,并且只需要在一处更新。

最后添加、提交并发送文件 .gitlab-ci.yml 在 GitLab 上。

检查部署情况

如果我们做的一切正确的话,任务 deploy:dev 将在 GitLab CI/CD 中成功运行并提交提交 .gitlab-ci.yml 在万神殿。 我们来看看吧。

如何连接 GitLab 和 Pantheon 并优化 Drupal 和 WordPress 工作流程

如何连接 GitLab 和 Pantheon 并优化 Drupal 和 WordPress 工作流程

如何连接 GitLab 和 Pantheon 并优化 Drupal 和 WordPress 工作流程

向 Pantheon 发送合并请求线程

在这里我们将使用我最喜欢的万神殿功能 - 多开发,您可以根据需要为 Git 分支创建额外的 Pantheon 环境。

对多重开发的访问受到限制,所以本节可以跳过。 但如果您有访问权限,您可以通过 GitLab 合并请求在 Pantheon 上自动创建多开发环境,从而显着提高工作效率。

首先让我们在本地创建一个新的 Git 分支 git checkout -b multidev-support。 现在让我们再次更改一些内容 .gitlab-ci.yml.

我喜欢在 Pantheon 环境名称中包含合并请求编号。 例如,第一个合并请求是 mr-1, 第二 - mr-2 等等。

合并请求发生变化,因此我们需要动态确定 Pantheon 分支名称。 在 GitLab 上很简单 - 你只需要使用 预定义环境变量.

我们可以采取 $CI_MERGE_REQUEST_IID指定合并请求编号。 让我们将所有这些与我们之前指定的全局环境变量一起应用,并在文件末尾添加一个新的部署:multidev 任务 .gitlab-ci.yml.

deploy:multidev:
  stage: deploy
  environment:
    name: multidev/mr-$CI_MERGE_REQUEST_IID
    url: https://mr-$CI_MERGE_REQUEST_IID-$PANTHEON_SITE.pantheonsite.io/
  script:
    # Checkout the merge request source branch
    - git checkout $CI_COMMIT_REF_NAME
    # Add the Pantheon git repository as an additional remote
    - git remote add pantheon $PANTHEON_GIT_URL
    # Push the merge request source branch to Pantheon
    - git push pantheon $CI_COMMIT_REF_NAME:mr-$CI_MERGE_REQUEST_IID --force
  only:
    - merge_requests

这将类似于我们的任务 deploy:dev,仅将分支发送到万神殿,而不发送到 master.

我们已经添加并提交了更新的文件 .gitlab-ci.yml,现在让我们将一个新分支推送到 GitLab git push -u origin multidev-support.

现在让我们从分支创建一个新的合并请求 multidev-support创建合并请求.

如何连接 GitLab 和 Pantheon 并优化 Drupal 和 WordPress 工作流程

创建合并请求后,我们看看 CI/CD 任务是如何执行的 deploy:multidev.

如何连接 GitLab 和 Pantheon 并优化 Drupal 和 WordPress 工作流程

看,一个新线程已发送到万神殿。 但是,如果我们转到 Pantheon 站点仪表板上的 multidev 部分,我们将不会在那里看到新环境

如何连接 GitLab 和 Pantheon 并优化 Drupal 和 WordPress 工作流程

让我们看一下 Git 分支部分。

如何连接 GitLab 和 Pantheon 并优化 Drupal 和 WordPress 工作流程

结果,我们的线程 mr-1 到了万神殿。 让我们从分支创建一个环境 mr-1.

如何连接 GitLab 和 Pantheon 并优化 Drupal 和 WordPress 工作流程

我们已经创建了一个多开发环境,现在让我们回到GitLab看看该部分 运营 > 环境。 我们将看到以下条目 dev и mr-1.

这是因为我们添加了一个条目 environment 有名字 name и url 进入 CI/CD 任务。 如果单击打开环境图标,我们将转到 Pantheon 上的多开发环境的 URL。

自动创建 multidev

原则上,您可以停在这里,只需记住为每个合并请求创建一个多开发环境,但此过程可以自动化。

Pantheon 有一个命令行工具 总站,您可以在其中自动使用该平台。 Terminus 允许您从命令行创建多开发环境 - 非常适合 亚搏体育app CI.

我们需要一个新的合并请求来测试这一点。 让我们使用以下命令创建一个新分支 git checkout -b auto-multidev-creation.

要在 GitLab CI/CD 任务中使用 Terminus,您需要一个用于通过 Terminus 进行身份验证的机器令牌以及一个带有 Terminus 的容器映像。

创建 Pantheon 机器令牌,将其保存在安全的地方,并将其添加为 GitLab 中的全局环境变量,名称为 PANTHEON_MACHINE_TOKEN.

如果您忘记了如何添加 GitLab 环境变量,请返回到我们定义的位置 PANTHEON_SITE.

使用 Terminus 创建 Dockerfile

如果你不使用 Docker 或者不喜欢文件 Dockerfile,拍摄我的图像 registry.gitlab.com/ataylorme/pantheon-gitlab-blog-demo:latest 并跳过本节。

GitLab 有一个容器注册表,我们可以在其中为我们的项目构建并放置 Dockerfile。 让我们使用 Terminus 创建一个 Dockerfile 以与 Pantheon 一起使用。

Terminus 是一个 PHP 命令行工具,所以让我们从 PHP 镜像开始。 我通过 Composer 安装 Terminus,所以我将使用 官方 Docker Composer 镜像。 我们创造 Dockerfile 在本地存储库目录中包含以下内容:

# Use the official Composer image as a parent image
FROM composer:1.8

# Update/upgrade apk
RUN apk update
RUN apk upgrade

# Make the Terminus directory
RUN mkdir -p /usr/local/share/terminus

# Install Terminus 2.x with Composer
RUN /usr/bin/env COMPOSER_BIN_DIR=/usr/local/bin composer -n --working-dir=/usr/local/share/terminus require pantheon-systems/terminus:"^2"

按照 部分中的组装和发送图像的说明进行操作 构建并推送镜像 в 容器注册表文档收集图像 Dockerfile 并将其推送到 GitLab。

打开该部分 注册表 在 GitLab 项目中。 如果一切按计划进行,我们的形象就会在那里。 写下图像标签的链接 - 我们需要它作为文件 .gitlab-ci.yml.

如何连接 GitLab 和 Pantheon 并优化 Drupal 和 WordPress 工作流程

部分 script 在问题中 deploy:multidev 开始增长,所以让我们将其移动到一个单独的文件中。 创建一个新文件 private/multidev-deploy.sh:

#!/bin/bash

# Store the mr- environment name
export PANTHEON_ENV=mr-$CI_MERGE_REQUEST_IID

# Authenticate with Terminus
terminus auth:login --machine-token=$PANTHEON_MACHINE_TOKEN

# Checkout the merge request source branch
git checkout $CI_COMMIT_REF_NAME

# Add the Pantheon Git repository as an additional remote
git remote add pantheon $PANTHEON_GIT_URL

# Push the merge request source branch to Pantheon
git push pantheon $CI_COMMIT_REF_NAME:$PANTHEON_ENV --force

# Create a function for determining if a multidev exists
TERMINUS_DOES_MULTIDEV_EXIST()
{
    # Stash a list of Pantheon multidev environments
    PANTHEON_MULTIDEV_LIST="$(terminus multidev:list ${PANTHEON_SITE} --format=list --field=id)"

    while read -r multiDev; do
        if [[ "${multiDev}" == "$1" ]]
        then
            return 0;
        fi
    done <<< "$PANTHEON_MULTIDEV_LIST"

    return 1;
}

# If the mutltidev doesn't exist
if ! TERMINUS_DOES_MULTIDEV_EXIST $PANTHEON_ENV
then
    # Create it with Terminus
    echo "No multidev for $PANTHEON_ENV found, creating one..."
    terminus multidev:create $PANTHEON_SITE.dev $PANTHEON_ENV
else
    echo "The multidev $PANTHEON_ENV already exists, skipping creating it..."
fi

该脚本位于私有目录中并且 不允许通过网络访问万神殿。 我们有一个用于多开发逻辑的脚本。 现在让我们更新该部分 deploy:multidev 文件 .gitlab-ci.yml结果是这样的:

deploy:multidev:
  stage: deploy
  environment:
    name: multidev/mr-$CI_MERGE_REQUEST_IID
    url: https://mr-$CI_MERGE_REQUEST_IID-$PANTHEON_SITE.pantheonsite.io/
  script:
    # Run the multidev deploy script
    - "/bin/bash ./private/multidev-deploy.sh"
  only:
    - merge_requests

我们需要确保我们的任务在创建的自定义图像中执行,所以让我们添加一个定义 image 从注册表 URL 到 .gitlab-ci.yml。 结果,我们得到了这样一个文件 .gitlab-ci.yml:

image: registry.gitlab.com/ataylorme/pantheon-gitlab-blog-demo:latest

stages:
- deploy

before_script:
  # See https://docs.gitlab.com/ee/ci/ssh_keys/README.html
  - eval $(ssh-agent -s)
  - echo "$SSH_PRIVATE_KEY" | tr -d 'r' | ssh-add - > /dev/null
  - mkdir -p $HOME/.ssh && echo "StrictHostKeyChecking no" >> "$HOME/.ssh/config"
  - git config --global user.email "$GITLAB_USER_EMAIL"
  - git config --global user.name "Gitlab CI"

deploy:dev:
  stage: deploy
  environment:
    name: dev
    url: https://dev-$PANTHEON_SITE.pantheonsite.io/
  script:
    - git remote add pantheon $PANTHEON_GIT_URL
    - git push pantheon master --force
  only:
    - master

deploy:multidev:
  stage: deploy
  environment:
    name: multidev/mr-$CI_MERGE_REQUEST_IID
    url: https://mr-$CI_MERGE_REQUEST_IID-$PANTHEON_SITE.pantheonsite.io/
  script:
    # Run the multidev deploy script
    - "/bin/bash ./private/multidev-deploy.sh"
  only:
    - merge_requests

添加、提交和发送 private/multidev-deploy.sh и .gitlab-ci.yml。 现在我们返回GitLab并等待CI/CD任务完成。 请耐心等待:创建 multidev 可能需要几分钟时间。

然后我们去看看 Pantheon 上的 multidev 列表。 噢,奇迹! 多开发环境 mr-2 已经在这里了。

如何连接 GitLab 和 Pantheon 并优化 Drupal 和 WordPress 工作流程

结论

当我们开始打开合并请求并自动创建环境时,我的团队获得了更多乐趣。

借助 GitLab 和 Pantheon 的强大工具,您可以自动将 GitLab 连接到 Pantheon。

由于我们使用 GitLab CI/CD,我们的工作流程将有增长的空间。 以下是一些可以帮助您入门的想法:

  • 添加构建步骤。
  • 添加自动化测试。
  • 添加任务以确保满足代码标准。
  • 动态应用安全测试.

让我们知道您对 GitLab、Pantheon 和自动化的看法。

PS 你知道吗,Pantheon 的命令行工具 Terminus 可以通过插件扩展?

我们 Pantheon 在第二版上做得很好 Terminus 构建工具插件 与 GitLab 支持。 如果您不想为每个项目的设置而烦恼,请尝试此插件并帮助我们测试 v2 beta。 对于总站团队 build:project:create 您只需要一个 Pantheon 令牌和一个 GitLab 令牌。 她将使用 Composer 和自动化测试部署示例项目之一,在 GitLab(新的 Pantheon 站点)中创建一个新项目,并使用环境变量和 SSH 密钥连接它们。

关于作者

安德鲁·泰勒 (Andrew Taylor) 为开发人员创建了工具 万神殿.

来源: habr.com

添加评论