diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f96185c34..3aace057b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -57,6 +57,29 @@ jobs: working-directory: src if: matrix.runtime != 'linux-arm64' && matrix.runtime != 'linux-arm' + # Check runtime/externals hash + - name: Compute/Compare runtime and externals Hash + shell: bash + run: | + echo "Current dotnet runtime hash result: $DOTNET_RUNTIME_HASH" + echo "Current Externals hash result: $EXTERNALS_HASH" + + NeedUpdate=0 + if [ "$EXTERNALS_HASH" != "$(cat ./src/Misc/contentHash/externals/${{ matrix.runtime }})" ] ;then + echo Hash mismatch, Update ./src/Misc/contentHash/externals/${{ matrix.runtime }} to $EXTERNALS_HASH + NeedUpdate=1 + fi + + if [ "$DOTNET_RUNTIME_HASH" != "$(cat ./src/Misc/contentHash/dotnetRuntime/${{ matrix.runtime }})" ] ;then + echo Hash mismatch, Update ./src/Misc/contentHash/dotnetRuntime/${{ matrix.runtime }} to $DOTNET_RUNTIME_HASH + NeedUpdate=1 + fi + + exit $NeedUpdate + env: + DOTNET_RUNTIME_HASH: ${{hashFiles('**/_layout_trims/runtime/**/*')}} + EXTERNALS_HASH: ${{hashFiles('**/_layout_trims/externals/**/*')}} + # Create runner package tar.gz/zip - name: Package Release if: github.event_name != 'pull_request' @@ -67,7 +90,11 @@ jobs: # Upload runner package tar.gz/zip as artifact - name: Publish Artifact if: github.event_name != 'pull_request' - uses: actions/upload-artifact@v1 + uses: actions/upload-artifact@v2 with: name: runner-package-${{ matrix.runtime }} - path: _package + path: | + _package + _package_trims/trim_externals + _package_trims/trim_runtime + _package_trims/trim_runtime_externals diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 739e1dc59..12297dca0 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -51,6 +51,21 @@ jobs: linux-arm-sha: ${{ steps.sha.outputs.linux-arm-sha256 }} win-x64-sha: ${{ steps.sha.outputs.win-x64-sha256 }} osx-x64-sha: ${{ steps.sha.outputs.osx-x64-sha256 }} + linux-x64-sha-noexternals: ${{ steps.sha_noexternals.outputs.linux-x64-sha256 }} + linux-arm64-sha-noexternals: ${{ steps.sha_noexternals.outputs.linux-arm64-sha256 }} + linux-arm-sha-noexternals: ${{ steps.sha_noexternals.outputs.linux-arm-sha256 }} + win-x64-sha-noexternals: ${{ steps.sha_noexternals.outputs.win-x64-sha256 }} + osx-x64-sha-noexternals: ${{ steps.sha_noexternals.outputs.osx-x64-sha256 }} + linux-x64-sha-noruntime: ${{ steps.sha_noruntime.outputs.linux-x64-sha256 }} + linux-arm64-sha-noruntime: ${{ steps.sha_noruntime.outputs.linux-arm64-sha256 }} + linux-arm-sha-noruntime: ${{ steps.sha_noruntime.outputs.linux-arm-sha256 }} + win-x64-sha-noruntime: ${{ steps.sha_noruntime.outputs.win-x64-sha256 }} + osx-x64-sha-noruntime: ${{ steps.sha_noruntime.outputs.osx-x64-sha256 }} + linux-x64-sha-noruntime-noexternals: ${{ steps.sha_noruntime_noexternals.outputs.linux-x64-sha256 }} + linux-arm64-sha-noruntime-noexternals: ${{ steps.sha_noruntime_noexternals.outputs.linux-arm64-sha256 }} + linux-arm-sha-noruntime-noexternals: ${{ steps.sha_noruntime_noexternals.outputs.linux-arm-sha256 }} + win-x64-sha-noruntime-noexternals: ${{ steps.sha_noruntime_noexternals.outputs.win-x64-sha256 }} + osx-x64-sha-noruntime-noexternals: ${{ steps.sha_noruntime_noexternals.outputs.osx-x64-sha256 }} strategy: matrix: runtime: [ linux-x64, linux-arm64, linux-arm, win-x64, osx-x64 ] @@ -99,14 +114,6 @@ jobs: ${{ matrix.devScript }} package Release ${{ matrix.runtime }} working-directory: src - # Upload runner package tar.gz/zip as artifact. - # Since each package name is unique, so we don't need to put ${{matrix}} info into artifact name - - name: Publish Artifact - if: github.event_name != 'pull_request' - uses: actions/upload-artifact@v1 - with: - name: runner-packages - path: _package # compute shas and set as job outputs to use in release notes - run: brew install coreutils #needed for shasum util if: ${{ matrix.os == 'macOS-latest' }} @@ -120,6 +127,91 @@ jobs: id: sha name: Compute SHA256 working-directory: _package + - run: | + file=$(ls) + sha=$(sha256sum $file | awk '{ print $1 }') + echo "Computed sha256: $sha for $file" + echo "::set-output name=${{matrix.runtime}}-sha256::$sha" + echo "::set-output name=sha256::$sha" + shell: bash + id: sha_noexternals + name: Compute SHA256 + working-directory: _package_trims/trim_externals + - run: | + file=$(ls) + sha=$(sha256sum $file | awk '{ print $1 }') + echo "Computed sha256: $sha for $file" + echo "::set-output name=${{matrix.runtime}}-sha256::$sha" + echo "::set-output name=sha256::$sha" + shell: bash + id: sha_noruntime + name: Compute SHA256 + working-directory: _package_trims/trim_runtime + - run: | + file=$(ls) + sha=$(sha256sum $file | awk '{ print $1 }') + echo "Computed sha256: $sha for $file" + echo "::set-output name=${{matrix.runtime}}-sha256::$sha" + echo "::set-output name=sha256::$sha" + shell: bash + id: sha_noruntime_noexternals + name: Compute SHA256 + working-directory: _package_trims/trim_runtime_externals + + - name: Create trimmedpackages.json for ${{ matrix.runtime }} + if: matrix.runtime == 'win-x64' + uses: actions/github-script@0.3.0 + with: + github-token: ${{secrets.GITHUB_TOKEN}} + script: | + const core = require('@actions/core') + const fs = require('fs'); + const runnerVersion = fs.readFileSync('src/runnerversion', 'utf8').replace(/\n$/g, '') + var trimmedPackages = fs.readFileSync('src/Misc/trimmedpackages_zip.json', 'utf8').replace(//g, runnerVersion).replace(//g, '${{ matrix.runtime }}') + trimmedPackages = trimmedPackages.replace(//g, '${{hashFiles('**/_layout_trims/runtime/**/*')}}') + trimmedPackages = trimmedPackages.replace(//g, '${{hashFiles('**/_layout_trims/externals/**/*')}}') + + trimmedPackages = trimmedPackages.replace(//g, '${{steps.sha_noruntime_noexternals.outputs.sha256}}') + trimmedPackages = trimmedPackages.replace(//g, '${{steps.sha_noruntime.outputs.sha256}}') + trimmedPackages = trimmedPackages.replace(//g, '${{steps.sha_noexternals.outputs.sha256}}') + + console.log(trimmedPackages) + fs.writeFileSync('${{ matrix.runtime }}-trimmedpackages.json', trimmedPackages) + + - name: Create trimmedpackages.json for ${{ matrix.runtime }} + if: matrix.runtime != 'win-x64' + uses: actions/github-script@0.3.0 + with: + github-token: ${{secrets.GITHUB_TOKEN}} + script: | + const core = require('@actions/core') + const fs = require('fs'); + const runnerVersion = fs.readFileSync('src/runnerversion', 'utf8').replace(/\n$/g, '') + var trimmedPackages = fs.readFileSync('src/Misc/trimmedpackages_targz.json', 'utf8').replace(//g, runnerVersion).replace(//g, '${{ matrix.runtime }}') + trimmedPackages = trimmedPackages.replace(//g, '${{hashFiles('**/_layout_trims/runtime/**/*')}}') + trimmedPackages = trimmedPackages.replace(//g, '${{hashFiles('**/_layout_trims/externals/**/*')}}') + + trimmedPackages = trimmedPackages.replace(//g, '${{steps.sha_noruntime_noexternals.outputs.sha256}}') + trimmedPackages = trimmedPackages.replace(//g, '${{steps.sha_noruntime.outputs.sha256}}') + trimmedPackages = trimmedPackages.replace(//g, '${{steps.sha_noexternals.outputs.sha256}}') + + console.log(trimmedPackages) + fs.writeFileSync('${{ matrix.runtime }}-trimmedpackages.json', trimmedPackages) + + # Upload runner package tar.gz/zip as artifact. + # Since each package name is unique, so we don't need to put ${{matrix}} info into artifact name + - name: Publish Artifact + if: github.event_name != 'pull_request' + uses: actions/upload-artifact@v2 + with: + name: runner-packages + path: | + _package + _package_trims/trim_externals + _package_trims/trim_runtime + _package_trims/trim_runtime_externals + ${{ matrix.runtime }}-trimmedpackages.json + release: needs: build runs-on: ubuntu-latest @@ -150,6 +242,21 @@ jobs: releaseNote = releaseNote.replace(//g, '${{needs.build.outputs.linux-x64-sha}}') releaseNote = releaseNote.replace(//g, '${{needs.build.outputs.linux-arm-sha}}') releaseNote = releaseNote.replace(//g, '${{needs.build.outputs.linux-arm64-sha}}') + releaseNote = releaseNote.replace(//g, '${{needs.build.outputs.win-x64-sha-noexternals}}') + releaseNote = releaseNote.replace(//g, '${{needs.build.outputs.osx-x64-sha-noexternals}}') + releaseNote = releaseNote.replace(//g, '${{needs.build.outputs.linux-x64-sha-noexternals}}') + releaseNote = releaseNote.replace(//g, '${{needs.build.outputs.linux-arm-sha-noexternals}}') + releaseNote = releaseNote.replace(//g, '${{needs.build.outputs.linux-arm64-sha-noexternals}}') + releaseNote = releaseNote.replace(//g, '${{needs.build.outputs.win-x64-sha-noruntime}}') + releaseNote = releaseNote.replace(//g, '${{needs.build.outputs.osx-x64-sha-noruntime}}') + releaseNote = releaseNote.replace(//g, '${{needs.build.outputs.linux-x64-sha-noruntime}}') + releaseNote = releaseNote.replace(//g, '${{needs.build.outputs.linux-arm-sha-noruntime}}') + releaseNote = releaseNote.replace(//g, '${{needs.build.outputs.linux-arm64-sha-noruntime}}') + releaseNote = releaseNote.replace(//g, '${{needs.build.outputs.win-x64-sha-noruntime-noexternals}}') + releaseNote = releaseNote.replace(//g, '${{needs.build.outputs.osx-x64-sha-noruntime-noexternals}}') + releaseNote = releaseNote.replace(//g, '${{needs.build.outputs.linux-x64-sha-noruntime-noexternals}}') + releaseNote = releaseNote.replace(//g, '${{needs.build.outputs.linux-arm-sha-noruntime-noexternals}}') + releaseNote = releaseNote.replace(//g, '${{needs.build.outputs.linux-arm64-sha-noruntime-noexternals}}') console.log(releaseNote) core.setOutput('version', runnerVersion); core.setOutput('note', releaseNote); @@ -165,14 +272,14 @@ jobs: body: | ${{ steps.releaseNote.outputs.note }} - # Upload release assets + # Upload release assets (full runner packages) - name: Upload Release Asset (win-x64) uses: actions/upload-release-asset@v1.0.1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ steps.createRelease.outputs.upload_url }} - asset_path: ${{ github.workspace }}/actions-runner-win-x64-${{ steps.releaseNote.outputs.version }}.zip + asset_path: ${{ github.workspace }}/_package/actions-runner-win-x64-${{ steps.releaseNote.outputs.version }}.zip asset_name: actions-runner-win-x64-${{ steps.releaseNote.outputs.version }}.zip asset_content_type: application/octet-stream @@ -182,7 +289,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ steps.createRelease.outputs.upload_url }} - asset_path: ${{ github.workspace }}/actions-runner-linux-x64-${{ steps.releaseNote.outputs.version }}.tar.gz + asset_path: ${{ github.workspace }}/_package/actions-runner-linux-x64-${{ steps.releaseNote.outputs.version }}.tar.gz asset_name: actions-runner-linux-x64-${{ steps.releaseNote.outputs.version }}.tar.gz asset_content_type: application/octet-stream @@ -192,7 +299,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ steps.createRelease.outputs.upload_url }} - asset_path: ${{ github.workspace }}/actions-runner-osx-x64-${{ steps.releaseNote.outputs.version }}.tar.gz + asset_path: ${{ github.workspace }}/_package/actions-runner-osx-x64-${{ steps.releaseNote.outputs.version }}.tar.gz asset_name: actions-runner-osx-x64-${{ steps.releaseNote.outputs.version }}.tar.gz asset_content_type: application/octet-stream @@ -202,7 +309,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ steps.createRelease.outputs.upload_url }} - asset_path: ${{ github.workspace }}/actions-runner-linux-arm-${{ steps.releaseNote.outputs.version }}.tar.gz + asset_path: ${{ github.workspace }}/_package/actions-runner-linux-arm-${{ steps.releaseNote.outputs.version }}.tar.gz asset_name: actions-runner-linux-arm-${{ steps.releaseNote.outputs.version }}.tar.gz asset_content_type: application/octet-stream @@ -212,6 +319,210 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ steps.createRelease.outputs.upload_url }} - asset_path: ${{ github.workspace }}/actions-runner-linux-arm64-${{ steps.releaseNote.outputs.version }}.tar.gz + asset_path: ${{ github.workspace }}/_package/actions-runner-linux-arm64-${{ steps.releaseNote.outputs.version }}.tar.gz asset_name: actions-runner-linux-arm64-${{ steps.releaseNote.outputs.version }}.tar.gz asset_content_type: application/octet-stream + + # Upload release assets (trim externals) + - name: Upload Release Asset (win-x64-noexternals) + uses: actions/upload-release-asset@v1.0.1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.createRelease.outputs.upload_url }} + asset_path: ${{ github.workspace }}/_package_trims/trim_externals/actions-runner-win-x64-${{ steps.releaseNote.outputs.version }}-noexternals.zip + asset_name: actions-runner-win-x64-${{ steps.releaseNote.outputs.version }}-noexternals.zip + asset_content_type: application/octet-stream + + - name: Upload Release Asset (linux-x64-noexternals) + uses: actions/upload-release-asset@v1.0.1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.createRelease.outputs.upload_url }} + asset_path: ${{ github.workspace }}/_package_trims/trim_externals/actions-runner-linux-x64-${{ steps.releaseNote.outputs.version }}-noexternals.tar.gz + asset_name: actions-runner-linux-x64-${{ steps.releaseNote.outputs.version }}-noexternals.tar.gz + asset_content_type: application/octet-stream + + - name: Upload Release Asset (osx-x64-noexternals) + uses: actions/upload-release-asset@v1.0.1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.createRelease.outputs.upload_url }} + asset_path: ${{ github.workspace }}/_package_trims/trim_externals/actions-runner-osx-x64-${{ steps.releaseNote.outputs.version }}-noexternals.tar.gz + asset_name: actions-runner-osx-x64-${{ steps.releaseNote.outputs.version }}-noexternals.tar.gz + asset_content_type: application/octet-stream + + - name: Upload Release Asset (linux-arm-noexternals) + uses: actions/upload-release-asset@v1.0.1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.createRelease.outputs.upload_url }} + asset_path: ${{ github.workspace }}/_package_trims/trim_externals/actions-runner-linux-arm-${{ steps.releaseNote.outputs.version }}-noexternals.tar.gz + asset_name: actions-runner-linux-arm-${{ steps.releaseNote.outputs.version }}-noexternals.tar.gz + asset_content_type: application/octet-stream + + - name: Upload Release Asset (linux-arm64-noexternals) + uses: actions/upload-release-asset@v1.0.1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.createRelease.outputs.upload_url }} + asset_path: ${{ github.workspace }}/_package_trims/trim_externals/actions-runner-linux-arm64-${{ steps.releaseNote.outputs.version }}-noexternals.tar.gz + asset_name: actions-runner-linux-arm64-${{ steps.releaseNote.outputs.version }}-noexternals.tar.gz + asset_content_type: application/octet-stream + + # Upload release assets (trim runtime) + - name: Upload Release Asset (win-x64-noruntime) + uses: actions/upload-release-asset@v1.0.1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.createRelease.outputs.upload_url }} + asset_path: ${{ github.workspace }}/_package_trims/trim_runtime/actions-runner-win-x64-${{ steps.releaseNote.outputs.version }}-noruntime.zip + asset_name: actions-runner-win-x64-${{ steps.releaseNote.outputs.version }}-noruntime.zip + asset_content_type: application/octet-stream + + - name: Upload Release Asset (linux-x64-noruntime) + uses: actions/upload-release-asset@v1.0.1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.createRelease.outputs.upload_url }} + asset_path: ${{ github.workspace }}/_package_trims/trim_runtime/actions-runner-linux-x64-${{ steps.releaseNote.outputs.version }}-noruntime.tar.gz + asset_name: actions-runner-linux-x64-${{ steps.releaseNote.outputs.version }}-noruntime.tar.gz + asset_content_type: application/octet-stream + + - name: Upload Release Asset (osx-x64-noruntime) + uses: actions/upload-release-asset@v1.0.1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.createRelease.outputs.upload_url }} + asset_path: ${{ github.workspace }}/_package_trims/trim_runtime/actions-runner-osx-x64-${{ steps.releaseNote.outputs.version }}-noruntime.tar.gz + asset_name: actions-runner-osx-x64-${{ steps.releaseNote.outputs.version }}-noruntime.tar.gz + asset_content_type: application/octet-stream + + - name: Upload Release Asset (linux-arm-noruntime) + uses: actions/upload-release-asset@v1.0.1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.createRelease.outputs.upload_url }} + asset_path: ${{ github.workspace }}/_package_trims/trim_runtime/actions-runner-linux-arm-${{ steps.releaseNote.outputs.version }}-noruntime.tar.gz + asset_name: actions-runner-linux-arm-${{ steps.releaseNote.outputs.version }}-noruntime.tar.gz + asset_content_type: application/octet-stream + + - name: Upload Release Asset (linux-arm64-noruntime) + uses: actions/upload-release-asset@v1.0.1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.createRelease.outputs.upload_url }} + asset_path: ${{ github.workspace }}/_package_trims/trim_runtime/actions-runner-linux-arm64-${{ steps.releaseNote.outputs.version }}-noruntime.tar.gz + asset_name: actions-runner-linux-arm64-${{ steps.releaseNote.outputs.version }}-noruntime.tar.gz + asset_content_type: application/octet-stream + + # Upload release assets (trim runtime and externals) + - name: Upload Release Asset (win-x64-noruntime-noexternals) + uses: actions/upload-release-asset@v1.0.1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.createRelease.outputs.upload_url }} + asset_path: ${{ github.workspace }}/_package_trims/trim_runtime_externals/actions-runner-win-x64-${{ steps.releaseNote.outputs.version }}-noruntime-noexternals.zip + asset_name: actions-runner-win-x64-${{ steps.releaseNote.outputs.version }}-noruntime-noexternals.zip + asset_content_type: application/octet-stream + + - name: Upload Release Asset (linux-x64-noruntime-noexternals) + uses: actions/upload-release-asset@v1.0.1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.createRelease.outputs.upload_url }} + asset_path: ${{ github.workspace }}/_package_trims/trim_runtime_externals/actions-runner-linux-x64-${{ steps.releaseNote.outputs.version }}-noruntime-noexternals.tar.gz + asset_name: actions-runner-linux-x64-${{ steps.releaseNote.outputs.version }}-noruntime-noexternals.tar.gz + asset_content_type: application/octet-stream + + - name: Upload Release Asset (osx-x64-noruntime-noexternals) + uses: actions/upload-release-asset@v1.0.1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.createRelease.outputs.upload_url }} + asset_path: ${{ github.workspace }}/_package_trims/trim_runtime_externals/actions-runner-osx-x64-${{ steps.releaseNote.outputs.version }}-noruntime-noexternals.tar.gz + asset_name: actions-runner-osx-x64-${{ steps.releaseNote.outputs.version }}-noruntime-noexternals.tar.gz + asset_content_type: application/octet-stream + + - name: Upload Release Asset (linux-arm-noruntime-noexternals) + uses: actions/upload-release-asset@v1.0.1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.createRelease.outputs.upload_url }} + asset_path: ${{ github.workspace }}/_package_trims/trim_runtime_externals/actions-runner-linux-arm-${{ steps.releaseNote.outputs.version }}-noruntime-noexternals.tar.gz + asset_name: actions-runner-linux-arm-${{ steps.releaseNote.outputs.version }}-noruntime-noexternals.tar.gz + asset_content_type: application/octet-stream + + - name: Upload Release Asset (linux-arm64-noruntime-noexternals) + uses: actions/upload-release-asset@v1.0.1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.createRelease.outputs.upload_url }} + asset_path: ${{ github.workspace }}/_package_trims/trim_runtime_externals/actions-runner-linux-arm64-${{ steps.releaseNote.outputs.version }}-noruntime-noexternals.tar.gz + asset_name: actions-runner-linux-arm64-${{ steps.releaseNote.outputs.version }}-noruntime-noexternals.tar.gz + asset_content_type: application/octet-stream + + # Upload release assets (trimmedpackages.json) + - name: Upload Release Asset (win-x64-trimmedpackages.json) + uses: actions/upload-release-asset@v1.0.1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.createRelease.outputs.upload_url }} + asset_path: ${{ github.workspace }}/win-x64-trimmedpackages.json + asset_name: actions-runner-win-x64-${{ steps.releaseNote.outputs.version }}-trimmedpackages.json + asset_content_type: application/octet-stream + + - name: Upload Release Asset (linux-x64-trimmedpackages.json) + uses: actions/upload-release-asset@v1.0.1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.createRelease.outputs.upload_url }} + asset_path: ${{ github.workspace }}/linux-x64-trimmedpackages.json + asset_name: actions-runner-linux-x64-${{ steps.releaseNote.outputs.version }}-trimmedpackages.json + asset_content_type: application/octet-stream + + - name: Upload Release Asset (osx-x64-trimmedpackages.json) + uses: actions/upload-release-asset@v1.0.1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.createRelease.outputs.upload_url }} + asset_path: ${{ github.workspace }}/osx-x64-trimmedpackages.json + asset_name: actions-runner-osx-x64-${{ steps.releaseNote.outputs.version }}-trimmedpackages.json + asset_content_type: application/octet-stream + + - name: Upload Release Asset (linux-arm-trimmedpackages.json) + uses: actions/upload-release-asset@v1.0.1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.createRelease.outputs.upload_url }} + asset_path: ${{ github.workspace }}/linux-arm-trimmedpackages.json + asset_name: actions-runner-linux-arm-${{ steps.releaseNote.outputs.version }}-trimmedpackages.json + asset_content_type: application/octet-stream + + - name: Upload Release Asset (linux-arm64-trimmedpackages.json) + uses: actions/upload-release-asset@v1.0.1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.createRelease.outputs.upload_url }} + asset_path: ${{ github.workspace }}/linux-arm64-trimmedpackages.json + asset_name: actions-runner-linux-arm64-${{ steps.releaseNote.outputs.version }}-trimmedpackages.json + asset_content_type: application/octet-stream \ No newline at end of file diff --git a/.gitignore b/.gitignore index c43e89088..34d18c4ce 100644 --- a/.gitignore +++ b/.gitignore @@ -19,7 +19,9 @@ node_modules _downloads _layout +_layout_trims _package +_package_trims _dotnetsdk TestResults TestLogs diff --git a/releaseNote.md b/releaseNote.md index c8b0a31f6..dc9b1ba81 100644 --- a/releaseNote.md +++ b/releaseNote.md @@ -82,3 +82,21 @@ The SHA-256 checksums for the packages included in this build are shown below: - actions-runner-linux-x64-.tar.gz - actions-runner-linux-arm64-.tar.gz - actions-runner-linux-arm-.tar.gz + +- actions-runner-win-x64--noexternals.zip +- actions-runner-osx-x64--noexternals.tar.gz +- actions-runner-linux-x64--noexternals.tar.gz +- actions-runner-linux-arm64--noexternals.tar.gz +- actions-runner-linux-arm--noexternals.tar.gz + +- actions-runner-win-x64--noruntime.zip +- actions-runner-osx-x64--noruntime.tar.gz +- actions-runner-linux-x64--noruntime.tar.gz +- actions-runner-linux-arm64--noruntime.tar.gz +- actions-runner-linux-arm--noruntime.tar.gz + +- actions-runner-win-x64--noruntime-noexternals.zip +- actions-runner-osx-x64--noruntime-noexternals.tar.gz +- actions-runner-linux-x64--noruntime-noexternals.tar.gz +- actions-runner-linux-arm64--noruntime-noexternals.tar.gz +- actions-runner-linux-arm--noruntime-noexternals.tar.gz diff --git a/src/Misc/contentHash/dotnetRuntime/linux-arm b/src/Misc/contentHash/dotnetRuntime/linux-arm new file mode 100644 index 000000000..bb68f837e --- /dev/null +++ b/src/Misc/contentHash/dotnetRuntime/linux-arm @@ -0,0 +1 @@ +de62d296708908cfd1236e58869aebbc2bae8a8c3d629276968542626c508e37 \ No newline at end of file diff --git a/src/Misc/contentHash/dotnetRuntime/linux-arm64 b/src/Misc/contentHash/dotnetRuntime/linux-arm64 new file mode 100644 index 000000000..0cbad98e5 --- /dev/null +++ b/src/Misc/contentHash/dotnetRuntime/linux-arm64 @@ -0,0 +1 @@ +44fcd0422dd98ed17d2c8e9057ff2260c50165f20674236a4ae7d2645a07df25 \ No newline at end of file diff --git a/src/Misc/contentHash/dotnetRuntime/linux-x64 b/src/Misc/contentHash/dotnetRuntime/linux-x64 new file mode 100644 index 000000000..e1da509ac --- /dev/null +++ b/src/Misc/contentHash/dotnetRuntime/linux-x64 @@ -0,0 +1 @@ +e57652cf322ee16ce3af4f9e58f80858746b9e1e60279e991a3b3d9a6baf8d79 \ No newline at end of file diff --git a/src/Misc/contentHash/dotnetRuntime/osx-x64 b/src/Misc/contentHash/dotnetRuntime/osx-x64 new file mode 100644 index 000000000..892d9ba7d --- /dev/null +++ b/src/Misc/contentHash/dotnetRuntime/osx-x64 @@ -0,0 +1 @@ +bdd247b2ff3f51095524412e2ac588e7a87af805e114d6caf2368366ee7be1ea \ No newline at end of file diff --git a/src/Misc/contentHash/dotnetRuntime/win-x64 b/src/Misc/contentHash/dotnetRuntime/win-x64 new file mode 100644 index 000000000..2be264c83 --- /dev/null +++ b/src/Misc/contentHash/dotnetRuntime/win-x64 @@ -0,0 +1 @@ +d23a0cb9f20c0aa1cddb7a39567cd097020cdeb06a1e952940601d1a405c53b8 \ No newline at end of file diff --git a/src/Misc/contentHash/externals/linux-arm b/src/Misc/contentHash/externals/linux-arm new file mode 100644 index 000000000..ec1b8354f --- /dev/null +++ b/src/Misc/contentHash/externals/linux-arm @@ -0,0 +1 @@ +6ca4a0e1c50b7079ead05321dcf5835c1c25f23dc632add8c1c4667d416d103e \ No newline at end of file diff --git a/src/Misc/contentHash/externals/linux-arm64 b/src/Misc/contentHash/externals/linux-arm64 new file mode 100644 index 000000000..5233992c5 --- /dev/null +++ b/src/Misc/contentHash/externals/linux-arm64 @@ -0,0 +1 @@ +b5951dc607d782d9c7571a7224e940eb0975bb23c54ff25c7afdbf959a417081 \ No newline at end of file diff --git a/src/Misc/contentHash/externals/linux-x64 b/src/Misc/contentHash/externals/linux-x64 new file mode 100644 index 000000000..89ebc0f6d --- /dev/null +++ b/src/Misc/contentHash/externals/linux-x64 @@ -0,0 +1 @@ +af819e92011cc9cbca90e8299f9f7651f2cf6bf45b42920f9a4ca22795486147 \ No newline at end of file diff --git a/src/Misc/contentHash/externals/osx-x64 b/src/Misc/contentHash/externals/osx-x64 new file mode 100644 index 000000000..3f8d61289 --- /dev/null +++ b/src/Misc/contentHash/externals/osx-x64 @@ -0,0 +1 @@ +aa0e6bf4bfaabf48c962ea3b262dca042629ab332005f73d282faec908847036 \ No newline at end of file diff --git a/src/Misc/contentHash/externals/win-x64 b/src/Misc/contentHash/externals/win-x64 new file mode 100644 index 000000000..b1a10d0b9 --- /dev/null +++ b/src/Misc/contentHash/externals/win-x64 @@ -0,0 +1 @@ +40328cff2b8229f9b578f32739183bd8f6aab481c21dadc052b09f1c7e8e4665 \ No newline at end of file diff --git a/src/Misc/runnercoreassets b/src/Misc/runnercoreassets new file mode 100644 index 000000000..34f873d5b --- /dev/null +++ b/src/Misc/runnercoreassets @@ -0,0 +1,57 @@ +actions.runner.plist.template +actions.runner.service.template +checkScripts/downloadCert.js +checkScripts/makeWebRequest.js +darwin.svc.sh.template +hashFiles/index.js +installdependencies.sh +macos-run-invoker.js +Microsoft.IdentityModel.Logging.dll +Microsoft.IdentityModel.Tokens.dll +Minimatch.dll +Newtonsoft.Json.Bson.dll +Newtonsoft.Json.dll +Runner.Common.deps.json +Runner.Common.dll +Runner.Common.pdb +Runner.Listener +Runner.Listener.deps.json +Runner.Listener.dll +Runner.Listener.exe +Runner.Listener.pdb +Runner.Listener.runtimeconfig.json +Runner.PluginHost +Runner.PluginHost.deps.json +Runner.PluginHost.dll +Runner.PluginHost.exe +Runner.PluginHost.pdb +Runner.PluginHost.runtimeconfig.json +Runner.Plugins.deps.json +Runner.Plugins.dll +Runner.Plugins.pdb +Runner.Sdk.deps.json +Runner.Sdk.dll +Runner.Sdk.pdb +Runner.Worker +Runner.Worker.deps.json +Runner.Worker.dll +Runner.Worker.exe +Runner.Worker.pdb +Runner.Worker.runtimeconfig.json +RunnerService.exe +RunnerService.exe.config +RunnerService.js +RunnerService.pdb +runsvc.sh +Sdk.deps.json +Sdk.dll +Sdk.pdb +System.IdentityModel.Tokens.Jwt.dll +System.Net.Http.Formatting.dll +System.Security.Cryptography.Pkcs.dll +System.Security.Cryptography.ProtectedData.dll +System.ServiceProcess.ServiceController.dll +systemd.svc.sh.template +update.cmd.template +update.sh.template +YamlDotNet.dll \ No newline at end of file diff --git a/src/Misc/runnerdotnetruntimeassets b/src/Misc/runnerdotnetruntimeassets new file mode 100644 index 000000000..09be07902 --- /dev/null +++ b/src/Misc/runnerdotnetruntimeassets @@ -0,0 +1,263 @@ +api-ms-win-core-console-l1-1-0.dll +api-ms-win-core-console-l1-2-0.dll +api-ms-win-core-datetime-l1-1-0.dll +api-ms-win-core-debug-l1-1-0.dll +api-ms-win-core-errorhandling-l1-1-0.dll +api-ms-win-core-file-l1-1-0.dll +api-ms-win-core-file-l1-2-0.dll +api-ms-win-core-file-l2-1-0.dll +api-ms-win-core-handle-l1-1-0.dll +api-ms-win-core-heap-l1-1-0.dll +api-ms-win-core-interlocked-l1-1-0.dll +api-ms-win-core-libraryloader-l1-1-0.dll +api-ms-win-core-localization-l1-2-0.dll +api-ms-win-core-memory-l1-1-0.dll +api-ms-win-core-namedpipe-l1-1-0.dll +api-ms-win-core-processenvironment-l1-1-0.dll +api-ms-win-core-processthreads-l1-1-0.dll +api-ms-win-core-processthreads-l1-1-1.dll +api-ms-win-core-profile-l1-1-0.dll +api-ms-win-core-rtlsupport-l1-1-0.dll +api-ms-win-core-string-l1-1-0.dll +api-ms-win-core-synch-l1-1-0.dll +api-ms-win-core-synch-l1-2-0.dll +api-ms-win-core-sysinfo-l1-1-0.dll +api-ms-win-core-timezone-l1-1-0.dll +api-ms-win-core-util-l1-1-0.dll +api-ms-win-crt-conio-l1-1-0.dll +api-ms-win-crt-convert-l1-1-0.dll +api-ms-win-crt-environment-l1-1-0.dll +api-ms-win-crt-filesystem-l1-1-0.dll +api-ms-win-crt-heap-l1-1-0.dll +api-ms-win-crt-locale-l1-1-0.dll +api-ms-win-crt-math-l1-1-0.dll +api-ms-win-crt-multibyte-l1-1-0.dll +api-ms-win-crt-private-l1-1-0.dll +api-ms-win-crt-process-l1-1-0.dll +api-ms-win-crt-runtime-l1-1-0.dll +api-ms-win-crt-stdio-l1-1-0.dll +api-ms-win-crt-string-l1-1-0.dll +api-ms-win-crt-time-l1-1-0.dll +api-ms-win-crt-utility-l1-1-0.dll +clrcompression.dll +clretwrc.dll +clrjit.dll +coreclr.dll +createdump +createdump.exe +dbgshim.dll +hostfxr.dll +hostpolicy.dll +libclrjit.dylib +libclrjit.so +libcoreclr.dylib +libcoreclr.so +libcoreclrtraceptprovider.so +libdbgshim.dylib +libdbgshim.so +libhostfxr.dylib +libhostfxr.so +libhostpolicy.dylib +libhostpolicy.so +libmscordaccore.dylib +libmscordaccore.so +libmscordbi.dylib +libmscordbi.so +Microsoft.CSharp.dll +Microsoft.DiaSymReader.Native.amd64.dll +Microsoft.VisualBasic.Core.dll +Microsoft.VisualBasic.dll +Microsoft.Win32.Primitives.dll +Microsoft.Win32.Registry.dll +mscordaccore.dll +mscordaccore_amd64_amd64_6.0.21.52210.dll +mscordbi.dll +mscorlib.dll +mscorrc.debug.dll +mscorrc.dll +msquic.dll +netstandard.dll +SOS_README.md +System.AppContext.dll +System.Buffers.dll +System.Collections.Concurrent.dll +System.Collections.dll +System.Collections.Immutable.dll +System.Collections.NonGeneric.dll +System.Collections.Specialized.dll +System.ComponentModel.Annotations.dll +System.ComponentModel.DataAnnotations.dll +System.ComponentModel.dll +System.ComponentModel.EventBasedAsync.dll +System.ComponentModel.Primitives.dll +System.ComponentModel.TypeConverter.dll +System.Configuration.dll +System.Console.dll +System.Core.dll +System.Data.Common.dll +System.Data.DataSetExtensions.dll +System.Data.dll +System.Diagnostics.Contracts.dll +System.Diagnostics.Debug.dll +System.Diagnostics.DiagnosticSource.dll +System.Diagnostics.FileVersionInfo.dll +System.Diagnostics.Process.dll +System.Diagnostics.StackTrace.dll +System.Diagnostics.TextWriterTraceListener.dll +System.Diagnostics.Tools.dll +System.Diagnostics.TraceSource.dll +System.Diagnostics.Tracing.dll +System.dll +System.Drawing.dll +System.Drawing.Primitives.dll +System.Dynamic.Runtime.dll +System.Formats.Asn1.dll +System.Globalization.Calendars.dll +System.Globalization.dll +System.Globalization.Extensions.dll +System.Globalization.Native.dylib +System.Globalization.Native.so +System.IO.Compression.Brotli.dll +System.IO.Compression.dll +System.IO.Compression.FileSystem.dll +System.IO.Compression.Native.a +System.IO.Compression.Native.dll +System.IO.Compression.Native.dylib +System.IO.Compression.Native.so +System.IO.Compression.ZipFile.dll +System.IO.dll +System.IO.FileSystem.AccessControl.dll +System.IO.FileSystem.dll +System.IO.FileSystem.DriveInfo.dll +System.IO.FileSystem.Primitives.dll +System.IO.FileSystem.Watcher.dll +System.IO.IsolatedStorage.dll +System.IO.MemoryMappedFiles.dll +System.IO.Pipes.AccessControl.dll +System.IO.Pipes.dll +System.IO.UnmanagedMemoryStream.dll +System.Linq.dll +System.Linq.Expressions.dll +System.Linq.Parallel.dll +System.Linq.Queryable.dll +System.Memory.dll +System.Native.a +System.Native.dylib +System.Native.so +System.Net.dll +System.Net.Http.dll +System.Net.Http.Json.dll +System.Net.Http.Native.a +System.Net.Http.Native.dylib +System.Net.Http.Native.so +System.Net.HttpListener.dll +System.Net.Mail.dll +System.Net.NameResolution.dll +System.Net.NetworkInformation.dll +System.Net.Ping.dll +System.Net.Primitives.dll +System.Net.Quic.dll +System.Net.Requests.dll +System.Net.Security.dll +System.Net.Security.Native.a +System.Net.Security.Native.dylib +System.Net.Security.Native.so +System.Net.ServicePoint.dll +System.Net.Sockets.dll +System.Net.WebClient.dll +System.Net.WebHeaderCollection.dll +System.Net.WebProxy.dll +System.Net.WebSockets.Client.dll +System.Net.WebSockets.dll +System.Numerics.dll +System.Numerics.Vectors.dll +System.ObjectModel.dll +System.Private.CoreLib.dll +System.Private.DataContractSerialization.dll +System.Private.Uri.dll +System.Private.Xml.dll +System.Private.Xml.Linq.dll +System.Reflection.DispatchProxy.dll +System.Reflection.dll +System.Reflection.Emit.dll +System.Reflection.Emit.ILGeneration.dll +System.Reflection.Emit.Lightweight.dll +System.Reflection.Extensions.dll +System.Reflection.Metadata.dll +System.Reflection.Primitives.dll +System.Reflection.TypeExtensions.dll +System.Resources.Reader.dll +System.Resources.ResourceManager.dll +System.Resources.Writer.dll +System.Runtime.CompilerServices.Unsafe.dll +System.Runtime.CompilerServices.VisualC.dll +System.Runtime.dll +System.Runtime.Extensions.dll +System.Runtime.Handles.dll +System.Runtime.InteropServices.dll +System.Runtime.InteropServices.RuntimeInformation.dll +System.Runtime.InteropServices.WindowsRuntime.dll +System.Runtime.Intrinsics.dll +System.Runtime.Loader.dll +System.Runtime.Numerics.dll +System.Runtime.Serialization.dll +System.Runtime.Serialization.Formatters.dll +System.Runtime.Serialization.Json.dll +System.Runtime.Serialization.Primitives.dll +System.Runtime.Serialization.Xml.dll +System.Runtime.WindowsRuntime.dll +System.Runtime.WindowsRuntime.UI.Xaml.dll +System.Security.AccessControl.dll +System.Security.Claims.dll +System.Security.Cryptography.Algorithms.dll +System.Security.Cryptography.Cng.dll +System.Security.Cryptography.Csp.dll +System.Security.Cryptography.Encoding.dll +System.Security.Cryptography.Native.Apple.a +System.Security.Cryptography.Native.Apple.dylib +System.Security.Cryptography.Native.OpenSsl.a +System.Security.Cryptography.Native.OpenSsl.dylib +System.Security.Cryptography.Native.OpenSsl.so +System.Security.Cryptography.OpenSsl.dll +System.Security.Cryptography.Primitives.dll +System.Security.Cryptography.X509Certificates.dll +System.Security.Cryptography.XCertificates.dll +System.Security.dll +System.Security.Principal.dll +System.Security.Principal.Windows.dll +System.Security.SecureString.dll +System.ServiceModel.Web.dll +System.ServiceProcess.dll +System.Text.Encoding.CodePages.dll +System.Text.Encoding.dll +System.Text.Encoding.Extensions.dll +System.Text.Encodings.Web.dll +System.Text.Json.dll +System.Text.RegularExpressions.dll +System.Threading.Channels.dll +System.Threading.dll +System.Threading.Overlapped.dll +System.Threading.Tasks.Dataflow.dll +System.Threading.Tasks.dll +System.Threading.Tasks.Extensions.dll +System.Threading.Tasks.Parallel.dll +System.Threading.Thread.dll +System.Threading.ThreadPool.dll +System.Threading.Timer.dll +System.Transactions.dll +System.Transactions.Local.dll +System.ValueTuple.dll +System.Web.dll +System.Web.HttpUtility.dll +System.Windows.dll +System.Xml.dll +System.Xml.Linq.dll +System.Xml.ReaderWriter.dll +System.Xml.Serialization.dll +System.Xml.XDocument.dll +System.Xml.XmlDocument.dll +System.Xml.XmlSerializer.dll +System.Xml.XPath.dll +System.Xml.XPath.XDocument.dll +ucrtbase.dll +WindowsBase.dll \ No newline at end of file diff --git a/src/Misc/trimmedpackages_targz.json b/src/Misc/trimmedpackages_targz.json new file mode 100644 index 000000000..3a28b282d --- /dev/null +++ b/src/Misc/trimmedpackages_targz.json @@ -0,0 +1,24 @@ +[ + { + "HashValue": "", + "DownloadUrl": "https://github.com/actions/runner/releases/download/v/actions-runner---noruntime-noexternals.tar.gz", + "TrimmedContents": { + "dotnetRuntime": "", + "externals": "" + } + }, + { + "HashValue": "", + "DownloadUrl": "https://github.com/actions/runner/releases/download/v/actions-runner---noruntime.tar.gz", + "TrimmedContents": { + "dotnetRuntime": "" + } + }, + { + "HashValue": "", + "DownloadUrl": "https://github.com/actions/runner/releases/download/v/actions-runner---noexternals.tar.gz", + "TrimmedContents": { + "externals": "" + } + } +] \ No newline at end of file diff --git a/src/Misc/trimmedpackages_zip.json b/src/Misc/trimmedpackages_zip.json new file mode 100644 index 000000000..423bca46b --- /dev/null +++ b/src/Misc/trimmedpackages_zip.json @@ -0,0 +1,24 @@ +[ + { + "HashValue": "", + "DownloadUrl": "https://github.com/actions/runner/releases/download/v/actions-runner---noruntime-noexternals.zip", + "TrimmedContents": { + "dotnetRuntime": "", + "externals": "" + } + }, + { + "HashValue": "", + "DownloadUrl": "https://github.com/actions/runner/releases/download/v/actions-runner---noruntime.zip", + "TrimmedContents": { + "dotnetRuntime": "" + } + }, + { + "HashValue": "", + "DownloadUrl": "https://github.com/actions/runner/releases/download/v/actions-runner---noexternals.zip", + "TrimmedContents": { + "externals": "" + } + } +] \ No newline at end of file diff --git a/src/Runner.Listener/Runner.Listener.csproj b/src/Runner.Listener/Runner.Listener.csproj index e4266ad8d..5868965ef 100644 --- a/src/Runner.Listener/Runner.Listener.csproj +++ b/src/Runner.Listener/Runner.Listener.csproj @@ -24,6 +24,12 @@ + + + GitHub.Runner.Listener.runnercoreassets + + + portable diff --git a/src/Test/L0/PackagesTrimL0.cs b/src/Test/L0/PackagesTrimL0.cs new file mode 100644 index 000000000..4ca24651a --- /dev/null +++ b/src/Test/L0/PackagesTrimL0.cs @@ -0,0 +1,154 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Threading; +using System.Threading.Tasks; +using Xunit; +using GitHub.Runner.Common.Util; +using System.Threading.Channels; +using GitHub.Runner.Sdk; +using System.Linq; + +namespace GitHub.Runner.Common.Tests +{ + public sealed class PackagesTrimL0 + { + + [Fact] + [Trait("Level", "L0")] + [Trait("Category", "Common")] + public async Task RunnerLayoutParts_NewFilesCrossAll() + { + using (TestHostContext hc = new TestHostContext(this)) + { + Tracing trace = hc.GetTrace(); + var runnerCoreAssetsFile = Path.Combine(TestUtil.GetSrcPath(), @"Misc/runnercoreassets"); + var runnerDotnetRuntimeFile = Path.Combine(TestUtil.GetSrcPath(), @"Misc/runnerdotnetruntimeassets"); + string layoutBin = Path.Combine(TestUtil.GetSrcPath(), @"../_layout/bin"); + var newFiles = new List(); + if (Directory.Exists(layoutBin)) + { + var coreAssets = await File.ReadAllLinesAsync(runnerCoreAssetsFile); + var runtimeAssets = await File.ReadAllLinesAsync(runnerDotnetRuntimeFile); + foreach (var file in Directory.GetFiles(layoutBin, "*", SearchOption.AllDirectories)) + { + if (!coreAssets.Any(x => file.Replace(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar).EndsWith(x)) && + !runtimeAssets.Any(x => file.Replace(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar).EndsWith(x))) + { + newFiles.Add(file); + } + } + + if (newFiles.Count > 0) + { + Assert.True(false, $"Found new files '{string.Join('\n', newFiles)}'. These will break runner update using trimmed packages."); + } + } + } + } + + [Fact] + [Trait("Level", "L0")] + [Trait("Category", "Common")] + public async Task RunnerLayoutParts_OverlapFiles() + { + using (TestHostContext hc = new TestHostContext(this)) + { + Tracing trace = hc.GetTrace(); + var runnerCoreAssetsFile = Path.Combine(TestUtil.GetSrcPath(), @"Misc/runnercoreassets"); + var runnerDotnetRuntimeFile = Path.Combine(TestUtil.GetSrcPath(), @"Misc/runnerdotnetruntimeassets"); + + var coreAssets = await File.ReadAllLinesAsync(runnerCoreAssetsFile); + var runtimeAssets = await File.ReadAllLinesAsync(runnerDotnetRuntimeFile); + + foreach (var line in coreAssets) + { + if (runtimeAssets.Contains(line, StringComparer.OrdinalIgnoreCase)) + { + Assert.True(false, $"'Misc/runnercoreassets' and 'Misc/runnerdotnetruntimeassets' should not overlap."); + } + } + } + } + + [Fact] + [Trait("Level", "L0")] + [Trait("Category", "Common")] + public async Task RunnerLayoutParts_NewRunnerCoreAssets() + { + using (TestHostContext hc = new TestHostContext(this)) + { + Tracing trace = hc.GetTrace(); + var runnerCoreAssetsFile = Path.Combine(TestUtil.GetSrcPath(), @"Misc/runnercoreassets"); + var coreAssets = await File.ReadAllLinesAsync(runnerCoreAssetsFile); + + string layoutBin = Path.Combine(TestUtil.GetSrcPath(), @"../_layout/bin"); + var newFiles = new List(); + if (Directory.Exists(layoutBin)) + { + var binDirs = Directory.GetDirectories(TestUtil.GetSrcPath(), "net6.0", SearchOption.AllDirectories); + foreach (var binDir in binDirs) + { + if (binDir.Contains("Test") || binDir.Contains("obj")) + { + continue; + } + + Directory.GetFiles(binDir, "*", SearchOption.TopDirectoryOnly).ToList().ForEach(x => + { + if (!x.Contains("runtimeconfig.dev.json")) + { + if (!coreAssets.Any(y => x.Replace(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar).EndsWith(y))) + { + newFiles.Add(x); + } + } + }); + } + + if (newFiles.Count > 0) + { + Assert.True(false, $"Found new files '{string.Join('\n', newFiles)}'. These will break runner update using trimmed packages. You might need to update `Misc/runnercoreassets`."); + } + } + } + } + + [Fact] + [Trait("Level", "L0")] + [Trait("Category", "Common")] + public async Task RunnerLayoutParts_NewDotnetRuntimeAssets() + { + using (TestHostContext hc = new TestHostContext(this)) + { + Tracing trace = hc.GetTrace(); + var runnerDotnetRuntimeFile = Path.Combine(TestUtil.GetSrcPath(), @"Misc/runnerdotnetruntimeassets"); + var runtimeAssets = await File.ReadAllLinesAsync(runnerDotnetRuntimeFile); + + string layoutTrimsRuntimeAssets = Path.Combine(TestUtil.GetSrcPath(), @"../_layout_trims/runnerdotnetruntimeassets"); + var newFiles = new List(); + if (File.Exists(layoutTrimsRuntimeAssets)) + { + var runtimeAssetsCurrent = await File.ReadAllLinesAsync(layoutTrimsRuntimeAssets); + foreach (var runtimeFile in runtimeAssetsCurrent) + { + if (runtimeAssets.Any(x => runtimeFile.EndsWith(x, StringComparison.OrdinalIgnoreCase))) + { + continue; + } + else + { + newFiles.Add(runtimeFile); + } + } + + if (newFiles.Count > 0) + { + Assert.True(false, $"Found new dotnet runtime files '{string.Join('\n', newFiles)}'. These will break runner update using trimmed packages. You might need to update `Misc/runnerdotnetruntimeassets`."); + } + } + } + } + } +} diff --git a/src/dev.sh b/src/dev.sh index df71896e4..12854fa01 100755 --- a/src/dev.sh +++ b/src/dev.sh @@ -14,8 +14,13 @@ DEV_TARGET_RUNTIME=$3 SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" LAYOUT_DIR="$SCRIPT_DIR/../_layout" +LAYOUT_TRIMS_DIR="$SCRIPT_DIR/../_layout_trims" +LAYOUT_TRIM_EXTERNALS_DIR="$LAYOUT_TRIMS_DIR/trim_externals" +LAYOUT_TRIM_RUNTIME_DIR="$LAYOUT_TRIMS_DIR/trim_runtime" +LAYOUT_TRIM_RUNTIME_EXTERNALS_DIR="$LAYOUT_TRIMS_DIR/trim_runtime_externals" DOWNLOAD_DIR="$SCRIPT_DIR/../_downloads/netcore2x" PACKAGE_DIR="$SCRIPT_DIR/../_package" +PACKAGE_TRIMS_DIR="$SCRIPT_DIR/../_package_trims" DOTNETSDK_ROOT="$SCRIPT_DIR/../_dotnetsdk" DOTNETSDK_VERSION="6.0.100" DOTNETSDK_INSTALLDIR="$DOTNETSDK_ROOT/$DOTNETSDK_VERSION" @@ -127,6 +132,48 @@ function layout () heading "Setup externals folder for $RUNTIME_ID runner's layout" bash ./Misc/externals.sh $RUNTIME_ID || checkRC externals.sh + + heading "Create layout (Trimmed) ..." + + rm -Rf "$LAYOUT_TRIMS_DIR" + mkdir -p "$LAYOUT_TRIMS_DIR" + mkdir -p "$LAYOUT_TRIMS_DIR/runtime" + cp -r "$LAYOUT_DIR/bin/." "$LAYOUT_TRIMS_DIR/runtime" + mkdir -p "$LAYOUT_TRIMS_DIR/externals" + cp -r "$LAYOUT_DIR/externals/." "$LAYOUT_TRIMS_DIR/externals" + + pushd "$LAYOUT_TRIMS_DIR/runtime" > /dev/null + if [[ ("$CURRENT_PLATFORM" == "windows") ]]; then + sed -i 's/\n$/\r\n/' "$SCRIPT_DIR/Misc/runnercoreassets" + fi + + cat "$SCRIPT_DIR/Misc/runnercoreassets" | xargs rm -f + find . -empty -type d -delete + find . -type f > "$LAYOUT_TRIMS_DIR/runnerdotnetruntimeassets" + popd > /dev/null + + heading "Create layout with externals trimmed ..." + mkdir -p "$LAYOUT_TRIM_EXTERNALS_DIR" + cp -r "$LAYOUT_DIR/." "$LAYOUT_TRIM_EXTERNALS_DIR/" + rm -Rf "$LAYOUT_TRIM_EXTERNALS_DIR/externals" + echo "Created... $LAYOUT_TRIM_EXTERNALS_DIR" + + heading "Create layout with dotnet runtime trimmed ..." + mkdir -p "$LAYOUT_TRIM_RUNTIME_DIR" + cp -r "$LAYOUT_DIR/." "$LAYOUT_TRIM_RUNTIME_DIR/" + pushd "$LAYOUT_TRIM_RUNTIME_DIR/bin" > /dev/null + cat "$LAYOUT_TRIMS_DIR/runnerdotnetruntimeassets" | xargs rm -f + echo "Created... $LAYOUT_TRIM_RUNTIME_DIR" + popd > /dev/null + + heading "Create layout with externals and dotnet runtime trimmed ..." + mkdir -p "$LAYOUT_TRIM_RUNTIME_EXTERNALS_DIR" + cp -r "$LAYOUT_DIR/." "$LAYOUT_TRIM_RUNTIME_EXTERNALS_DIR/" + rm -Rf "$LAYOUT_TRIM_RUNTIME_EXTERNALS_DIR/externals" + pushd "$LAYOUT_TRIM_RUNTIME_EXTERNALS_DIR/bin" > /dev/null + cat "$LAYOUT_TRIMS_DIR/runnerdotnetruntimeassets" | xargs rm -f + echo "Created... $LAYOUT_TRIM_RUNTIME_EXTERNALS_DIR" + popd > /dev/null } function runtest () @@ -156,7 +203,9 @@ function package () find "${LAYOUT_DIR}/bin" -type f -name '*.pdb' -delete mkdir -p "$PACKAGE_DIR" + mkdir -p "$PACKAGE_TRIMS_DIR" rm -Rf "${PACKAGE_DIR:?}"/* + rm -Rf "${PACKAGE_TRIMS_DIR:?}"/* pushd "$PACKAGE_DIR" > /dev/null @@ -174,6 +223,66 @@ function package () fi popd > /dev/null + + runner_trim_externals_pkg_name="actions-runner-${RUNTIME_ID}-${runner_ver}-noexternals" + heading "Packaging ${runner_trim_externals_pkg_name} (Trimmed)" + + PACKAGE_TRIM_EXTERNALS_DIR="$PACKAGE_TRIMS_DIR/trim_externals" + mkdir -p "$PACKAGE_TRIM_EXTERNALS_DIR" + pushd "$PACKAGE_TRIM_EXTERNALS_DIR" > /dev/null + if [[ ("$CURRENT_PLATFORM" == "linux") || ("$CURRENT_PLATFORM" == "darwin") ]]; then + tar_name="${runner_trim_externals_pkg_name}.tar.gz" + echo "Creating $tar_name in ${LAYOUT_TRIM_EXTERNALS_DIR}" + tar -czf "${tar_name}" -C "${LAYOUT_TRIM_EXTERNALS_DIR}" . + elif [[ ("$CURRENT_PLATFORM" == "windows") ]]; then + zip_name="${runner_trim_externals_pkg_name}.zip" + echo "Convert ${LAYOUT_TRIM_EXTERNALS_DIR} to Windows style path" + window_path=${LAYOUT_TRIM_EXTERNALS_DIR:1} + window_path=${window_path:0:1}:${window_path:1} + echo "Creating $zip_name in ${window_path}" + powershell -NoLogo -Sta -NoProfile -NonInteractive -ExecutionPolicy Unrestricted -Command "Add-Type -Assembly \"System.IO.Compression.FileSystem\"; [System.IO.Compression.ZipFile]::CreateFromDirectory(\"${window_path}\", \"${zip_name}\")" + fi + popd > /dev/null + + runner_trim_runtime_pkg_name="actions-runner-${RUNTIME_ID}-${runner_ver}-noruntime" + heading "Packaging ${runner_trim_runtime_pkg_name} (Trimmed)" + + PACKAGE_TRIM_RUNTIME_DIR="$PACKAGE_TRIMS_DIR/trim_runtime" + mkdir -p "$PACKAGE_TRIM_RUNTIME_DIR" + pushd "$PACKAGE_TRIM_RUNTIME_DIR" > /dev/null + if [[ ("$CURRENT_PLATFORM" == "linux") || ("$CURRENT_PLATFORM" == "darwin") ]]; then + tar_name="${runner_trim_runtime_pkg_name}.tar.gz" + echo "Creating $tar_name in ${LAYOUT_TRIM_RUNTIME_DIR}" + tar -czf "${tar_name}" -C "${LAYOUT_TRIM_RUNTIME_DIR}" . + elif [[ ("$CURRENT_PLATFORM" == "windows") ]]; then + zip_name="${runner_trim_runtime_pkg_name}.zip" + echo "Convert ${LAYOUT_TRIM_RUNTIME_DIR} to Windows style path" + window_path=${LAYOUT_TRIM_RUNTIME_DIR:1} + window_path=${window_path:0:1}:${window_path:1} + echo "Creating $zip_name in ${window_path}" + powershell -NoLogo -Sta -NoProfile -NonInteractive -ExecutionPolicy Unrestricted -Command "Add-Type -Assembly \"System.IO.Compression.FileSystem\"; [System.IO.Compression.ZipFile]::CreateFromDirectory(\"${window_path}\", \"${zip_name}\")" + fi + popd > /dev/null + + runner_trim_runtime_externals_pkg_name="actions-runner-${RUNTIME_ID}-${runner_ver}-noruntime-noexternals" + heading "Packaging ${runner_trim_runtime_externals_pkg_name} (Trimmed)" + + PACKAGE_TRIM_RUNTIME_EXTERNALS_DIR="$PACKAGE_TRIMS_DIR/trim_runtime_externals" + mkdir -p "$PACKAGE_TRIM_RUNTIME_EXTERNALS_DIR" + pushd "$PACKAGE_TRIM_RUNTIME_EXTERNALS_DIR" > /dev/null + if [[ ("$CURRENT_PLATFORM" == "linux") || ("$CURRENT_PLATFORM" == "darwin") ]]; then + tar_name="${runner_trim_runtime_externals_pkg_name}.tar.gz" + echo "Creating $tar_name in ${LAYOUT_TRIM_RUNTIME_EXTERNALS_DIR}" + tar -czf "${tar_name}" -C "${LAYOUT_TRIM_RUNTIME_EXTERNALS_DIR}" . + elif [[ ("$CURRENT_PLATFORM" == "windows") ]]; then + zip_name="${runner_trim_runtime_externals_pkg_name}.zip" + echo "Convert ${LAYOUT_TRIM_RUNTIME_EXTERNALS_DIR} to Windows style path" + window_path=${LAYOUT_TRIM_RUNTIME_EXTERNALS_DIR:1} + window_path=${window_path:0:1}:${window_path:1} + echo "Creating $zip_name in ${window_path}" + powershell -NoLogo -Sta -NoProfile -NonInteractive -ExecutionPolicy Unrestricted -Command "Add-Type -Assembly \"System.IO.Compression.FileSystem\"; [System.IO.Compression.ZipFile]::CreateFromDirectory(\"${window_path}\", \"${zip_name}\")" + fi + popd > /dev/null } if [[ (! -d "${DOTNETSDK_INSTALLDIR}") || (! -e "${DOTNETSDK_INSTALLDIR}/.${DOTNETSDK_VERSION}") || (! -e "${DOTNETSDK_INSTALLDIR}/dotnet") ]]; then