diff --git a/Dockerfile b/Dockerfile index ee1a1ba..8470c15 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,8 @@ # syntax=docker/dockerfile:1 + +ARG BUILDER_CONFIGURATION="release" FROM php:8.4-apache@sha256:51da594c844a97f31b1cd6b1ac6660982f40788f4fe13e75f7fd39e2f9b58651 AS composer-builder +ENV BUILDER_PLATFORM=docker-composer # Install Zip to use composer RUN apt-get update && apt-get install -y \ @@ -15,12 +18,29 @@ RUN composer self-update USER www-data WORKDIR /composer COPY composer.* /composer/ -RUN composer install + +# Consume the build argment +ARG BUILDER_CONFIGURATION +RUN if [ "$BUILDER_CONFIGURATION" = "debug" ]; then \ + # composer install --dev deprecated + COMPOSER_NO_DEV=0 composer install ; \ + else \ + COMPOSER_NO_DEV=1 composer install ; \ + fi # Site FROM php:8.4-apache@sha256:51da594c844a97f31b1cd6b1ac6660982f40788f4fe13e75f7fd39e2f9b58651 +ENV BUILDER_PLATFORM=docker + COPY resources/keyman-site.conf /etc/apache2/conf-available/ -RUN cp /usr/local/etc/php/php.ini-production /usr/local/etc/php/php.ini + +ARG BUILDER_CONFIGURATION +RUN if [ "$BUILDER_CONFIGURATION" = "debug" ]; then \ + cp /usr/local/etc/php/php.ini-development /usr/local/etc/php/php.ini ; \ + else \ + cp /usr/local/etc/php/php.ini-production /usr/local/etc/php/php.ini ; \ + fi + RUN echo memory_limit = 1024M >> /usr/local/etc/php/php.ini RUN chown -R www-data:www-data /var/www/html/ diff --git a/build.sh b/build.sh index 5b5abd2..dd5ed38 100755 --- a/build.sh +++ b/build.sh @@ -56,13 +56,14 @@ builder_run_action stop:app stop_docker_container $API_KEYMAN_IMAGE_NAME $API function build_docker_container_db() { local IMAGE_NAME=$1 local CONTAINER_NAME=$2 + local BUILDER_CONFIGURATION=$3 # Download docker image. --mount option requires BuildKit DOCKER_BUILDKIT=1 docker build -t $API_KEYMAN_DB_IMAGE_NAME -f mssql.Dockerfile . } -builder_run_action build:db build_docker_container_db $API_KEYMAN_DB_IMAGE_NAME $API_KEYMAN_DB_CONTAINER_NAME -builder_run_action build:app build_docker_container $API_KEYMAN_IMAGE_NAME $API_KEYMAN_CONTAINER_NAME +builder_run_action build:db build_docker_container_db $API_KEYMAN_DB_IMAGE_NAME $API_KEYMAN_DB_CONTAINER_NAME $BUILDER_CONFIGURATION +builder_run_action build:app build_docker_container $API_KEYMAN_IMAGE_NAME $API_KEYMAN_CONTAINER_NAME $BUILDER_CONFIGURATION # Custom start actions for db and app different from shared-sites function start_docker_container_db() { @@ -71,6 +72,7 @@ function start_docker_container_db() { local CONTAINER_DESC=$3 # HOST not applicable local PORT=$4 + local BUILDER_CONFIGURATION=$5 local CONTAINER_ID=$(get_docker_container_id $CONTAINER_NAME) if [ ! -z "$CONTAINER_ID" ]; then @@ -86,7 +88,7 @@ function start_docker_container_db() { fi # Setup database - builder_echo "Setting up DB container" + builder_echo "Setting up DB container using $BUILDER_CONFIGURATION configuration" docker run --rm -d -p $PORT:1433 \ -e "ACCEPT_EULA=Y" \ -e "MSSQL_AGENT_ENABLED=true" \ @@ -107,6 +109,7 @@ function start_docker_container_app() { local CONTAINER_DESC=$3 local HOST=$4 local PORT=$5 + local BUILDER_CONFIGURATION=$6 _verify_vendor_is_not_folder @@ -140,7 +143,7 @@ function start_docker_container_app() { db_ip=$(docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' ${API_KEYMAN_DB_IMAGE_NAME}) - builder_echo "Spooling up site container" + builder_echo "Spooling up site container using $BUILDER_CONFIGURATION configuration" docker run --rm -m 200m -d -p $PORT:80 -v ${SITE_HTML} \ -e 'api_keyman_com_mssql_pw=yourStrong(\!)Password' \ @@ -170,14 +173,14 @@ function start_docker_container_app() { builder_die "Docker container appears to have failed to start in order to run init-container.sh script" fi - docker exec -i $CONTAINER_ID sh -c "./resources/init-container.sh" + docker exec -i $CONTAINER_ID sh -c "./resources/init-container.sh ${BUILDER_CONFIGURATION}" fi builder_echo green "Listening on http://$HOST:$PORT" } -builder_run_action start:db start_docker_container_db $API_KEYMAN_DB_IMAGE_NAME $API_KEYMAN_DB_CONTAINER_NAME $API_KEYMAN_DB_CONTAINER_DESC $PORT_API_KEYMAN_COM_DB -builder_run_action start:app start_docker_container_app $API_KEYMAN_IMAGE_NAME $API_KEYMAN_CONTAINER_NAME $API_KEYMAN_CONTAINER_DESC $HOST_API_KEYMAN_COM $PORT_API_KEYMAN_COM +builder_run_action start:db start_docker_container_db $API_KEYMAN_DB_IMAGE_NAME $API_KEYMAN_DB_CONTAINER_NAME $API_KEYMAN_DB_CONTAINER_DESC $PORT_API_KEYMAN_COM_DB $BUILDER_CONFIGURATION +builder_run_action start:app start_docker_container_app $API_KEYMAN_IMAGE_NAME $API_KEYMAN_CONTAINER_NAME $API_KEYMAN_CONTAINER_DESC $HOST_API_KEYMAN_COM $PORT_API_KEYMAN_COM $BUILDER_CONFIGURATION builder_run_action test:app test_docker_container $API_KEYMAN_CONTAINER_DESC $PORT_API_KEYMAN_COM / diff --git a/resources/.bootstrap-required-version b/resources/.bootstrap-required-version index 3ec7c5c..4b296b2 100644 --- a/resources/.bootstrap-required-version +++ b/resources/.bootstrap-required-version @@ -1 +1 @@ -v1.0.17 +v1.0.21 diff --git a/resources/init-container.sh b/resources/init-container.sh index 2f98400..37a09a9 100755 --- a/resources/init-container.sh +++ b/resources/init-container.sh @@ -1,5 +1,7 @@ #!/usr/bin/env bash +echo "init-container.sh $1" + openssl version uname -a diff --git a/script/developer/14.0/update/DeveloperUpdateCheck.php b/script/developer/14.0/update/DeveloperUpdateCheck.php index 1af8f17..174c2b9 100644 --- a/script/developer/14.0/update/DeveloperUpdateCheck.php +++ b/script/developer/14.0/update/DeveloperUpdateCheck.php @@ -11,9 +11,12 @@ class DeveloperUpdateCheck { const SETUP_REGEX = '/^keymandeveloper-.+\.exe/'; + private $mssql; private $isManual; private $currentTime; // used mainly for unit testing + public $DownloadVersions; + public function execute($mssql, $tier, $appVersion, $isManual, $currentTime = null) { $this->mssql = $mssql; diff --git a/script/search/1.0/search.php b/script/search/1.0/search.php index 7c423d8..2acc515 100644 --- a/script/search/1.0/search.php +++ b/script/search/1.0/search.php @@ -58,6 +58,7 @@ class KeyboardSearchResult { public $search; // search query has been entered public $rangematch, $isomatch, $allmatch, $regionmatch; public $text, $textparts, $searchtext, $region; + public $legacy; } class KeyboardSearch { diff --git a/script/search/2.0/search.inc.php b/script/search/2.0/search.inc.php index a3eafad..62187c1 100644 --- a/script/search/2.0/search.inc.php +++ b/script/search/2.0/search.inc.php @@ -24,6 +24,8 @@ class KeyboardSearchResult { public $platform; public $keyboards; + + public $rangetext; } class KeyboardSearch { diff --git a/script/windows/14.0/update/WindowsUpdateCheck.php b/script/windows/14.0/update/WindowsUpdateCheck.php index 94faff1..5f9ae69 100644 --- a/script/windows/14.0/update/WindowsUpdateCheck.php +++ b/script/windows/14.0/update/WindowsUpdateCheck.php @@ -14,9 +14,12 @@ class WindowsUpdateCheck { const BOOTSTRAP_REGEX = '/^setup\.exe$/'; const BUNDLE_REGEX = '/^keyman(desktop)?-.+\.exe/'; + private $mssql; private $isManual; private $currentTime; // used mainly for unit testing + public $DownloadVersions = null; + public function execute($mssql, $tier, $appVersion, $packages, $isUpdate, $isManual, $currentTime = null) { $this->mssql = $mssql; @@ -43,7 +46,7 @@ public function execute($mssql, $tier, $appVersion, $packages, $isUpdate, $isMan return json_encode($desktop_update, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); } - // RepairVersionCheck works around an issue where Keyman for Windows 18.0.235-236 + // RepairVersionCheck works around an issue where Keyman for Windows 18.0.235-236 // would not upgrade to a newer version; see the links below for more details. // https://downloads.keyman.com/windows/stable/18.0.240/repair-14586/README.md // https://github.com/keymanapp/keyman/issues/13831 diff --git a/tests/TestDBBuild.inc.php b/tests/TestDBBuild.inc.php index 5d573bc..6d17cb4 100644 --- a/tests/TestDBBuild.inc.php +++ b/tests/TestDBBuild.inc.php @@ -24,7 +24,9 @@ final class TestDBDataSources extends \DBDataSources function __construct() { foreach($this as $field => $value) { - $this->$field = $this->fileFromTestDataDir($this->$field); + if(!empty($this->$field)) { + $this->$field = $this->fileFromTestDataDir($this->$field); + } } $this->mockAnalyticsSqlFile = $this->fileFromTestDataDir("analytics.sql"); } diff --git a/tools/2020/ReleaseSchedule.php b/tools/2020/ReleaseSchedule.php index 309e531..b8f610e 100644 --- a/tools/2020/ReleaseSchedule.php +++ b/tools/2020/ReleaseSchedule.php @@ -15,7 +15,7 @@ class ReleaseSchedule { * @param int currentTime Unix timestamp of current time * @return bool true if the request should be presented with the upgrade */ - public static function DoesRequestMeetSchedule(string $releaseDate, int $currentTime = null): bool { + public static function DoesRequestMeetSchedule(string $releaseDate, ?int $currentTime = null): bool { // This is an arbitrary schedule; see for example Chrome's release schedule: // https://chromium.googlesource.com/chromium/src/+/master/docs/process/release_cycle.md $schedule = [ diff --git a/tools/db/build/build.inc.php b/tools/db/build/build.inc.php index 7c93a33..4b5973b 100644 --- a/tools/db/build/build.inc.php +++ b/tools/db/build/build.inc.php @@ -58,15 +58,15 @@ function BuildDatabase($DBDataSources, $schema, $do_force) { $this->sqlrun(dirname(__FILE__)."/search.sql"); $this->sqlrun(dirname(__FILE__)."/langtags.sql"); - $this->sqlrun("${data_path}langtags.json.sql"); - $this->sqlrun("${data_path}language-subtag-registry.sql"); - $this->sqlrun("${data_path}iso639-3.sql"); - $this->sqlrun("${data_path}iso639-3-name-index.sql"); - $this->sqlrun("${data_path}ethnologue_language_codes.sql"); - $this->sqlrun("${data_path}ethnologue_country_codes.sql"); - $this->sqlrun("${data_path}ethnologue_language_index.sql"); - $this->sqlrun("${data_path}keyboards.sql"); - $this->sqlrun("${data_path}models.sql"); + $this->sqlrun("{$data_path}langtags.json.sql"); + $this->sqlrun("{$data_path}language-subtag-registry.sql"); + $this->sqlrun("{$data_path}iso639-3.sql"); + $this->sqlrun("{$data_path}iso639-3-name-index.sql"); + $this->sqlrun("{$data_path}ethnologue_language_codes.sql"); + $this->sqlrun("{$data_path}ethnologue_country_codes.sql"); + $this->sqlrun("{$data_path}ethnologue_language_index.sql"); + $this->sqlrun("{$data_path}keyboards.sql"); + $this->sqlrun("{$data_path}models.sql"); $this->sqlrun(dirname(__FILE__)."/search-prepare-data-1.sql"); $this->sqlrun(dirname(__FILE__)."/search-prepare-data-2.sql"); @@ -105,7 +105,7 @@ function BuildDatabase($DBDataSources, $schema, $do_force) { if(file_exists($DBDataSources->mockAnalyticsSqlFile)) $this->sqlrun($DBDataSources->mockAnalyticsSqlFile); - $this->sqlrun("${data_path}dbdatasources.sql"); + $this->sqlrun("{$data_path}dbdatasources.sql"); return true; } @@ -151,7 +151,7 @@ function buildDBDataSources($data_path, DBDataSources $DBDataSources) { $sql .= "\nINSERT t_dbdatasources SELECT ".sqlv($DBDataSources, $field).", ".sqlv(null, basename($DBDataSources->$field)). ", " . $DBDataSources->downloadDate($value) ."\n"; } - file_put_contents("${data_path}dbdatasources.sql", $sql); + file_put_contents("{$data_path}dbdatasources.sql", $sql); } function download($url) { diff --git a/tools/db/build/cjk/build.inc.php b/tools/db/build/cjk/build.inc.php index 68cca33..b722deb 100644 --- a/tools/db/build/cjk/build.inc.php +++ b/tools/db/build/cjk/build.inc.php @@ -9,13 +9,13 @@ function BuildCJKTables($DBDataSources, $schema, $do_force) { $this->schema = $schema; - $this->sqlrun("${data_path}cjk_database.sql"); + $this->sqlrun("{$data_path}cjk_database.sql"); $builder = new build_cjk_data($DBDataSources, $schema); $builder->execute($data_path, $do_force) || fail("Unable to build cjk data"); - $this->sqlrun("${data_path}chinese_pinyin_import.sql"); - $this->sqlrun("${data_path}japanese_import.sql"); + $this->sqlrun("{$data_path}chinese_pinyin_import.sql"); + $this->sqlrun("{$data_path}japanese_import.sql"); return true; }