realshadow/satis-control-panel

Satis Control Panel (SCP) 是一个用于管理您的 Composer 包的 Satis 仓库的简单 Web UI。

1.1.0 2018-06-25 12:19 UTC

This package is auto-updated.

Last update: 2024-09-19 02:05:35 UTC


README

Scrutinizer Code Quality Build Status

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,然后编辑 namehomepage 属性。

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}/publichttp://{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选项

POSTPUT 请求期间,可以提供两个额外的选项

  • 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

替代方案