使用 Satis 搭建私有的 Composer 包倉庫

iBrand發表於2019-02-16

簡述

iBrand 產品立項時是商業性質的專案,但是在搭建架構時考慮後續的通用性,因此每個模組都設計成一個 Package,作為公司內部用,因此這些包並不能提交到 packagist.org 上去。 所以就想是否能夠搭建私有的包倉庫,實現一個私有的 packagist 。

仔細翻閱 Composer 文件,發現官方有相應的解決方案:Handling private packages

這裡推薦使用 Satis ,也正是我們目前使用的方案,目前執行一切良好。

Satis 是一個靜態的 composer 資源庫生成器。它像是一個超輕量級的、基於靜態檔案的 packagist 版本。

你給它一個包含 composer.json 的儲存庫,定義好 VCS 和 資源庫。它會獲取所有你列出的包,並列印 packages.json 檔案,作為 composer 型別的資源庫。

說明

伺服器環境

  1. centos7.2
  2. nginx
  3. php7.1

程式碼管理平臺:碼雲

文章中儘量以一個真實的情況來撰寫,但是文章的倉庫地址,網頁地址均是不可訪問的,用虛擬資訊替換了真實資訊。

Create Private Git Project

既然為公司內部專案原始碼是不公開的,我們選擇了碼雲,未選擇 github,主要有兩個原因:

  1. github 因為是國外伺服器,國內偶爾會抽風。
  2. 國內也有比較優秀的 git 程式碼託管平臺,免費支援 Private Project。比如:碼雲Coding

github private project 是收費的,對於一個公司來說費用不高,但是加上以上兩點原因後,所以未選擇。

假設我們已經在碼雲上建立好了私有專案,並且已經編寫好了所有的程式碼和單元測試。

ssh 地址: git@gitee.com:iBrand/test-private-composer.git

composer.json

{
  "name": "iBrand/test-private-composer",
  "type": "library",
  "description": "iBrand test private composer",
  "keywords": [
    "iBrand crop",
    "private composer",
  ],
  "license": "MIT",
  "authors": [
    {
      "name": "shjchen",
      "email": "ibrand.shjchen@foxmail.com"
    }
  ],
  "require": {
    "php": "^5.6|^7.0",
  },
  "autoload": {
    "psr-4": {
       "iBrand\Prviate\Composer\": "src/"
    }
  },

  "minimum-stability": "dev",
  "prefer-stable": true
}

Create Satis Server

Install

$ cd /data/www/
$ composer create-project composer/satis company-private-composer --stability=dev --keep-vcs

Setup

$ cd /data/www/company-private-composer
$ vi satis.json
{
  "name": "iBrand Private Composer Repository", 
  "homepage": "http://packagist.iBrand.com",
  "repositories": [
    { "type": "vcs", "url": "git@gitee.com:iBrand/test-private-composer.git" }
    // more vcs url.
  ],
  "require": {
    "ibrand/test-private-composer": "*",
    // you more package.
    },
  "archive": {
        "directory": "dist",
        "format": "tar",
        "prefix-url": "http://packagist.iBrand.com"
    }
}

解釋下 satis.json 配置檔案

  • name:倉庫名稱,可以隨意定義
  • homepage:倉庫主頁地址
  • repositories:指定包源
  • require:指定包源版本,* 程式碼編譯所有版本,如果想獲取所有包,使用 require-all: true,
  • directory: required, the location of the dist files (inside the output-dir)
  • format: optional, zip (default) or tar
  • prefix-url: optional, location of the downloads, homepage (from satis.json) followed by directory by default

Authentication

在進行 Build 前,我們需要解決程式碼許可權問題,因為前面的專案原始碼是私有的,所以伺服器上需要有讀取原始碼的許可權,依然以碼雲舉例:

生成ssh公鑰

你可以按如下命令來生成 sshkey:

$ ssh-keygen -t rsa -C "xxxxx@xxxxx.com" 
# Generating public/private rsa key pair...
# 三次回車即可生成 ssh key

檢視你的 public key,並把他新增到碼雲(Gitee.com) SSH key新增地址:https://gitee.com/profile/ssh…

$ cat ~/.ssh/id_rsa.pub
# ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC6eNtGpNGwstc....

Build

php bin/satis build satis.json public/

執行後會在 /data/www/company-private-composer/public 生成倉庫列表

clipboard.png

Setup Nginx

上一步已經生成了倉庫列表,為了保證可訪問需要通過 nginx or apache 把服務暴露出去,我們使用的是 nginx ,因此以 nginx 舉例。

server {
    listen  80;
    server_name packagist.iBrand.com;
    root /data/www/company-private-composer/public;
    index index.php index.html;

    access_log /data/logs/packages-access.log;
    error_log  /data/logs/packages-error.log error;
    rewrite_log on;
    
    location ~* .php$ {
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
    }

    location = /favicon.ico {
            log_not_found off;
            access_log off;
    }
}

配置好後需要執行 service nginx reload ,然後就可以通過訪問 http://packagist.iBrand.com 看到自己的倉庫列表,如下圖:

clipboard.png

Usage

接下來就可以在專案中使用這個私有的 Composer 包倉庫。

新增如下配置到專案中的 composer.json 檔案中

"require": {
    "iBrand/test-private-composer": "~1.0"
  }
"config": {
    "preferred-install": "dist",
    "secure-http": false
  },
  "repositories": [
    {
      "type": "composer",
      "url": "http://packagist.iBrand.com/"
    }
  ]

待續

  1. 實現 webhooks 原始碼更新時自動 Build

參考資料

  1. Handling private packages
  2. Hosting your own package
  3. 使用私有資源庫

討論交流

iBrand聯絡我們

相關文章