diff --git a/.github/workflows/check-publishing.yml b/.github/workflows/check-publishing.yml new file mode 100644 index 000000000..52c237dd5 --- /dev/null +++ b/.github/workflows/check-publishing.yml @@ -0,0 +1,211 @@ +# 当修改构建脚本 (包括修改依赖版本) 时检查配置是否能正常发版 +# 发版检查非常慢, 因此不在 build.yml 做 + +name: Check Publishing + + +on: + push: + paths: + - '**/**.gradle.kts' + - '**/gradle.properties' + - 'buildSrc/**' + pull_request: + paths-ignore: + - '**/**.gradle.kts' + - '**/gradle.properties' + - 'buildSrc/**' + + +# 从 build.yml 复制的 + +jobs: + jvm-and-macos: + name: "JVM+macOS" + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: + - macos-12 + env: + enableLocalPublishingTest: 'true' + gradleArgs: --scan + isMac: ${{ startsWith(matrix.os, 'macos') }} + isWindows: ${{ startsWith(matrix.os, 'windows') }} + isUbuntu: ${{ startsWith(matrix.os, 'ubuntu') }} + isUnix: ${{ startsWith(matrix.os, 'macos') || startsWith(matrix.os, 'ubuntu') }} + steps: + - uses: actions/checkout@v2 + with: + submodules: 'recursive' + + - uses: actions/setup-java@v2 + with: + distribution: 'temurin' + java-version: '17' + + - name: Setup Gradle + uses: gradle/gradle-build-action@v2 + + - name: Cache konan + uses: pat-s/always-upload-cache@v3.0.11 + with: + path: ~/.konan + key: ${{ runner.os }}-gradle-${{ hashFiles('*.gradle.kts') }} + restore-keys: | + ${{ runner.os }}-gradle- + + - if: ${{ env.isUnix == 'true' }} + run: chmod -R 777 * + + # Prepare environment for linking for macOS + + - if: ${{ env.isMac == 'true' }} + name: Install OpenSSL + run: > + git clone https://github.com/openssl/openssl.git --recursive && + cd openssl && + git checkout tags/openssl-3.0.3 && + ./Configure --prefix=/opt/openssl --openssldir=/usr/local/ssl && + make && + sudo make install + + - name: Clean and download dependencies + run: ./gradlew clean ${{ env.gradleArgs }} + + + + - name: Build and Publish Local Artifacts + if: ${{ env.enableLocalPublishingTest == 'true' }} + run: ./gradlew :mirai-deps-test:publishMiraiArtifactsToMavenLocal ${{ env.gradleArgs }} "-Dmirai.build.project.version=2.99.0-deps-test" + + - name: Check Publication + if: ${{ env.enableLocalPublishingTest == 'true' }} + run: ./gradlew :mirai-deps-test:check ${{ env.gradleArgs }} "-Dmirai.build.project.version=2.99.0-deps-test" "-Dmirai.deps.test.must.run=true" + + + native-platforms: + name: "Native (${{ matrix.os }})" + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: + - windows-2022 + - ubuntu-20.04 + include: + - os: windows-2022 + targetName: mingwX64 + - os: ubuntu-20.04 + targetName: linuxX64 + - os: ubuntu-18.04 + targetName: linuxX64 + # - os: macos-12 + # targetName: macosX64 + - os: macos-11 + targetName: macosX64 + env: + # FIXME there must be two or more targets, or we'll get error on `@OptionalExpectation` + # > Declaration annotated with '@OptionalExpectation' can only be used in common module sources + enableLocalPublishingTest: 'true' + gradleArgs: --scan "-Dmirai.target=jvm;${{ matrix.targetName }};!other" "-Pkotlin.compiler.execution.strategy=in-process" "-Dorg.gradle.jvmargs=-Xmx4096m -Dfile.encoding=UTF-8" + isMac: ${{ startsWith(matrix.os, 'macos') }} + isWindows: ${{ startsWith(matrix.os, 'windows') }} + isUbuntu: ${{ startsWith(matrix.os, 'ubuntu') }} + isUnix: ${{ startsWith(matrix.os, 'macos') || startsWith(matrix.os, 'ubuntu') }} + VCPKG_DEFAULT_BINARY_CACHE: ${{ startsWith(matrix.os, 'windows') && 'C:\vcpkg\binary_cache' || '/usr/local/share/vcpkg/binary_cache' }} + steps: + - uses: actions/checkout@v2 + with: + submodules: 'recursive' + + - uses: actions/setup-java@v2 + with: + distribution: 'adopt-openj9' + java-version: '17' + + - name: Setup Gradle + uses: gradle/gradle-build-action@v2 + + - name: Cache konan + uses: pat-s/always-upload-cache@v3.0.11 + with: + path: ~/.konan + key: ${{ runner.os }}-gradle-${{ hashFiles('*.gradle.kts') }} + restore-keys: | + ${{ runner.os }}-gradle- + + - name: Prepare to cache vcpkg + if: ${{ env.isWindows == 'true' }} + run: mkdir -p ${{ env.VCPKG_DEFAULT_BINARY_CACHE }} + + - name: Cache vcpkg + if: ${{ env.isWindows == 'true' }} + uses: pat-s/always-upload-cache@v3.0.11 + with: + path: ${{ env.VCPKG_DEFAULT_BINARY_CACHE }} + key: ${{ runner.os }}-vcpkg-binary-cache-${{ github.job }} + restore-keys: | + ${{ runner.os }}-vcpkg-binary-cache- + + - if: ${{ env.isUnix == 'true' }} + run: chmod -R 777 * + + # Prepare environment for linking on macOS + - if: ${{ env.isMac == 'true' }} + name: Install OpenSSL on Mac OS + run: > + git clone https://github.com/openssl/openssl.git --recursive && + cd openssl && + git checkout tags/openssl-3.0.3 && + ./Configure --prefix=/opt/openssl --openssldir=/usr/local/ssl && + make && + sudo make install + + # Prepare environment for linking on Ubuntu + - if: ${{ env.isUbuntu == 'true' }} + name: Install OpenSSL on Ubuntu + run: sudo apt install libssl-dev -y + + # Prepare environment for linking on Windows + - if: ${{ env.isWindows == 'true' }} + name: Setup Memory Environment on Windows + run: > + wmic pagefileset where name="D:\\pagefile.sys" set InitialSize=1024,MaximumSize=9216 & + net stop mongodb + shell: cmd + continue-on-error: true + + - if: ${{ env.isWindows == 'true' }} + name: Install OpenSSL & cURL on Windows + run: | + echo "set(VCPKG_BUILD_TYPE release)" | Out-File -FilePath "$env:VCPKG_INSTALLATION_ROOT\triplets\x64-windows.cmake" -Encoding utf8 -Append + vcpkg install openssl:x64-windows curl[core,ssl]:x64-windows + New-Item -Path $env:VCPKG_INSTALLATION_ROOT\installed\x64-windows\lib\crypto.lib -ItemType SymbolicLink -Value $env:VCPKG_INSTALLATION_ROOT\installed\x64-windows\lib\libcrypto.lib + New-Item -Path $env:VCPKG_INSTALLATION_ROOT\installed\x64-windows\lib\ssl.lib -ItemType SymbolicLink -Value $env:VCPKG_INSTALLATION_ROOT\installed\x64-windows\lib\libssl.lib + New-Item -Path $env:VCPKG_INSTALLATION_ROOT\installed\x64-windows\lib\curl.lib -ItemType SymbolicLink -Value $env:VCPKG_INSTALLATION_ROOT\installed\x64-windows\lib\libcurl.lib + echo "$env:VCPKG_INSTALLATION_ROOT\installed\x64-windows\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append + + - name: Clean and download dependencies + run: ./gradlew clean ${{ env.gradleArgs }} + + - run: > + ./gradlew updateSnapshotVersion ${{ env.gradleArgs }} + if: github.event.pusher + env: + MIRAI_IS_SNAPSHOTS_PUBLISHING: true + SNAPSHOTS_PUBLISHING_USER: ${{ secrets.SNAPSHOTS_PUBLISHING_USER }} + SNAPSHOTS_PUBLISHING_KEY: ${{ secrets.SNAPSHOTS_PUBLISHING_KEY }} + SNAPSHOTS_PUBLISHING_URL: ${{ secrets.SNAPSHOTS_PUBLISHING_URL }} + CURRENT_BRANCH_NAME: dev # always use -dev for now + + + + - name: Build and Publish Local Artifacts + if: ${{ env.enableLocalPublishingTest == 'true' }} + run: ./gradlew :mirai-deps-test:publishMiraiArtifactsToMavenLocal ${{ env.gradleArgs }} "-Dmirai.build.project.version=2.99.0-deps-test" + + - name: Check Publication + if: ${{ env.enableLocalPublishingTest == 'true' }} + run: ./gradlew :mirai-deps-test:check ${{ env.gradleArgs }} "-Dmirai.build.project.version=2.99.0-deps-test" "-Dmirai.deps.test.must.run=true" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 66e655721..cb6ce5a29 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -230,33 +230,27 @@ jobs: - name: Check keys run: ./gradlew ensureMavenCentralAvailable ${{ env.gradleArgs }} - - name: "Test mirai-core-utils for ${{ matrix.os }}" - run: ./gradlew :mirai-core-utils:${{ matrix.targetName }}Test ${{ env.gradleArgs }} - - - name: "Test mirai-core-api for ${{ matrix.os }}" - run: ./gradlew :mirai-core-api:${{ matrix.targetName }}Test ${{ env.gradleArgs }} - - - name: "Test mirai-core for ${{ matrix.os }}" - run: ./gradlew :mirai-core:${{ matrix.targetName }}Test ${{ env.gradleArgs }} + - name: Assemble + run: ./gradlew assemble ${{ env.gradleArgs }} - name: Publish Local Artifacts if: ${{ env.enableLocalPublishingTest == 'true' }} run: ./gradlew :mirai-deps-test:publishMiraiArtifactsToMavenLocal ${{ env.gradleArgs }} "-Dmirai.build.project.version=2.99.0-deps-test" - - name: Check Publication - run: ./gradlew :mirai-deps-test:check ${{ env.gradleArgs }} + - name: Check + run: ./gradlew check ${{ env.gradleArgs }} # Publish native snapshots. Other artifacts are published in publish-mirai-all - - name: Publish MingwX64 Snapshots + - name: Publish MingwX64 if: ${{ env.isWindows == 'true' }} run: ./gradlew publishMingwX64PublicationToMavenCentralRepository ${{ env.gradleArgs }} - - name: Publish LinuxX64 Snapshots + - name: Publish LinuxX64 if: ${{ env.isUbuntu == 'true' }} run: ./gradlew publishLinuxX64PublicationToMavenCentralRepository ${{ env.gradleArgs }} - - name: Publish macOSX64 Snapshots + - name: Publish macOSX64 if: ${{ env.isMac == 'true' }} run: ./gradlew publishMacosX64PublicationToMavenCentralRepository ${{ env.gradleArgs }} diff --git a/mirai-deps-test/build.gradle.kts b/mirai-deps-test/build.gradle.kts index e154b7ae1..aefa8c970 100644 --- a/mirai-deps-test/build.gradle.kts +++ b/mirai-deps-test/build.gradle.kts @@ -32,6 +32,7 @@ dependencies { tasks.getByName("test", Test::class) { environment("mirai.root.project.dir", rootProject.projectDir.absolutePath) + systemProperty("mirai.deps.test.must.run", System.getProperty("mirai.deps.test.must.run")) } val publishMiraiArtifactsToMavenLocal by tasks.registering { diff --git a/mirai-deps-test/test/AbstractTest.kt b/mirai-deps-test/test/AbstractTest.kt index 5f1e4d9f7..cae8b4ddd 100644 --- a/mirai-deps-test/test/AbstractTest.kt +++ b/mirai-deps-test/test/AbstractTest.kt @@ -22,6 +22,7 @@ abstract class AbstractTest { companion object { const val miraiLocalVersion = "2.99.0-deps-test" // do Search Everywhere before changing this const val REASON_LOCAL_ARTIFACT_NOT_AVAILABLE = "local artifacts not available" + private const val MIRAI_DEPS_TEST_MUST_RUN = "mirai.deps.test.must.run" // used by GitHub Actions scripts val mavenLocalDir: File by lazy { org.gradle.api.internal.artifacts.mvnsettings.DefaultLocalMavenRepositoryLocator( @@ -44,8 +45,7 @@ abstract class AbstractTest { ) true } else { - System.err.println( - """ + val message = """ [mirai-deps-test] ERROR: Test is not run, because there are no local artifacts available for dependencies testing. Please build and publish local artifacts with version `$miraiLocalVersion` before running this test(:mirai-deps-test:test). This could have be automated but it will take a huge amount of time for your routine testing. @@ -60,8 +60,15 @@ abstract class AbstractTest { You can run `./gradlew publishMiraiLocalArtifacts` to publish local artifacts. Then you can run this test again. (By your original way or ./gradlew :mirai-deps-test:test) """.trimIndent() + System.err.println( + message ) - false + + if (System.getProperty(MIRAI_DEPS_TEST_MUST_RUN, "false").toBoolean()) { + throw AssertionError("System property `mirai.deps.test.must.run` is `true`, which requires the deps test to be run. \n\n$message") + } else { + false + } } } }