laipower/wp-content/plugins/static-html-output-plugin/plugin/deployers/GitLab.php

16 lines
6.4 KiB
PHP
Raw Normal View History

2020-04-07 13:03:04 +00:00
<?php
class WP2Static_GitLab extends WP2Static_SitePublisher { public function __construct() { $this->loadSettings( 'gitlab' ); $this->files_in_repo_list_path = $this->settings['wp_uploads_path'] . '/WP2STATIC-GITLAB-FILES-IN-REPO.txt'; $this->previous_hashes_path = $this->settings['wp_uploads_path'] . '/WP2STATIC-GITLAB-PREVIOUS-HASHES.txt'; if ( defined( 'WP_CLI' ) ) { return; } switch ( $_POST['ajax_action'] ) { case 'gitlab_prepare_export': $this->bootstrap(); $this->loadArchive(); $this->getListOfFilesInRepo(); $this->prepareDeploy( true ); break; case 'gitlab_upload_files': $this->bootstrap(); $this->loadArchive(); $this->upload_files(); break; case 'test_gitlab': $this->test_file_create(); break; } } public function upload_files() { $this->files_remaining = $this->getRemainingItemsCount(); if ( $this->files_remaining < 0 ) { echo 'ERROR'; die(); } $this->initiateProgressIndicator(); $batch_size = $this->settings['deployBatchSize']; if ( $batch_size > $this->files_remaining ) { $batch_size = $this->files_remaining; } $lines = $this->getItemsToDeploy( $batch_size ); $files_in_tree = file( $this->files_in_repo_list_path, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES ); $files_in_tree = array_filter( $files_in_tree ); $files_in_tree = array_unique( $files_in_tree ); $files_data = array(); $this->openPreviousHashesFile(); foreach ( $lines as $line ) { list($local_file, $target_path) = explode( ',', $line ); $local_file = $this->archive->path . $local_file; if ( ! is_file( $local_file ) ) { continue; } if ( isset( $this->settings['glPath'] ) ) { $target_path = $this->settings['glPath'] . '/' . $target_path; } $local_file_contents = file_get_contents( $local_file ); if ( in_array( $target_path, $files_in_tree ) ) { if ( isset( $this->file_paths_and_hashes[ $target_path ] ) ) { $prev = $this->file_paths_and_hashes[ $target_path ]; $current = crc32( $local_file_contents ); if ( $prev != $current ) { $files_data[] = array( 'action' => 'update', 'file_path' => $target_path, 'content' => base64_encode( $local_file_contents ), 'encoding' => 'base64', ); } } else { $files_data[] = array( 'action' => 'update', 'file_path' => $target_path, 'content' => base64_encode( $local_file_contents ), 'encoding' => 'base64', ); } } else { $files_data[] = array( 'action' => 'create', 'file_path' => $target_path, 'content' => base64_encode( $local_file_contents ), 'encoding' => 'base64', ); } $this->recordFilePathAndHashInMemory( $target_path, $local_file_contents ); $this->updateProgress(); } $this->pauseBetweenAPICalls(); $commits_endpoint = 'https://gitlab.com/api/v4/projects/' . $this->settings['glProject'] . '/repository/commits'; try { require_once dirname( __FILE__ ) . '/../WP2Static/Request.php'; $client = new WP2Static_Request(); $post_options = array( 'branch' => 'master', 'commit_message' => 'WP2Static Deployment', 'actions' => $files_data, ); $headers = array( 'PRIVATE-TOKEN: ' . $this->settings['glToken'], 'Content-Type: application/json', ); $client->postWithJSONPayloadCustomHeaders( $commits_endpoint, $post_options, $headers ); $this->checkForValidResponses( $client->status_code, array( '200', '201', '301', '302', '304' ) ); $this->writeFilePathAndHashesToFile(); } catch ( Exception $e ) { $this->handleException( $e ); } if ( $this->uploadsCompleted() ) { $this->createGitLabPagesConfig(); $this->finalizeDeployment(); } } public function addToListOfFilesInRepos( $items ) { file_put_contents( $this->files_in_repo_list_path, implode( PHP_EOL, $items ) . PHP_EOL, FILE_APPEND | LOCK_EX ); } public function getFilePathsFromTree( $json_response ) { $partial_tree_array = json_decode( (string) $json_response, true ); $formatted_elements = array(); foreach ( $partial_tree_array as $object ) { if ( $object['type'] === 'blob' ) { $formatted_elements[] = $object['path']; } } return $formatted_elements; } public function getRepositoryTree( $page ) { $tree_endpoint = 'https://gitlab.com/api/v4/projects/' . $this->settings['glProject'] . '/repository/tree?recursive=true&per_page=100&page=' . $page; require_once dirname( __FILE__ ) . '/../WP2Static
pages:
stage: deploy
script:
- mkdir .public
- cp -r * .public
- mv .public public
artifacts:
paths:
- public
only:
- master
EOD;
$target_path = $this->archive->path . '.gitlab-ci.yml'; file_put_contents( $target_path, $config_file ); chmod( $target_path, 0664 ); $export_line = '.gitlab-ci.yml,.gitlab-ci.yml'; file_put_contents( $this->export_file_list, $export_line . PHP_EOL, FILE_APPEND | LOCK_EX ); chmod( $this->export_file_list, 0664 ); } } $gitlab = new WP2Static_GitLab();