General refactoring

This commit is contained in:
2020-05-30 16:00:49 +02:00
parent 1e3f6f05ec
commit 07cf718ad9
17 changed files with 162 additions and 145 deletions
+34 -24
View File
@@ -1,13 +1,14 @@
<?php
/**
* Project management tools
* projectr
* Tools for deployments and project management
*
* GitLab frontend for deployments
*
* @author Lukas Bestle <mail@lukasbestle.com>
* @author Lukas Bestle <project-projectr@lukasbestle.com>
* @copyright Copyright 2014 Lukas Bestle
* @license MIT
* @file webhook.gitlab.php
*/
@@ -35,16 +36,17 @@ define('TOOLKIT_PATH', '/home/<user>/bin');
* 3. Place this script in a directory in ~/web/ (something like "~/web/hooks.example.com")
* 4. You should now be able to access https://hooks.example.com/webhook.gitlab.php?token=<AUTH_TOKEN>
* This should output "Authenticated, but no POST body sent.".
* 5. Generate an SSH key by using `ssh-keygen`. The default values are alright for this purpose.
* 6. Copy the contents of ~/.ssh/id_rsa.pub to your clipboard and add it as "Deploy Key" in your project's GitLab settings interface.
*
* Then, you can easily create projects and let this script deploy them for you:
* Now you can create projects and let this script deploy them for you:
*
* 7. Create the project on the server by running either `project_add <path> <exact SSH url from GitLab>#<branch to deploy>` or
* 5. If your project is a private repository:
* 5.1. Generate an SSH key by using `ssh-keygen`. The default values are alright for this purpose.
* 5.2. Copy the contents of `~/.ssh/id_rsa.pub` to your clipboard and add it as "Deploy Key" in your project's GitLab settings interface.
* 6. Create the project on the server by running either `project_add <path> <exact SSH url from GitLab>#<branch to deploy>` or
* `site_add <name> <exact SSH url from GitLab>#<branch to deploy>`.
* It's important to use the exact SSH url (not the HTTPS one), so this script can find the project!
* 8. Add the URL (the one you tested in 4.) of the script to your project's web hooks.
* 9. Hit "Test Hook" in GitLab's settings interface. The project should be deployed a few seconds later.
* It's important to use the exact SSH url (not the HTTPS one) so this script can find the project!
* 7. Add the URL (the one you tested in 4.) of the script to your project's web hooks.
* 8. Hit "Test Hook" in GitLab's settings interface. The project should be deployed a few seconds later.
*
* Troubleshooting:
* - Use `tail -f <path to project>/logs/*.log`. This should tell you what went wrong.
@@ -64,27 +66,31 @@ define('TOOLKIT_PATH', '/home/<user>/bin');
header('Content-Type: text/plain');
// Check if an auth token has been set
if(AUTH_TOKEN == '<long token>') {
http_response_code(400);
die('No auth token has been set in ' . basename(__FILE__) . '. This script won\'t work without one.');
if (AUTH_TOKEN === '<long token>') {
http_response_code(500);
die('No auth token has been set in ' . basename(__FILE__) . ". This script won't work without one.");
}
// Check if the authentication is valid
if(!isset($_GET['token']) || $_GET['token'] !== AUTH_TOKEN) {
if (isset($_GET['token']) !== true) {
http_response_code(401);
die('Missing authentication.');
}
if (hash_equals(AUTH_TOKEN, $_GET['token']) !== true) {
http_response_code(403);
die('Invalid authentication.');
}
// Get the request body
$input = file_get_contents('php://input');
if(!$input) {
http_response_code(405);
if (!$input) {
http_response_code(400);
die('Authenticated, but no POST body sent.');
}
// Parse payload
$payload = json_decode($input, true);
if(!is_array($payload)) {
if (is_array($payload) !== true) {
http_response_code(400);
die('Invalid payload (no JSON?).');
}
@@ -93,7 +99,7 @@ if(!is_array($payload)) {
$url = $payload['repository']['url'];
$commit = $payload['after'];
$ref = $payload['ref'];
if(!preg_match('{(?:.*/){2}(.*)}', $ref, $matches)) {
if (preg_match('{(?:.*/){2}(.*)}', $ref, $matches) !== 1) {
http_response_code(400);
die('Invalid ref field (does not match regular expression "(?:.*/){2}(.*)").');
}
@@ -105,23 +111,27 @@ echo "Received commit hash \"$commit\" for repository URL \"$url\" (branch \"$br
// Open ~/.projects and iterate through every project
$listPointer = fopen($_SERVER['HOME'] . '/.projects', 'r');
$exitCode = 0;
while(($project = fgets($listPointer)) !== false) {
while (($project = fgets($listPointer)) !== false) {
// Trim whitespace
$project = trim($project);
// Only deployable projects are interesting for us
if(!is_file($project . '/.origin') || !is_file($project . '/.branch')) continue;
if (is_file($project . '/.origin') !== true || is_file($project . '/.branch') !== true) {
continue;
}
// If there is a .origin and .branch file, check if they match
if(file_get_contents($project . '/.origin') == $url && file_get_contents($project . '/.branch') == $branch) {
if (trim(file_get_contents($project . '/.origin')) === $url && trim(file_get_contents($project . '/.branch')) === $branch) {
// Found the right project
echo "Found project at $project, running deploy script.\n";
// Run deploy script (in the background, because GitLab doesn't like requests > 10sec by default)
passthru('export PATH=' . escapeshellarg(TOOLKIT_PATH) . ':$PATH; project_deploy ' . escapeshellarg($project) . ' ' . escapeshellarg($commit) . ' > /dev/null 2>&1 &', $exitCode);
// Run deploy script (in the background, because GitLab doesn't like responses > 10sec by default)
passthru('export PATH=' . escapeshellarg(TOOLKIT_PATH) . ':$PATH; project_deploy ' . escapeshellarg($project) . ' ' . escapeshellarg($commit) . ' &> /dev/null &', $exitCode);
// If it didn't work, add debug statement
if($exitCode !== 0) echo "Something didn't work.\n";
if ($exitCode !== 0) {
echo "Something didn't work.\n";
}
}
}