1. 使用 docker 下载一个官方的 composer 镜像. 执行 docker pull composer

  2. 启动并进入镜像

    docker run -it --name php-gist-migrate --volume /data/srv/composer-app:/app composer /bin/bash
    

    先设置为国内的镜像

    composer config -g repo.packagist composer <https://packagist.phpcomposer.com>
    # 解除镜像并恢复到 packagist
    # composer config -g --unset repos.packagist
    

    运行 composer 的自带建项目功能, 执行如下脚本

    composer create-project composer/satis php-gist --stability=dev --keep-vcs
    

    它下载了 satis 用于构建一个私有仓库,它通过扫描gitlab上的版本库信息建立仓库索引,并将索引提供给composer客户端获取。

    代码最终依旧是客户端直接向gitlab下载的,相关的权限验证依旧由gitlab把控。

  3. 在satis目录下放置一个satis.json配置文件,在其中罗列所有gitlab上希望发布的包信息

    {
      "name": "Private Repository",
      "homepage": "<http://packagist.baidu.com>",
      "repositories": [
        {
            "type": "git",
            "url": "<https://gitlab-team.baidu.com/baidu/php-common>"
        }
      ],
      "require": {
          "baidu/common": "*"
      }
    }
    

    千万不要使用require-all选项,而是应该在require中罗列每个包(require-all的意思是将官方仓库的所有包索引到本地)。

    在这个过程中配置到相应的访问 gitlab 的 ssh key

  4. 在 satis 根目录下执行如下语句

    php bin/satis build satis.json ./web
    

    将会自动构建出对应的 web 资源, 然后我们在 nginx 上指定该路径即可.

    server {
        listen  80;
        server_name <your gist domain>;
        index index.html index.php;
        root /data/srv/composer-app/php-gist/web; # 前文docker挂载的目录
    }
    

    到这里就可以访问到对应网页了.

定时更新仓库索引

在前面我们只是手动获取了当前 gitlab 上的项目, 但是当 gitlab 上有版本变化时, 就需要去更新仓库索引信息.

我们需要定时让satis扫描gitlab上的版本变化, 只需要将下面的任务添加到 crontab 中即可

*/15 * * * * flock -xn /var/run/satis.lock -c '/usr/local/bin/php /app/php-gist/bin/satis build /app/php-gist/satis.json /app/php-gist/web'

该命令可以防止并发执行多个satis,同时会将构建好的静态索引文件存储到web目录。

注意, composer 该镜像基于 简化版 alpine , 所以安装包要使用 apk add 命令

我们需要手动启动 cron 服务, 进入镜像之后执行

/usr/sbin/crond -f -l 8

然后按 ctrl + p, ctrl + q 退出镜像

语义化版本控制

satis会自动识别gitlab上的分支与tag。

作为tag发布的版本均被composer视为stable稳定版本,例如1.0.0,1.0.1的tag会被Composer索引为1.0.0与1.0.1。

在普通分支中的代码是非stable(非稳定)版本,composer会在索引时在它们的分支名前增加dev-前缀,例如master分支的composer版本为dev-master。

我们总是应该依赖stable版本,而不是依赖一个开发中的dev-master版本。