realshadow / satis-control-panel
Satis Control Panel (SCP) 是一个用于管理您的 Composer 包的 Satis 仓库的简单 Web UI。
Requires
- php: >=5.5.9
- composer/composer: ^1.4
- composer/satis: ^1.0@alpha
- jms/serializer: ^1.0
- laravel/framework: 5.1.*
Requires (Dev)
- barryvdh/laravel-ide-helper: ^2.1
- fzaninotto/faker: ~1.4
- mockery/mockery: 0.9.*
- phpspec/phpspec: ~2.1
- phpunit/phpunit: ~4.0
README
Satis Control Panel
Satis Control Panel (SCP) 是一个用于管理您的 Satis 仓库 的 Composer 包 的简单 Web UI。
SCP 后端使用 Laravel 编写,并搭配 React + Typescript。
功能
- 用于管理私有包和从 Packagist 镜像的公共包的 Satis 配置文件的简单 UI
- 无需数据库 - 仅需 PHP 和可选的 Nodejs 服务器以自动生成 Satis 配置文件
- RESTful API 以与 CI 服务集成
- SCP 随带 Atlassian 插件 Bamboo 和 Stash,以简化包构建管理
- 用于自动构建从 Packagist 镜像的公共包的 Cron 作业
安装
您可以使用 Composer 直接安装 SCP,方法如下:
composer create-project realshadow/satis-control-panel [--stability-dev]
之后,您可以将 example.env 重命名为 .env 并设置所需的配置选项。
构建 JavaScript
npm run build
// or
npm run build-win
在开发期间,您可以使用以下命令启动 Webpack 开发服务器:
npm start
或者使用以下命令运行 Gulp 监视 less 文件:
gulp watch
Satis 配置文件
在 resources/ 目录中,您将找到 satis.json.dist 文件,它包含默认的 Satis 配置。复制此文件并将其重命名为 satis.json,然后编辑 name 和 homepage 属性。
cp resources/satis.json.dist resources/satis.json
完成时,您必须为您的配置文件设置正确的权限,以便 Web 用户可以读取/写入。例如,www-data 应该能够读取/写入此文件)。更多内容请参阅下一节的 权限。
权限
为了正确构建,您必须为几个目录设置正确的权限
- bootstrap/cache/
- storage/
- public/private/
- public/public/
- resources/satis.json
每个目录/文件都应该由 Web 用户可读/可写,例如 www-data。例如
chmod -R ug+rwx bootstrap/cache storage public/private public/public
chmod ug+rwx resources/satis.json
Web 服务器设置
根据默认的 Laravel 设置,您的文档根应指向根目录中的 public 文件夹
Apache - 示例虚拟主机
<VirtualHost *:80>
ServerName satis.example.com
DocumentRoot /var/www/html/satis.example.com/public
</VirtualHost>
Nginx - 示例虚拟主机
server {
listen 80 default_server;
root /var/www/html/satis.example.com/public;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
# pass the PHP scripts to FastCGI server liste_ning on /var/run/php5-fpm.sock
location ~ \.php$ {
try_files $uri /index.php =404;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
访问您的控制面板和生成的包
控制面板位于 http://{host}/control-panel,而包将在(当然是在第一次构建之后)分别位于 http://{host}/public 和 http://{host}/private。
以这种方式分离它们可以增加一些配置选项。例如,如果您只想使用私有包,则可以将 private_repository 配置选项的目录更改为 public 而不是 public/private,并将包生成在 http://{host},同时仍然拥有一个功能齐全的控制面板。
配置选项
以下是在 config/satis.php 中可以设置的配置选项列表(其中一些也可以在 .env 文件中设置,以便方便使用)
注意:如果您更改默认目录,请记住为新目录设置正确的权限。
工作原理
SCP管理单个Satis配置文件,该文件在执行特定UI操作时动态生成。在每个生成周期中,文件被分割成公共和私有仓库配置文件,因为私有包使用的功能与Packagist不兼容(它将尝试镜像整个Packagist仓库)。
除了从配置文件中添加、编辑和删除包/仓库外,UI还允许您构建/重建每个包或运行所有已注册包/仓库的完整重建。
构建过程可以同步运行或异步运行(通过将输出重定向到/dev/null并启动新进程)。默认情况下,所有构建都异步运行,但在Windows上它们被强制同步运行。这也可以通过将async_mode设置为false在API请求期间强制执行。
缺失或损坏的镜像配置文件
由于配置文件镜像是由任何UI操作触发的,因此这并不总是正确的行为。如果您想手动触发配置生成,例如直接在服务器上进行更改时,可以使用以下Artisan命令来触发配置生成
php artisan satis:make:config
UI状态
在构建过程中,整个UI被锁定。在异步构建过程中,UI状态由Node服务器处理,但运行它是完全可选的。
它可以启动
npm run server
默认情况下,它将在端口9010上运行。这可以在node/config.json文件中更改。
如果由于某些原因UI保持锁定状态,尽管目前没有包正在构建,可以通过运行来解锁
php artisan satis:persister:unlock
Composer认证
Composer文件auth.json可以放在COMPOSER_HOME目录中,您可以在此处放置您的GitHub令牌或用于私有仓库的凭据。
私有包
私有包通过仓库URL地址进行识别。当您添加/编辑新仓库时,您可以选择其类型。默认情况下,所有仓库都被视为VCS仓库。构建和重建由这个PR中引入的partial update功能处理,只有具有URL的仓库可以在UI中管理。这包括
- vcs
- hg
- pear
- composer
- artifact
- path
计划在未来添加对更多仓库类型的支持。
私有包使用repositories配置键,将require-all选项设置为true,因此所有已知的包都被从注册的仓库中取出,这意味着Packagist必须默认禁用。这将在配置文件分割为私有和公共部分时处理。
公共(Packagist)包
公共包用于镜像可以从Packagist安装的现有包,如果您在企业代理后面,可以加快整体开发和部署时间。
这里添加的所有包及其所有依赖项都完全镜像(但我们仍然跳过dev-dependencies)。目前只使用一个版本约束,即*,因此我们可以得到完整的Packagist克隆。
计划在未来添加对自定义版本约束的支持。
由于在这种情况下完全重建可能需要几个小时,您可以使用提供的Cron任务进行每日重建(请参阅Cron任务部分)。
请注意,您不应该尝试镜像整个Packagist仓库!
RESTful API
SCP内置API,便于与您最喜欢的CI解决方案集成。
私有包
私有包使用md5编码的仓库URL作为ID。
- 获取所有仓库
GET control-panel/api/repository
- 获取一个仓库
GET control-panel/api/repository/{repository_id}
- 添加新仓库
POST control-panel/api/repository
{
'url': 'foo',
'type: 'bar'
}
- 更新现有仓库
PUT control-panel/api/repository/{repository_id}
{
'url': 'foo',
'type: 'bar'
}
- 删除现有仓库
DELETE control-panel/api/repository/{repository_id}
所有方法在没有找到仓库时返回HTTP 404。
注意:可以通过将 repository 替换为 package 来使用相同的API处理公共包。尽管远程控制公共包不是必需的。
额外的API选项
在 POST 和 PUT 请求期间,可以提供两个额外的选项
- async_mode - true/false => 如果构建应同步运行或异步运行(默认所有构建都异步运行)
- disable_build - true/false => 如果设置为
true,则不会运行 Satis 构建命令
日志
所有日志都可以在 storage/logs 目录中找到。日志分为
- api_request.log - 记录所有API请求
- builder_async.log - 记录所有异步运行的构建,请注意,每个异步构建都有自己的日志文件,位于
async子目录中,由其时间戳标识 - builder_sync.log - 记录所有同步运行的构建
- cron.log - 用于cron任务日志
cron任务
由于公共包的镜像可能需要一些时间,并且从UI运行完整重建不是一个好主意,因为这会在构建过程中锁定它,SCP 内置了一个每日运行的cron任务,将重建所有仓库。可以通过类似以下的cron条目来触发
* * * * * php /path/to/satis-folder/artisan schedule:run >> /dev/null 2>&1
或者,您可以添加以下cron条目
00 00 * * * curl --request POST --header "Content-Length: 0" --header "X-Requested-With: XMLHttpRequest" http://{scp-url-address}/control-panel/build-public
这也可以用于私有包
00 00 * * * curl --request POST --header "Content-Length: 0" --header "X-Requested-With: XMLHttpRequest" http://{scp-url-address}/control-panel/build-private
Atlassian插件
SCP是在使用Atlassian Stash和Bamboo作为CI的一部分的环境中创建的,因此需要两个插件来完全将Composer包集成到我们的构建过程中。
- Stash Satis Build Hook - 一个post receive钩子,将在SCP中注册并触发您的包的构建/重建(如果您想跳过部署过程)
- Bamboo Satis Build - 一个部署任务,用于在Satis仓库中重建当前部署的Composer包
两者都使用在这个PR中引入的 partial update 功能。
TODO
- 为公共包导入composer.lock文件选项
- 使用更多类型私有包的选项
- 为公共包编写自定义版本约束选项
- 查看公共包长时间运行的构建过程选项
- 更好地处理同时写入/读取时的竞态条件
- 认证?(这可以通过htpasswd简单地处理)
- ????
欢迎PR