我們 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) 為開發人員創建了工具
來源: www.habr.com