diff --git a/.github/workflows/draft-release.yml b/.github/workflows/draft-release.yml new file mode 100644 index 000000000..d97fd81cf --- /dev/null +++ b/.github/workflows/draft-release.yml @@ -0,0 +1,113 @@ +name: Draft release + +on: + push: + tags: "*" + +jobs: + draft: + name: Create GitHub draft release + if: "startsWith(github.event.head_commit.message, 'Release ')" + runs-on: ubuntu-20.04 + strategy: + fail-fast: false + + steps: + - uses: actions/checkout@v2 + with: + submodules: true + + - name: Setup PHP + uses: shivammathur/setup-php@2.12.0 + with: + php-version: 8.0 + + - name: Restore Composer package cache + uses: actions/cache@v2 + with: + path: | + ~/.cache/composer/files + ~/.cache/composer/vcs + key: "composer-v2-cache-${{ hashFiles('./composer.lock') }}" + restore-keys: | + composer-v2-cache- + + - name: Install Composer dependencies + run: composer install --no-dev --prefer-dist --no-interaction --ignore-platform-reqs + + - name: Patch VersionInfo + run: | + BUILD_NUMBER=2000+$GITHUB_RUN_NUMBER #to stay above jenkins + echo "Build number: $BUILD_NUMBER" + sed -i "s/const BUILD_NUMBER = 0/const BUILD_NUMBER = ${BUILD_NUMBER}/" src/pocketmine/VersionInfo.php + + - name: Minify BedrockData JSON files + run: php src/pocketmine/resources/vanilla/.minify_json.php + + - name: Run preprocessor + run: | + PM_PREPROCESSOR_PATH="$GITHUB_WORKSPACE/build/preprocessor" + php "$PM_PREPROCESSOR_PATH/PreProcessor.php" --path=src --multisize || (echo "Preprocessor exited with code $?" && exit 1) + #dump the diff of preprocessor replacements to a patch in case it has bugs + git diff > preprocessor_diff.patch + VENDOR_PM="$GITHUB_WORKSPACE/vendor" + VENDOR_PM_BACKUP="$GITHUB_WORKSPACE/vendor-before-preprocess" + cp -r "$VENDOR_PM" "$VENDOR_PM_BACKUP" + for f in $(ls $VENDOR_PM/pocketmine); do + echo "Processing directory \"$f\"..." + php "$PM_PREPROCESSOR_PATH/PreProcessor.php" --path="$VENDOR_PM/pocketmine/$f" --multisize || (echo "Preprocessor exited with code $?" && exit 1) + echo "Checking for changes in \"$f\"..." + DIFF=$(git diff --no-index "$VENDOR_PM_BACKUP/pocketmine/$f" "$VENDOR_PM/pocketmine/$f" || true) + if [ "$DIFF" != "" ]; then + PATCH="$GITHUB_WORKSPACE/preprocessor_diff_$f.patch" + echo "$DIFF" > "$PATCH" + echo "Generated patch file \"$PATCH\"" + else + echo "No diff generated for \"$f\" (preprocessor made no changes)" + fi + done + + - name: Build PocketMine-MP.phar + run: composer make-server + + - name: Get PocketMine-MP release version + id: get-pm-version + run: | + echo ::set-output name=PM_VERSION::$(php -r 'require "vendor/autoload.php"; echo \pocketmine\BASE_VERSION;') + echo ::set-output name=MCPE_VERSION::$(php -r 'require "vendor/autoload.php"; echo \pocketmine\network\mcpe\protocol\ProtocolInfo::MINECRAFT_VERSION_NETWORK;') + echo ::set-output name=PM_VERSION_SHORT::$(php -r 'require "vendor/autoload.php"; $v = explode(".", \pocketmine\BASE_VERSION); array_pop($v); echo implode(".", $v);') + echo ::set-output name=PM_VERSION_MD::$(php -r 'require "vendor/autoload.php"; echo str_replace(".", "", \pocketmine\BASE_VERSION);') + + - name: Generate build info + run: php build/generate-build-info-json.php ${{ github.sha }} ${{ steps.get-pm-version.outputs.PM_VERSION }} ${{ github.repository }} > build_info.json + + - name: Upload release artifacts + uses: actions/upload-artifact@v2 + with: + name: release_artifacts + path: | + ${{ github.workspace }}/PocketMine-MP.phar + ${{ github.workspace }}/start.* + ${{ github.workspace }}/build_info.json + + - name: Create draft release + uses: ncipollo/release-action@v1.8.6 + with: + artifacts: ${{ github.workspace }}/PocketMine-MP.phar,${{ github.workspace }}/start.*,${{ github.workspace }}/build_info.json + commit: ${{ github.sha }} + draft: true + name: PocketMine-MP ${{ steps.get-pm-version.outputs.PM_VERSION }} + tag: ${{ steps.get-pm-version.outputs.PM_VERSION }} + token: ${{ secrets.GITHUB_TOKEN }} + body: | + **For Minecraft: Bedrock Edition ${{ steps.get-pm-version.outputs.MCPE_VERSION }}** + + Please see the [changelogs](/changelogs/${{ steps.get-pm-version.outputs.PM_VERSION_SHORT }}.md#${{ steps.get-pm-version.outputs.PM_VERSION_MD }}) for details. + + - name: Upload preprocessor diffs + uses: actions/upload-artifact@v2 + if: always() + with: + name: preprocessor_diffs + path: ${{ github.workspace }}/preprocessor_diff*.patch + diff --git a/.github/workflows/update-updater-api.yml b/.github/workflows/update-updater-api.yml new file mode 100644 index 000000000..0d8fe3a8a --- /dev/null +++ b/.github/workflows/update-updater-api.yml @@ -0,0 +1,45 @@ +name: Update update.pmmp.io API info + +on: + release: + types: + - published + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Install jq + run: sudo apt update && sudo apt install jq -y + + - uses: actions/checkout@v2 + with: + repository: pmmp/update.pmmp.io + ssh-key: ${{ secrets.UPDATE_PMMP_IO_DEPLOY_KEY }} + + - name: Get actual tag name + id: tag-name + run: echo ::set-output name=TAG_NAME::$(echo "${{ github.ref }}" | sed 's{^refs/tags/{{') + + - name: Download new release information + run: curl -f -L ${{ github.server_url }}/${{ github.repository }}/releases/download/${{ steps.tag-name.outputs.TAG_NAME }}/build_info.json -o new_build_info.json + + - name: Detect channel + id: channel + run: echo ::set-output name=CHANNEL::$(jq -r '.channel' new_build_info.json) + + - name: Copy release information + run: | + cp new_build_info.json channels/${{ steps.channel.outputs.CHANNEL }}.json + rm new_build_info.json + + - name: Commit changes + run: | + git config user.name github-actions + git config user.email github-actions@github.com + git add . + git diff-index --quiet HEAD || git commit -m "New ${{ steps.channel.outputs.CHANNEL }} release: ${{ github.repository }} ${{ steps.tag-name.outputs.TAG_NAME }}" + + - name: Push changes + run: git push diff --git a/build/generate-build-info-json.php b/build/generate-build-info-json.php new file mode 100644 index 000000000..57828c372 --- /dev/null +++ b/build/generate-build-info-json.php @@ -0,0 +1,43 @@ + "); + exit(1); +} + +echo json_encode([ + "php_version" => sprintf("%d.%d", PHP_MAJOR_VERSION, PHP_MINOR_VERSION), + "base_version" => \pocketmine\BASE_VERSION, + "build" => \pocketmine\BUILD_NUMBER, + "is_dev" => \pocketmine\IS_DEVELOPMENT_BUILD, + "channel" => \pocketmine\BUILD_CHANNEL, + "git_commit" => $argv[1], + "mcpe_version" => \pocketmine\network\mcpe\protocol\ProtocolInfo::MINECRAFT_VERSION_NETWORK, + "date" => time(), //TODO: maybe we should embed this in VersionInfo? + "details_url" => "https://github.com/$argv[3]/releases/tag/$argv[2]", + "download_url" => "https://github.com/$argv[3]/releases/download/$argv[2]/PocketMine-MP.phar", + "source_url" => "https://github.com/$argv[3]/tree/$argv[2]", +], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) . "\n"; diff --git a/build/make-release.php b/build/make-release.php index 1f50c542e..361fa0c14 100644 --- a/build/make-release.php +++ b/build/make-release.php @@ -24,20 +24,23 @@ declare(strict_types=1); namespace pocketmine\build\make_release; use pocketmine\utils\VersionString; +use function count; use function dirname; use function fgets; use function file_get_contents; use function file_put_contents; +use function fwrite; use function preg_replace; use function sleep; use function sprintf; use function system; use const pocketmine\BASE_VERSION; +use const STDERR; use const STDIN; require_once dirname(__DIR__) . '/vendor/autoload.php'; -function replaceVersion(string $versionInfoPath, string $newVersion, bool $isDev) : void{ +function replaceVersion(string $versionInfoPath, string $newVersion, bool $isDev, string $channel) : void{ $versionInfo = file_get_contents($versionInfoPath); $versionInfo = preg_replace( $pattern = '/^const BASE_VERSION = "(\d+)\.(\d+)\.(\d+)(?:-(.*))?";$/m', @@ -49,6 +52,11 @@ function replaceVersion(string $versionInfoPath, string $newVersion, bool $isDev 'const IS_DEVELOPMENT_BUILD = ' . ($isDev ? 'true' : 'false') . ';', $versionInfo ); + $versionInfo = preg_replace( + '/^const BUILD_CHANNEL = ".*";$/m', + 'const BUILD_CHANNEL = "' . $channel . '";', + $versionInfo + ); file_put_contents($versionInfoPath, $versionInfo); } @@ -57,8 +65,12 @@ function replaceVersion(string $versionInfoPath, string $newVersion, bool $isDev * @phpstan-param list $argv */ function main(array $argv) : void{ - if(isset($argv[1])){ - $currentVer = new VersionString($argv[1]); + if(count($argv) < 2){ + fwrite(STDERR, "Arguments: [release version]\n"); + exit(1); + } + if(isset($argv[2])){ + $currentVer = new VersionString($argv[2]); }else{ $currentVer = new VersionString(BASE_VERSION); } @@ -78,10 +90,10 @@ function main(array $argv) : void{ exit(1); } $versionInfoPath = dirname(__DIR__) . '/src/pocketmine/VersionInfo.php'; - replaceVersion($versionInfoPath, $currentVer->getBaseVersion(), false); + replaceVersion($versionInfoPath, $currentVer->getBaseVersion(), false, $argv[1]); system('git commit -m "Release ' . $currentVer->getBaseVersion() . '" --include "' . $versionInfoPath . '"'); system('git tag ' . $currentVer->getBaseVersion()); - replaceVersion($versionInfoPath, $nextVer->getBaseVersion(), true); + replaceVersion($versionInfoPath, $nextVer->getBaseVersion(), true, ""); system('git add "' . $versionInfoPath . '"'); system('git commit -m "' . $nextVer->getBaseVersion() . ' is next" --include "' . $versionInfoPath . '"'); echo "pushing changes in 5 seconds\n"; diff --git a/composer.json b/composer.json index ae9ece803..6b1f9812b 100644 --- a/composer.json +++ b/composer.json @@ -67,7 +67,7 @@ "scripts": { "make-devtools": "@php -dphar.readonly=0 tests/plugins/DevTools/src/DevTools/ConsoleScript.php --make tests/plugins/DevTools --out plugins/DevTools.phar", "make-server": [ - "@composer install --no-dev --classmap-authoritative", + "@composer install --no-dev --classmap-authoritative --ignore-platform-reqs", "@php -dphar.readonly=0 build/server-phar.php" ] } diff --git a/src/pocketmine/VersionInfo.php b/src/pocketmine/VersionInfo.php index 64db47414..7b51d1917 100644 --- a/src/pocketmine/VersionInfo.php +++ b/src/pocketmine/VersionInfo.php @@ -36,3 +36,4 @@ const NAME = "PocketMine-MP"; const BASE_VERSION = "3.22.2"; const IS_DEVELOPMENT_BUILD = true; const BUILD_NUMBER = 0; +const BUILD_CHANNEL = ""; diff --git a/tests/phpstan/configs/l8-baseline.neon b/tests/phpstan/configs/l8-baseline.neon index 2a32ddbf2..03641bb01 100644 --- a/tests/phpstan/configs/l8-baseline.neon +++ b/tests/phpstan/configs/l8-baseline.neon @@ -2,7 +2,7 @@ parameters: ignoreErrors: - message: "#^Parameter \\#3 \\$subject of function preg_replace expects array\\|string, string\\|null given\\.$#" - count: 1 + count: 2 path: ../../../build/make-release.php -