Have you ever wanted to split some of your code from your project into components... maybe read-only github repositories like Symfony and Laravel?
Well, I certainly did. It took me a while to find a good way to do it and now I'm going to help you do the same. This subsplit project will help you to automate the process with webhooks and/or scheduled commands.
git push webhook that runs the subtree split command from a github, bitbucket, or gitlab webhook
A flashtag:subsplit
command will run the subtree split command and publish to the subtree repositories.
Install with composer:
composer create-project flashtag/subsplit-service --prefer-dist
From the project directory:
cd .git-subsplit; ./install.sh
Edit the build/flashtag-subsplit.sh file to match your repo, and this package should actually just work almost out-of-the-box for your own repos as well.
git subsplit init [email protected]:flashtag/flashtag.git
git subsplit publish --heads="master" app/Admin:[email protected]:flashtag/admin.git
git subsplit publish --heads="master" app/Api:[email protected]:flashtag/api.git
git subsplit publish --heads="master" app/Client:[email protected]:flashtag/client.git
git subsplit publish --heads="master" app/Cms:[email protected]:flashtag/cms.git
git subsplit publish --heads="master" app/Data:[email protected]:flashtag/data.git
rm -rf .subsplit/
Would change to look like:
git subsplit init [email protected]:Foobar/Parent.git
git subsplit publish --heads="master" src/One:[email protected]:Foobar/one.git
git subsplit publish --heads="master" src/Two:[email protected]:Foobar/two.git
git subsplit publish --heads="master" src/Three:[email protected]:Foobar/three.git
# . . .
# etc.
# . . .
rm -rf .subsplit/
Copy the example environment file cp .env.example .env
and change the appropriate properties.
Uncomment the line corresponding to the service you are using to send the webhook in app/Http/routes/php
and comment out any you aren't using.
Currently, the gitlab route is commented out by default because I don't know of any way to validate the request.
// Github
$app->post('github', [
'middleware' => 'github',
'uses' => 'App\Http\Controllers\WebhooksController@push',
]);
// Bitbucket
$app->post('bitbucket', [
'middleware' => 'bitbucket',
'uses' => 'App\Http\Controllers\WebhooksController@push',
]);
// // Gitlab
// $app->post('gitlab', [
// 'middleware' => 'gitlab',
// 'uses' => 'App\Http\Controllers\WebhooksController@push',
// ]);
The WEBHOOK_SECRET
is what you will also set the secret
property to in the github webhook setup:
Your github push webhook payload url path is /webhooks/github
so an example webhook url would look something like https://subsplit.whateveryourdomain.com/webhooks/github
Your bitbucket push webhook url path is /webhooks/bitbucket
so an example webhook url would look something like https://subsplit.whateveryourdomain.com/webhooks/bitbucket
Your gitlab push webhook url path is /webhooks/gitlab
so an example webhook url would look something like https://subsplit.whateveryourdomain.com/webhooks/gitlab
You can either use the scheduler as lumen intended in the app/Console/Kernel
, by setting up this cron job:
* * * * * php /path/to/project/artisan schedule:run
or schedule the command yourself. For my own project, I've set up this cron job to just execute this every night:
0 0 * * * php /path/to/project/artisan flashtag:subsplit
Sometimes re-inventing the wheel is a good idea and sometimes you have great packages like: