// Генерируем ключи
$ cd ~/.ssh
ssh-keygen -t rsa
// Созданный ключ (.pub) копируем и вставляем в настройках аккаунта Bitbucket https://bitbucket.org/account/user/username/ssh-keys/
// Создаем конфиг если его нет
$ nano /home/.ssh/config
// Вставляем в конфиг
Host bitbucket.org
IdentityFile ~/.ssh/id_rsa
Если далее будет проблема с ключами, проверить права доступа к ним, если что выставить:
$ chmod 0755 /home/.ssh
$ chmod 0600 /home/.ssh/id_rsa
$ chmod 0600 /home/.ssh/id_rsa.pub
$ chmod 0644 /home/.ssh/known_hosts // Если этого файла нет, система создаст его сама
// Создаем каталог для репозиториев
$ mkdir /home/data/git
// Переходим в него
$ cd /home/data/git
// Клонируем репозиторий (здесь будут только файлы git)
$ git clone --mirror git@bitbucket.org:username/example.git
// Переходим в папку репозитория
$ cd example.git
// Указываем репозиторию каталог куда деплоить файлы
$ GIT_WORK_TREE=/home/www/example.com git checkout -f master
// Создаем скрипт деплоя
$ cd /home/www/example.com
// Папка где будет лежать скрипт
$ mkdir deploy
// Файл для храниния логов
$ touch deploy.log
$ touch index.html
// Сам скрипт
$ nano deploy.php
// Содержимое скрипта
<?php
// Examine the Bitbucket payload that’s being sent to deployment script
file_put_contents('deploy.log', serialize($_POST['payload']) . "\n", FILE_APPEND);
$repo_dir = '/home/data/git/example.git';
$master_dir = '/home/www/dev.example.com';
$production_dir = '/home/www/example.com';
// Full path to git binary is required if git is not in your PHP user's path. Otherwise just use 'git'.
$git_bin_path = 'git';
$update = false;
// Parse data from Bitbucket hook payload
$payload = json_decode($_POST['payload']);
if (empty($payload->commits)){
// When merging and pushing to bitbucket, the commits array will be empty.
// In this case there is no way to know what branch was pushed to, so we will do an update.
$update = true;
} else {
foreach ($payload->commits as $commit) {
$branch = $commit->branch;
if ($branch === 'master' || isset($commit->branches) && in_array('master', $commit->branches)) {
$update = true;
break;
}
elseif ($branch === 'production' || isset($commit->branches) && in_array('production', $commit->branches)) {
$update = true;
break;
}
}
}
if ($update) {
// Do a git checkout to the web root
exec('cd ' . $repo_dir . ' && ' . $git_bin_path . ' fetch');
exec('cd ' . $repo_dir . ' && GIT_WORK_TREE=' . $master_dir . ' ' . $git_bin_path . ' checkout -f master');
exec('cd ' . $repo_dir . ' && GIT_WORK_TREE=' . $production_dir . ' ' . $git_bin_path . ' checkout -f production');
// Log the deployment
$commit_hash = shell_exec('cd ' . $repo_dir . ' && ' . $git_bin_path . ' rev-parse --short HEAD');
file_put_contents('deploy.log', date('m/d/Y h:i:s a') . " Deployed branch: " . $branch . " Commit: " . $commit_hash . "\n", FILE_APPEND);
}
?>
!!!ВНИМАНИЕ
На хостинге должны быть установлен GIT
Необходим SSH доступ
В PHP должна быть включена функция exec (иначе не будут выполняться команды в скрипте)
настройка автоматического дейпойта на сервер из репозитория bitbucket
// В скрипте следует указывать полные пути
Например для $git_bin_path можно узнать путь так:
which git
// Для каталогов можно воспользроваться командой
pwd
На хостинге должны быть установлен GIT
Необходим SSH доступ
В PHP должна быть включена функция exec (иначе не будут выполняться команды в скрипте)
настройка автоматического дейпойта на сервер из репозитория bitbucket
// В скрипте следует указывать полные пути
Например для $git_bin_path можно узнать путь так:
which git
// Для каталогов можно воспользроваться командой
pwd
Be the first to comment
You can use [html][/html], [css][/css], [php][/php] and more to embed the code. Urls are automatically hyperlinked. Line breaks and paragraphs are automatically generated.