Автоматический деплой на хостинг из Bitbucket

// Генерируем ключи $ 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

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.