我们 Pantheon 的客座开发人员工具创建者谈论如何使用 GitLab CI/CD 自动化 WordPress 部署。
В
我经常看到开发人员在单个临时服务器上苦苦挣扎。
等待轮到您使用中间服务器或向客户端发送带有注释的 URL 是一件很愉快的事情:“看这里,但先不要看这里。”
但 Pantheon 没有用于版本控制或持续集成和部署 (CI/CD) 的工具。 但它是一个灵活的平台,您可以集成任何工具。
我还注意到,团队使用某些工具进行开发,并使用不同的工具进行组装和部署。
例如,他们有不同的版本控制和 CI/CD 工具。 您必须摆弄并在工具之间切换来编辑代码和诊断问题。
上
我喜欢自动化,所以我学习了如何将 Pantheon 连接到 GitLab,以便将 GitLab 上主分支的提交部署到 Pantheon 的主开发环境中。 GitLab 上的合并请求可以创建代码并将其部署到 Pantheon 中的多开发环境。
在本教程中,我将引导您了解如何在 GitLab 和 Pantheon 之间建立连接并优化您的 WordPress 和 Drupal 工作流程。
当然有可能,
介绍
对于这篇文章,您需要了解 Pantheon 将每个站点分为三个元素:代码、数据库和文件。
该代码包括 CMS 文件,例如 WordPress 核心、插件和主题。 这些文件管理在
Pantheon 中的文件是媒体文件,即站点的图像。 通常它们是由用户上传的,Git 会忽略它们。
假设
我在 Pantheon 和 GitLab 上的项目叫做 pantheon-gitlab-blog-demo
。 项目名称必须是唯一的。 在这里,我们将使用 WordPress 网站。 您可以使用 Drupal,但您需要更改一些内容。
创建一个项目
首先,我们来创建
现在
如果您渴望更改某些内容,例如删除或添加插件,请耐心等待。 该站点尚未连接到 GitLab,我们希望所有代码更改都通过 GitLab。
安装 WordPress 后,返回 Pantheon 网站仪表板并将开发模式更改为 Git。
GitLab 上的初始提交
现在您需要将初始 WordPress 代码从 Pantheon 站点传输到 GitLab。 为此,我们从本地 Pantheon 站点的 Git 存储库克隆代码,然后将其发送到 GitLab 存储库。
为了让一切变得更简单、更安全,
为此,请从站点仪表板上的“使用 Git 克隆”字段复制命令,在本地克隆 Pantheon 站点。
如果您需要帮助,请阅读文档
现在让我们改变一下 git remote origin
指向 GitLab 而不是 Pantheon。 可以办到 командой git remote
让我们转到 GitLab 项目并从项目详细信息页面上的“克隆”下拉列表中复制存储库 URL。 让我们选择“Clone with SSH”选项,因为我们已经配置了 SSH 密钥。
默认情况下, 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 拥有优秀的文档。 让我们来看看
我们现在将完成前两个步骤: 让我们使用 ssh-keygen 在本地创建一个新的 SSH 密钥对,并将私钥作为变量添加到项目中.
然后我们会问 SSH_PRIVATE_KEY
如
在第三步和第四步中我们将创建一个文件 .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 文件中的说明
请记住:私有 SSH 在 GitLab 中,开放 SSH 在 Pantheon 中。
让我们再设置一些环境变量。 第一个称为 PANTHEON_SITE。 它的值是您计算机上的 Pantheon 站点的名称。
计算机上的名称列在使用 Git 克隆命令的末尾。 您已经在本地克隆了该站点,因此这将是本地存储库目录的名称。
接下来我们来设置一下环境变量 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
在万神殿。 我们来看看吧。
向 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
按 创建合并请求.
创建合并请求后,我们看看 CI/CD 任务是如何执行的 deploy:multidev
.
看,一个新线程已发送到万神殿。 但是,如果我们转到 Pantheon 站点仪表板上的 multidev 部分,我们将不会在那里看到新环境
让我们看一下 Git 分支部分。
结果,我们的线程 mr-1
到了万神殿。 让我们从分支创建一个环境 mr-1
.
我们已经创建了一个多开发环境,现在让我们回到GitLab看看该部分 运营 > 环境。 我们将看到以下条目 dev
и mr-1
.
这是因为我们添加了一个条目 environment
有名字 name
и url
进入 CI/CD 任务。 如果单击打开环境图标,我们将转到 Pantheon 上的多开发环境的 URL。
自动创建 multidev
原则上,您可以停在这里,只需记住为每个合并请求创建一个多开发环境,但此过程可以自动化。
Pantheon 有一个命令行工具
我们需要一个新的合并请求来测试这一点。 让我们使用以下命令创建一个新分支 git checkout -b auto-multidev-creation
.
要在 GitLab CI/CD 任务中使用 Terminus,您需要一个用于通过 Terminus 进行身份验证的机器令牌以及一个带有 Terminus 的容器映像。
PANTHEON_MACHINE_TOKEN
.
如果您忘记了如何添加 GitLab 环境变量,请返回到我们定义的位置
PANTHEON_SITE
.
使用 Terminus 创建 Dockerfile
如果你不使用 Docker 或者不喜欢文件 Dockerfile
,拍摄我的图像 registry.gitlab.com/ataylorme/pantheon-gitlab-blog-demo:latest
并跳过本节。
Terminus 是一个 PHP 命令行工具,所以让我们从 PHP 镜像开始。 我通过 Composer 安装 Terminus,所以我将使用 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
.
部分 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 的强大工具,您可以自动将 GitLab 连接到 Pantheon。
由于我们使用 GitLab CI/CD,我们的工作流程将有增长的空间。 以下是一些可以帮助您入门的想法:
- 添加构建步骤。
- 添加自动化测试。
- 添加任务以确保满足代码标准。
- 加
动态应用安全测试 .
让我们知道您对 GitLab、Pantheon 和自动化的看法。
PS 你知道吗,Pantheon 的命令行工具 Terminus
我们 Pantheon 在第二版上做得很好 build:project:create
您只需要一个 Pantheon 令牌和一个 GitLab 令牌。 她将使用 Composer 和自动化测试部署示例项目之一,在 GitLab(新的 Pantheon 站点)中创建一个新项目,并使用环境变量和 SSH 密钥连接它们。
关于作者
安德鲁·泰勒 (Andrew Taylor) 为开发人员创建了工具
来源: habr.com