Day28 - 铁人付外挂部署与发行(一)- 建立测试机

开发 WooCommerce 金流外挂能在本机测试的部分除了确保设定项有正确写入资料库外,剩下的就是确保按下结帐按钮时不会有任何的错误产生,至於能否将正确的资料送到金流商以及成功接收回传资料,都还是要在远端主机才能进行测试,虽然我们可以用一些工具像是 Postman 来模拟金流商的 API,但最终这支外挂还是要能够在正式环境中运作才行。

通常承接外挂开发这一类的案件,客户本身都已经有运作中的网站,为了要让我们的外挂可以在不影响客户网站的情况下测试,最好的方法就是客户可以提供给我们跟正式环境一模一样的测试站来执行金流外挂的结帐流程。

但常遇到的状况是客户无法提供,这样的话就需要我们自己架设测试环境,但自架的测试环境跟正式站还是会有所落差,所以主要测试的方向就是确保金流商的 API 可以运作正常,至於装在正式站是否会跟其他外挂产生冲突或其他状况而造成问题,这就只能等到上正式站才能知道了。

通常我的开发流程如下:在本机完成外挂开发 -> 自动化测试 -> 开 VPS 测试机 -> 进入测试机继续开发与除错 -> 自动化测试 -> 人工测试 -> 部署到正式站

当本机开发完成第一轮後,接下进入测试机确保 API 的传送与接收都正常,确认没问题後再透过自动化工具部署到正式站,在自动部署的过程中会再跑一次测试,万一上正式站後发生问题,就能手动还原部署前的状态,接下来检查造成问题的因素有哪些,再将这些因素搬移到测试机来进行重现并除错。

最好的情况下是客户允许我们把正式站的资料倒进测试机,但尽可能只搬移档案的部分不要动到资料库,要动到资料库也排除跟使用者相关的资料表,以减少个资外泄的风险。

如果在测试机无法重现,我们势必还是要进入正式机来除错,为了避免顾客不小心选到我们正在测试中的金流商,可以加入一个只限定管理员才能看到该付款方式的功能,另外一定要准备好的就是日志纪录,WooCommerce 有提供日志类别 WC_Logger,使用之後就可以在後台的 WooCommerce > 状态 > 日志纪录来印出讯息,千万不要让除错的资讯直接显示在前台。

设定好部署流程之後,接下来我们就来建立测试机,我习惯用 VPS 来建置,因为可以透过指令码把我们需要的工具一次安装完成,还记得之前我们用的本机开发环境 Valet 吗?它有提供 Linux 的版本,这样就能让我们的本机与测试环境一样。

但 Valet 的主要用途就是拿来本机开发用,虽然他有外连网址的功能,但因为没办法绑网域,因此也就无法安装 SSL,有些金流商会要求回传网址需要加密,这让 Valet 不适合用在测试环境之中。

因此我们会采用一套叫做 WordOps 的 WordPress 环境,只要下一段指令就能一次安装好 PHP、Nginx、MySql 以及 WordPress,同时也内建了 SSL 功能,再加上它将服务器设定进行过最佳化,让网站跑起来可以非常顺畅,它可以直接作为正式环境来使用,因此拿来当测试环境再适合也不过。

除此之外,我们还需要以下工具:Git、Compose、Node.js,这些都能透过指令安装,我们希望在安装 VPS 时,只要输入测试站的网址以及後台登入帐密,剩下的这些作业全部可以自动化搞定,为了达成这一点,首先我们必须先找可以使用指令工具来建立环境的 VPS,这边示范使用 Linode 的服务。

安装 linode-cli

linode-cli 是使用 Python 开发的,因此要确保本机环境有安装,如果没有的话可以使用 Homebrew 进行安装:

$ brew install python3

接下来安装 linode-cli:

$ pip install linode-cli

安装完成後我们先把登入授权设定好:

$ linode-cli configure --token

它会请我们前往管理後台取得登入的 Token,照它的说明取得後输入即可:

Welcome to the Linode CLI.  This will walk you through some initial setup.

First, we need a Personal Access Token.  To get one, please visit
https://cloud.linode.com/profile/tokens and click
"Create a Personal Access Token".  The CLI needs access to everything
on your account to work correctly.
Personal Access Token:

再来是设定测试机的机房位置与规格:

$ linode-cli configurate

我们使用东京机房,所以选择 ap-norteast:

Default Region for operations.  Choices are:
 1 - ap-west
 2 - ca-central
 3 - ap-southeast
 4 - us-central
 5 - us-west
 6 - us-southeast
 7 - us-east
 8 - eu-west
 9 - ap-south
 10 - eu-central
 11 - ap-northeast

Default Region (Optional): 11

选择最小规格的主机每月 5 美金:

Default Type of Linode to deploy.  Choices are:
 1 - g6-nanode-1
 2 - g6-standard-1
 3 - g6-standard-2
 4 - g6-standard-4
 5 - g6-standard-6
 6 - g6-standard-8
 7 - g6-standard-16
 8 - g6-standard-20
 9 - g6-standard-24
 10 - g6-standard-32
 11 - g7-highmem-1
 12 - g7-highmem-2
 13 - g7-highmem-4
 14 - g7-highmem-8
 15 - g7-highmem-16
 16 - g6-dedicated-2
 17 - g6-dedicated-4
 18 - g6-dedicated-8
 19 - g6-dedicated-16
 20 - g6-dedicated-32
 21 - g6-dedicated-48
 22 - g6-dedicated-50
 23 - g6-dedicated-56
 24 - g6-dedicated-64
 25 - g1-gpu-rtx6000-1
 26 - g1-gpu-rtx6000-2
 27 - g1-gpu-rtx6000-3
 28 - g1-gpu-rtx6000-4

Default Type of Linode (Optional): 1

预设的 OS 使用 linode/ubuntu20.04:

Default Image to deploy to new Linodes.  Choices are:
 1 - linode/almalinux8
 2 - linode/alpine3.10
 3 - linode/alpine3.11
 4 - linode/alpine3.12
 5 - linode/alpine3.13
 6 - linode/alpine3.14
 7 - linode/arch
 8 - linode/centos7
 9 - linode/centos8
 10 - linode/centos-stream8
 11 - linode/debian10
 12 - linode/debian11
 13 - linode/debian9
 14 - linode/fedora32
 15 - linode/fedora33
 16 - linode/fedora34
 17 - linode/gentoo
 18 - linode/debian9-kube-v1.19.11
 19 - linode/debian9-kube-v1.20.7
 20 - linode/debian9-kube-v1.21.1
 21 - linode/opensuse15.2
 22 - linode/opensuse15.3
 23 - linode/rocky8
 24 - linode/slackware14.2
 25 - linode/ubuntu16.04lts
 26 - linode/ubuntu18.04
 27 - linode/ubuntu20.04
 28 - linode/ubuntu20.10
 29 - linode/ubuntu21.04
 30 - linode/alpine3.9
 31 - linode/centos6.8
 32 - linode/debian8
 33 - linode/fedora31
 34 - linode/opensuse15.1
 35 - linode/slackware14.1

Default Image (Optional): 27

完成基本设定後,就能使用指令建立机器,後面的 123456 就是 root 权限登入密码:

$ linode-cli linodes create --root_pass 123456

接下来会看到以下的主机资讯:

id label region type image status ipv4
12345678 linode12345678 ap-northeast g6-nanode-1 linode/ubuntu20.04 provisioning 123.123.123.123

在等待建立的过程中,我们可以先把自己电脑的 RSA key 传上去,这样 ssh 登入就不用输入密码了,如果没有 key 的话先产生一个:

$ ssh-keygen

接下来复制到刚开好的主机中:

$ ssh-copy-id [email protected]

然後输入一次 root 密码即可,完成後会看到以下讯息:

Number of key(s) added:        1

Now try logging into the machine, with:   "ssh '[email protected]'"
and check to make sure that only the key(s) you wanted were added.

下一步使用 ssh 登入主机并执行自动化指令安装:

root@localhost:~ bash <(curl -s https://raw.githubusercontent.com/oberonlai/sh_staging/master/wordops.sh)

首先要回答六个问题,分别为:

  • 测试站的网址,不用输入 http/https
  • 管理者登入帐号
  • 管理者登入密码
  • 管理者电子邮件
  • 外挂名称
  • 外挂的存放库网址
1.Staging site url:
staging.example.com
2.Staging admin user:
user
3.Staging admin password:
pass
4.Staging admin email:
[email protected]
5.Plugin name:
my-plugin
6.Git clone url:
https://github.com/xxx

指令的内容如下:

# Get information
echo "1.Staging site url:"
read staging_url
echo "2.Staging admin user:"
read staging_user
echo "3.Staging admin password:"
read staging_pass
echo "4.Staging admin email:"
read staging_email
echo "5.Plugin name:"
read plugin_name
echo "6.Git clone url:"
read repo

# Set timezone
sudo timedatectl set-timezone Asia/Taipei

# Install WordOps
wget -qO wo wops.cc && sudo bash wo --force
wo stack upgrade --nginx
wo site create "$staging_url" --wp --user="$staging_user" --pass="$staging_pass" --email="$staging_email" --letsencrypt
cd /var/www/"$staging_url"/htdocs

# Install plugins and themes
wp language core install zh_TW --allow-root
wp language core activate zh_TW --allow-root
wp option update timezone_string "Asia/Taipei" --allow-root
wp site switch-language zh_TW --allow-root
wp plugin install woocommerce --allow-root
wp language plugin install woocommerce zh_TW --allow-root
wp plugin activate woocommerce zh_TW --allow-root
wp theme install storefront --allow-root
wp language theme install storefront zh_TW --allow-root
wp theme activate storefront --allow-root

# Install Tool
sudo apt update
sudo apt -y upgrade
sudo apt -y autoremove
sudo apt -y install git-all
sudo apt -y install nodejs npm
sudo apt -y install composer

cd wp-content/plugins
git clone "$repo"
cd "$plugin_name"
composer install
npm install
usermod --shell /bin/bash www-data
echo "Staging build successfully!"

首先设定时区以及 WordOps 的安装,把我们输入的资料带进 WordOps 建立网站的指令中,然後将目录切换到该站底下,使用 WP CLI 来处理网站的内容,因为我们现在是使用 root 权限在执行,所以要加上 --allow-root 的参数。

安装完 WordPress 之後再把我们开发上需要的工具 Git、Node.js、Composer 透过 apt 来进行安装,最後将目录切换到测试站的 plugins 资料夹底下,把放在 Github 的金流外挂 clone 下来,并根据需要进行 composer 与 npm install,最後将网站使用者 www-data 加入权限,之後就能使用 www-data 来执行指令。

大家可以根据这个范本整理成自己需要的项目,整个安装过程大概十分钟,记得在执行之前要先把 DNS 指到这台主机,这样 WordOps 才能正确加上凭证。

测试机安装完成後,帮 VSCode 安装 Remote Development 套件,这样就可以在本地连线到测试机继续开发,之後的版本控管也都可以在测试机上面进行,如果要回到本机测试的话,再 Pull 回来即可。

下一篇介绍自动部署到正式机的方法。

本文同步发表於:https://oberonlai.blog/tw/woocommerce-payment-staging/


<<:  Day13 - 使用Chip和ChipGroup显示搜寻项目

>>:  D-2.Line_pay_api 串接(三) Rails 串接

学习Python纪录Day3 - Aconada安装

Anaconda安装 到Anaconda官网(https://www.anaconda.com/pr...

Day25 - 保护你的状态转移,在 XState 中使用 Guard Transition

还记得我们在 Day 15 曾经介绍过 Guard 吗? 今天要来跟大家分享如何在 XState 中...

Day 37 - 在 AWS Lambda 建立 OpenCV Layer

Day 37 - 在 AWS Lambda 建立 OpenCV Layer 因为 OpenCV 在影...

资料表集合与文氏图

数学上,文氏图常用作集合论的表达工具,在做资料库查询的时候,其实也常常使用到这样的概念,交集、差集、...

javascript基础功能1

今天跟着网路上的教成学了很多有趣的js用法,除了打文字标题上去,还有学习如何制作列表跟贴上想要的图片...