instituteweb / deployer-scripts
PHP 部署脚本 (deployer.org),用于构建本地和部署远程 iw_master TYPO3 发行版。
Requires
- deployer/deployer: ^4.0
- league/flysystem: ^1.0
- league/flysystem-sftp: ^1.0
- symfony/process: ^3.2
README
这些 部署脚本 包含了 构建 和 部署脚本,用于任务执行器 PHP Deployer。所有任务都是系统独立的(Unix/Windows)且高度可配置。
这些脚本最初是为 TYPO3 CMS 和发行版 iw_master 制作的。但您也可以使用这些脚本部署任何您想要的应用程序。
目前这是一个早期版本,我很高兴收到反馈和贡献,谢谢 :)
关键特性:league/flysystem
这些部署脚本的一个酷特性是出色的包 league/flysystem,它允许您通过 SSH、FTP、本地机器以及更多其他方式执行文件操作。
Deployer Scripts 在您的任务中提供了 files()
和 filesLocally()
函数,这些函数会自动使用当前服务器的 Deployer 配置初始化。
安装
只需将 instituteweb/deployer-scripts 添加到您的 composer 项目中
$ composer require instituteweb/deployer-scripts
这将在您的项目中安装 deployer/deployer。
全局安装
我建议全局安装 PHP Deployer 并将 vendor/bin 目录添加到您的 home 目录中,以便将其添加到 PATH 变量。
$ composer global require instituteweb/deployer-scripts
在下面的示例中,我总是写 $ dep ...
,假设您也已经全局安装了它。如果没有,您需要写 $ bin/dep
(iw_master)或 $ vendor/bin/dep
(composer 默认)...这取决于您的 composer.json 配置(bin-dir)。
配置
PHP Deployer 提供了非常不错的环境处理,允许我们全局或为每个环境单独设置变量。构建和部署配置发生在项目根目录的 deploy.php 文件中。
您需要包含 deployer-scripts 的通用脚本。在通用脚本中包含了所有可用的任务。
<?php
namespace Deployer;
require 'vendor/instituteweb/deployer-scripts/src/common.php';
// deployer.php kickstart template
如果您没有经验,可以查看 Deployer 的文档中的任务章节。
通用配置参数
使用的二进制文件,如 php、git、composer 或 unzip,在不同环境中可能有不同的调用方式。
<?php
set('bin/php', get('bin/php') ?: getenv('PHP_BIN') ?: 'php');
set('bin/git', get('bin/git') ?: getenv('GIT_BIN') ?: 'git');
set('bin/composer', get('bin/composer') ?: getenv('COMPOSER_BIN') ?: 'composer');
许多文件操作与 flysystem 协作良好,但某些操作则不行。例如删除和复制整个目录以及创建符号链接。它们使用 vsprintf()
。
<?php
// File operations (unix)
set('bin/unzip', 'unzip -qo "%s" -d "%s"');
set('bin/rm', 'rm -rf %s');
set('bin/cp', 'cp -rf "%s" "%s"');
set('bin/symlink', 'ln -nfs %s %s');
set('bin/symlink-file', get('bin/symlink'));
对于 Windows 系统,您可以使用以下命令
<?php
// File operations (windows)
set('bin/rm', 'del /S /Q "%s"');
set('bin/cp', 'copy /Y /L "%s" "%s"');
set('bin/symlink', 'mklink /D %2$s %1$s');
set('bin/symlink-file', 'mklink %2$s %1$s');
还有更多配置参数,但它们用于构建或部署。您可以在相关部分下找到它们。
构建脚本
在我们能够部署项目之前,我们需要创建一个构建。Deployer Scripts 将所有文件压缩成 zip 存档,这使得部署变得容易。
要创建一个构建,只需调用
$ dep build
- 创建 配置的构建目录(默认:../.build,因为 git 在 git 中是不可能的)
- 更新代码 使用 git。我们定义分支/标签或特定修订版本(默认是 master 分支)
- 在这里我们可以执行前端相关的事情,如 npm、bower 和 grunt/gulp。这里没有 composer,这应该在运行它的系统上执行(因为符号链接和读写/执行标志)
- 基于已签出和准备好的发布创建 zip 存档
- 清除 并删除已签出文件夹。完成。
现在这个 zip 文件可以部署了。
构建和部署可以分别调用。如果您想一次执行它们,也可以调用
$ dep build-deploy
构建配置
build_dir
字符串。 用于构建发布的文件夹。相对当前工作目录(cwd)。可能不在git版本控制下。默认:../.builds
archive_list
数组。 键是目录路径,值是要创建的zip文件的路径,包含给定键目录的内容。默认 set('archive_list', ['{{build_path}}' => '{{build_dir}}/{{short_revision}}.zip']);
git_repository
字符串。 您的仓库路径。您也可以通过SSH应用仓库并访问私有仓库。默认:null
git_branch
字符串。要检出分支或标签(两者都可行)。默认:master
build_directory (只读)
返回绝对构建目录路径。
build_path (只读)
返回包含 build_name 的绝对构建目录路径。
build_name (只读)
返回构建名称。如果提供 --name 选项,则返回此值。否则,它采用 git_target 值。
git_target (只读)
返回给定的 git_target。默认是 master
。您可以使用 --branch 或 --tag 选项或使用 --revision 选项来影响此选项。修订也是第一个参数。您可以使用 dep build-deploy 76b5410
调用
revision (只读)
返回当前的git修订版。仅在 build:update_code 任务之后或如果通过命令行已经给出了修订版时可用。
short_revision (只读)
与 revision 相同,但返回提交哈希的前七个数字。
部署脚本
这是已部署的TYPO3项目的示例结构
/html/typo3
├── .dep
│ └── releases.json
├── current -> releases/76b5410
├── releases
│ └── b2ff764
│ └── 1b61ee9
│ └── f9e80f1
│ └── e7059d1
│ └── 76b5410
└── shared
├── .env
└── web
└── fileadmin
└── typo3temp
└── uploads
为了在更新期间保持停机时间非常短,并在部署后发生严重错误时为您提供回滚到早期版本的可能性,我们使用 发布(类似于Deployer本身所做的)。每次部署都是一个新发布。
部署期间发生的事情
$ dep deploy --revision 76b5410
- 准备 在第一次在远程上创建初始文件夹结构
- 锁定 deployer(以避免并行执行)
- 上传 包含 构建 的zip文件 (76b5410.zip),到 /releases
- 解压 zip文件到 /releases/76b5410(可配置,默认:git提交哈希的短形式)
- 在新发布中执行 composer install
- 将配置的 共享文件和文件夹 移动到 /shared 目录,在 例如 /releases/76b5410 中删除它们,并创建指向共享文件夹的符号链接
- 推出 发布,这会将 /current 符号链接切换到新发布
- 执行 composer run post-update-cmd,执行TYPO3任务(更新数据库模式,清除缓存等)
- 解锁 deployer。我们完成了 :)
部署配置
composer_action
字符串。 在服务器上应执行的composer命令。通常是安装或更新。默认:install
composer_options
字符串。 将选项附加到composer以在远程机器上执行时使用。默认:{{composer_action}} --prefer-dist --no-progress --no-suggest --no-interaction --no-dev --optimize-autoloader
release_name
字符串。 发布的名称。默认 {{build_name}}
release_path
字符串。 在远程上传和提取发布的路径。默认:{{deploy_path}}/releases/{{release_name}}
max_release_cycle
整数。 在远程系统上保留的发布数量。默认:5
use_symlink_for_current
布尔值。 如果为true,则 /current 目录,该目录由web服务器(htdocs)使用,是一个符号链接。如果提供者不支持这里的符号链接,则可以禁用此选项。然后,将当前文件夹从发布复制过来。默认:true
upload_list
数组。 键是本地源文件,值是远程目标。上传文件。如果是zip文件,它也被提取到一个文件夹中,其名称与zip存档相同。默认:['{{build_dir}}/{{short_revision}}.zip' => '{{deploy_path}}/releases/{{release_name}}.zip']
directory_permissions
整数。 Unix目录权限。仅在SSH连接(在远程)上使用。默认:0755
回滚
如果您需要回滚到先前版本,可以这样做
$ dep rollback [to]
您可以将 to 参数设置为释放名称。默认情况下,它将回滚到上一个版本。所有版本都存储在 .dep/release.json 文件中。要显示可用的版本名称,请使用 dep list-releases
。
运行脚本
您可以使用此命令进行完整部署
$ dep build-deploy [stage] [--revision]
$ dep build [stage] [--revision|--branch|--name]
$ dep deploy [stage] [--revision]
参数 revision 是部署所需的,并期望在 build_dir 中存在一个 {{revision}}.zip
文件。
参数和选项
阶段参数
仅在此服务器或服务器组上运行任务。
--revision
指定一个特定的提交以构建和发布。
--tag 或 --branch
两者都相同。设置标签或分支。
--name
设置构建名称(也是发布名称)。
--force
如果设置,则忽略远程的 .lock 文件。仅在之前部署失败时使用此选项。
便利任务
要查看本地构建和远程发布(包括当前的是哪一个),可以使用以下命令
$ dep list-builds
➤ Executing task list-builds
Found builds in "C:\Dev\.builds":
- bbc2760
✔ Ok
$ dep list-releases
➤ Executing task list-releases
Max release cycle count: 5
Found releases on "production":
#0
Name: bbc2760
Path: /html/releases/bbc2760
Date: Sun, 15 Jan 2017 21:35:20 +0100
#1
Name: bbc2760_7
Path: /html/releases/bbc2760_7
Date: Sun, 15 Jan 2017 21:40:07 +0100
#2
Name: bbc2760_8
Path: /html/releases/bbc2760_8
Date: Sun, 15 Jan 2017 21:44:34 +0100
#3
Name: bbc2760_9
Path: /html/releases/bbc2760_9
Date: Sun, 15 Jan 2017 21:44:52 +0100
#10 +++ CURRENT RELEASE! +++
Name: bbc2760_10
Path: /html/releases/bbc2760_10
Date: Fri, 20 Jan 2017 13:26:57 +0100
✔ Ok
注意:当你多次上传相同的构建时,会发生这种情况(_7、_8 等)。