diff --git a/.github/workflows/nightly-build.yml b/.github/workflows/nightly-build.yml index 8da8cf9981..f1806eb9a4 100644 --- a/.github/workflows/nightly-build.yml +++ b/.github/workflows/nightly-build.yml @@ -4,17 +4,19 @@ # 2. https://github.com/JasonEtco/create-an-issue # 3. https://docs.github.com/en/actions/learn-github-actions/variables # 4. https://github.com/actions/github-script +# 5. https://docs.github.com/en/actions/writing-workflows/workflow-syntax-for-github-actions#jobsjob_idneeds # name: Nightly Build on: - workflow_dispatch: push: branches: - nightly # Just for test purpose only with the nightly repo + - fix/arm64-and-winget # This schedule will run only from the default branch schedule: - cron: '15 0 * * *' # run at 00:15 AM UTC + workflow_dispatch: defaults: run: @@ -26,6 +28,11 @@ jobs: runs-on: ubuntu-latest # This job is required by the release job, so we should make it run both from Nushell repo and nightly repo # if: github.repository == 'nushell/nightly' + # Map a step output to a job output + outputs: + skip: ${{ steps.vars.outputs.skip }} + build_date: ${{ steps.vars.outputs.build_date }} + nightly_tag: ${{ steps.vars.outputs.nightly_tag }} steps: - name: Checkout uses: actions/checkout@v4 @@ -58,16 +65,62 @@ jobs: # All the changes will be overwritten by the upstream main branch git reset --hard src/main git push origin main -f - let sha_short = (git rev-parse --short origin/main | str trim | str substring 0..7) - let tag_name = $'nightly-($sha_short)' - if (git ls-remote --tags origin $tag_name | is-empty) { - git tag -a $tag_name -m $'Nightly build from ($sha_short)' + + - name: Create Tag and Output Tag Name + if: github.repository == 'nushell/nightly' + id: vars + shell: nu {0} + run: | + let date = date now | format date %m%d + let version = open Cargo.toml | get package.version + let sha_short = (git rev-parse --short origin/main | str trim | str substring 0..6) + let latest_meta = http get https://api.github.com/repos/nushell/nightly/releases + | sort-by -r created_at + | where tag_name =~ nightly + | get tag_name?.0? | default '' + | parse '{version}-nightly.{build}+{hash}' + if ($latest_meta.0?.hash? | default '') == $sha_short { + print $'(ansi g)Latest nightly build is up-to-date, skip rebuilding.(ansi reset)' + $'skip=true(char nl)' o>> $env.GITHUB_OUTPUT + exit 0 + } + let prev_ver = $latest_meta.0?.version? | default '0.0.0' + let build = if ($latest_meta | is-empty) or ($version != $prev_ver) { 1 } else { + ($latest_meta | get build?.0? | default 0 | into int) + 1 + } + let nightly_tag = $'($version)-nightly.($build)+($sha_short)' + $'build_date=($date)(char nl)' o>> $env.GITHUB_OUTPUT + $'nightly_tag=($nightly_tag)(char nl)' o>> $env.GITHUB_OUTPUT + if (git ls-remote --tags origin $nightly_tag | is-empty) { + ls **/Cargo.toml | each {|file| + open --raw $file.name + | str replace --all $'version = "($version)"' $'version = "($version)-nightly.($build)"' + | save --force $file.name + } + # Disable the following two workflows for the automatic committed changes + rm .github/workflows/ci.yml + rm .github/workflows/audit.yml + + # Test the latest release script before merging + # TODO: Remove the following two lines after the test + git fetch origin + if ((git branch -r) =~ fix/arm64-and-winget) { + git checkout scripts/build.rs + git checkout origin/fix/arm64-and-winget wix + git checkout origin/fix/arm64-and-winget .github/workflows/release-pkg.nu + } + # ----------- REMOVE END OF TESTING ------------------ + git add . + git commit -m $'Update version to ($version)-nightly.($build)' + git tag -a $nightly_tag -m $'Nightly build from ($sha_short)' git push origin --tags + git push origin main -f } - standard: + release: name: Nu needs: prepare + if: needs.prepare.outputs.skip != 'true' strategy: fail-fast: false matrix: @@ -84,24 +137,15 @@ jobs: - armv7-unknown-linux-musleabihf - riscv64gc-unknown-linux-gnu - loongarch64-unknown-linux-gnu - extra: ['bin'] include: - target: aarch64-apple-darwin os: macos-latest - target: x86_64-apple-darwin os: macos-latest - target: x86_64-pc-windows-msvc - extra: 'bin' - os: windows-latest - - target: x86_64-pc-windows-msvc - extra: msi os: windows-latest - target: aarch64-pc-windows-msvc - extra: 'bin' - os: windows-latest - - target: aarch64-pc-windows-msvc - extra: msi - os: windows-latest + os: windows-11-arm - target: x86_64-unknown-linux-gnu os: ubuntu-22.04 - target: x86_64-unknown-linux-musl @@ -120,40 +164,64 @@ jobs: os: ubuntu-22.04 runs-on: ${{matrix.os}} - steps: - uses: actions/checkout@v4 with: ref: main fetch-depth: 0 + - name: Install Wix Toolset 6 for Windows + shell: pwsh + if: ${{ startsWith(matrix.os, 'windows') }} + run: | + dotnet tool install --global wix --version 6.0.0 + dotnet workload install wix + $wixPath = "$env:USERPROFILE\.dotnet\tools" + echo "$wixPath" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append + $env:PATH = "$wixPath;$env:PATH" + wix --version + - name: Update Rust Toolchain Target run: | echo "targets = ['${{matrix.target}}']" >> rust-toolchain.toml - name: Setup Rust toolchain and cache - uses: actions-rust-lang/setup-rust-toolchain@v1.12.0 + uses: actions-rust-lang/setup-rust-toolchain@v1 # WARN: Keep the rustflags to prevent from the winget submission error: `CAQuietExec: Error 0xc0000135` with: rustflags: '' - name: Setup Nushell uses: hustcer/setup-nu@v3 + if: ${{ matrix.os != 'windows-11-arm' }} with: version: 0.103.0 - name: Release Nu Binary id: nu + if: ${{ matrix.os != 'windows-11-arm' }} run: nu .github/workflows/release-pkg.nu env: OS: ${{ matrix.os }} REF: ${{ github.ref }} TARGET: ${{ matrix.target }} - _EXTRA_: ${{ matrix.extra }} + + - name: Build Nu for Windows ARM64 + id: nu0 + shell: pwsh + if: ${{ matrix.os == 'windows-11-arm' }} + run: | + $env:OS = 'windows' + $env:REF = '${{ github.ref }}' + $env:TARGET = '${{ matrix.target }}' + cargo build --release --all --target aarch64-pc-windows-msvc + cp ./target/${{ matrix.target }}/release/nu.exe . + ./nu.exe -c 'version' + ./nu.exe ${{github.workspace}}/.github/workflows/release-pkg.nu - name: Create an Issue for Release Failure if: ${{ failure() }} - uses: JasonEtco/create-an-issue@v2.9.2 + uses: JasonEtco/create-an-issue@v2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: @@ -161,13 +229,6 @@ jobs: search_existing: open filename: .github/AUTO_ISSUE_TEMPLATE/nightly-build-fail.md - - name: Set Outputs of Short SHA - id: vars - run: | - echo "date=$(date -u +'%Y-%m-%d')" >> $GITHUB_OUTPUT - sha_short=$(git rev-parse --short HEAD) - echo "sha_short=${sha_short:0:7}" >> $GITHUB_OUTPUT - # REF: https://github.com/marketplace/actions/gh-release # Create a release only in nushell/nightly repo - name: Publish Archive @@ -175,9 +236,39 @@ jobs: if: ${{ startsWith(github.repository, 'nushell/nightly') }} with: prerelease: true - files: ${{ steps.nu.outputs.archive }} - tag_name: nightly-${{ steps.vars.outputs.sha_short }} - name: Nu-nightly-${{ steps.vars.outputs.date }}-${{ steps.vars.outputs.sha_short }} + files: | + ${{ steps.nu.outputs.msi }} + ${{ steps.nu0.outputs.msi }} + ${{ steps.nu.outputs.archive }} + ${{ steps.nu0.outputs.archive }} + tag_name: ${{ needs.prepare.outputs.nightly_tag }} + name: ${{ needs.prepare.outputs.build_date }}-${{ needs.prepare.outputs.nightly_tag }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + sha256sum: + needs: [prepare, release] + name: Create Sha256sum + runs-on: ubuntu-latest + if: github.repository == 'nushell/nightly' + steps: + - name: Download Release Archives + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: >- + gh release download ${{ needs.prepare.outputs.nightly_tag }} + --repo ${{ github.repository }} + --pattern '*' + --dir release + - name: Create Checksums + run: cd release && shasum -a 256 * > ../SHA256SUMS + - name: Publish Checksums + uses: softprops/action-gh-release@v2.0.9 + with: + draft: false + prerelease: true + files: SHA256SUMS + tag_name: ${{ needs.prepare.outputs.nightly_tag }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -185,12 +276,9 @@ jobs: name: Cleanup # Should only run in nushell/nightly repo if: github.repository == 'nushell/nightly' + needs: [release, sha256sum] runs-on: ubuntu-latest steps: - # Sleep for 30 minutes, waiting for the release to be published - - name: Waiting for Release - run: sleep 1800 - - uses: actions/checkout@v4 with: ref: main @@ -205,7 +293,7 @@ jobs: shell: nu {0} run: | let KEEP_COUNT = 10 - let deprecated = (http get https://api.github.com/repos/nushell/nightly/releases | sort-by -r created_at | select tag_name id | range $KEEP_COUNT..) + let deprecated = (http get https://api.github.com/repos/nushell/nightly/releases | sort-by -r created_at | select tag_name id | slice $KEEP_COUNT..) for release in $deprecated { print $'Deleting tag ($release.tag_name)' git push origin --delete $release.tag_name diff --git a/.github/workflows/release-pkg.nu b/.github/workflows/release-pkg.nu index de71325d43..55e2868e9f 100755 --- a/.github/workflows/release-pkg.nu +++ b/.github/workflows/release-pkg.nu @@ -175,48 +175,42 @@ if $os in ['macos-latest'] or $USE_UBUNTU { tar -czf $archive $dest print $'archive: ---> ($archive)'; ls $archive # REF: https://github.blog/changelog/2022-10-11-github-actions-deprecating-save-state-and-set-output-commands/ - echo $"archive=($archive)" | save --append $env.GITHUB_OUTPUT + echo $"archive=($archive)(char nl)" o>> $env.GITHUB_OUTPUT } else if $os =~ 'windows' { let releaseStem = $'($bin)-($version)-($target)' - print $'(char nl)Download less related stuffs...'; hr-line - # todo: less-v661 is out but is released as a zip file. maybe we should switch to that and extract it? - aria2c https://github.com/jftuga/less-Windows/releases/download/less-v608/less.exe -o less.exe - # the below was renamed because it was failing to download for darren. it should work but it wasn't - # todo: maybe we should get rid of this aria2c dependency and just use http get? - #aria2c https://raw.githubusercontent.com/jftuga/less-Windows/master/LICENSE -o LICENSE-for-less.txt - aria2c https://github.com/jftuga/less-Windows/blob/master/LICENSE -o LICENSE-for-less.txt - - # Create Windows msi release package - if (get-env _EXTRA_) == 'msi' { - - let wixRelease = $'($src)/target/wix/($releaseStem).msi' - print $'(char nl)Start creating Windows msi package with the following contents...' - cd $src; hr-line - # Wix need the binaries be stored in target/release/ - cp -r ($'($dist)/*' | into glob) target/release/ - ls target/release/* | print - cargo install cargo-wix --version 0.3.8 - cargo wix --no-build --nocapture --package nu --output $wixRelease + print $'(char nl)(ansi g)Archive contents:(ansi reset)'; hr-line; ls | print + let archive = $'($dist)/($releaseStem).zip' + 7z a $archive ...(glob *) + let pkg = (ls -f $archive | get name) + if not ($pkg | is-empty) { # Workaround for https://github.com/softprops/action-gh-release/issues/280 - let archive = ($wixRelease | str replace --all '\' '/') - print $'archive: ---> ($archive)'; - echo $"archive=($archive)" | save --append $env.GITHUB_OUTPUT + let archive = ($pkg | get 0 | str replace --all '\' '/') + print $'archive: ---> ($archive)' + echo $"archive=($archive)(char nl)" o>> $env.GITHUB_OUTPUT + } - } else { + # Create extra Windows msi release package if dotnet and wix are available + let installed = [dotnet wix] | all { (which $in | length) > 0 } + if $installed and (wix --version | split row . | first | into int) >= 6 { - print $'(char nl)(ansi g)Archive contents:(ansi reset)'; hr-line; ls | print - let archive = $'($dist)/($releaseStem).zip' - 7z a $archive ...(glob *) - let pkg = (ls -f $archive | get name) - if not ($pkg | is-empty) { - # Workaround for https://github.com/softprops/action-gh-release/issues/280 - let archive = ($pkg | get 0 | str replace --all '\' '/') - print $'archive: ---> ($archive)' - echo $"archive=($archive)" | save --append $env.GITHUB_OUTPUT - } + print $'(char nl)Start creating Windows msi package with the following contents...' + cd $src; cd wix; hr-line; mkdir nu + # Wix need the binaries be stored in nu folder + cp -r ($'($dist)/*' | into glob) nu/ + cp $'($dist)/README.txt' . + ls -f nu/* | print + let arch = if $nu.os-info.arch =~ 'x86_64' { 'x64' } else { 'arm64' } + ./nu/nu.exe -c $'NU_RELEASE_VERSION=($version) dotnet build -c Release -p:Platform=($arch)' + glob **/*.msi | print + # Workaround for https://github.com/softprops/action-gh-release/issues/280 + let wixRelease = (glob **/*.msi | where $it =~ bin | get 0 | str replace --all '\' '/') + let msi = $'($wixRelease | path dirname)/nu-($version)-($target).msi' + mv $wixRelease $msi + print $'MSI archive: ---> ($msi)'; + echo $"msi=($msi)(char nl)" o>> $env.GITHUB_OUTPUT } } diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 6fcc71eebe..66f8968caa 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -35,24 +35,15 @@ jobs: - armv7-unknown-linux-musleabihf - riscv64gc-unknown-linux-gnu - loongarch64-unknown-linux-gnu - extra: ['bin'] include: - target: aarch64-apple-darwin os: macos-latest - target: x86_64-apple-darwin os: macos-latest - target: x86_64-pc-windows-msvc - extra: 'bin' - os: windows-latest - - target: x86_64-pc-windows-msvc - extra: msi os: windows-latest - target: aarch64-pc-windows-msvc - extra: 'bin' - os: windows-latest - - target: aarch64-pc-windows-msvc - extra: msi - os: windows-latest + os: windows-11-arm - target: x86_64-unknown-linux-gnu os: ubuntu-22.04 - target: x86_64-unknown-linux-musl @@ -75,6 +66,17 @@ jobs: steps: - uses: actions/checkout@v4 + - name: Install Wix Toolset 6 for Windows + shell: pwsh + if: ${{ startsWith(matrix.os, 'windows') }} + run: | + dotnet tool install --global wix --version 6.0.0 + dotnet workload install wix + $wixPath = "$env:USERPROFILE\.dotnet\tools" + echo "$wixPath" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append + $env:PATH = "$wixPath;$env:PATH" + wix --version + - name: Update Rust Toolchain Target run: | echo "targets = ['${{matrix.target}}']" >> rust-toolchain.toml @@ -88,17 +90,31 @@ jobs: - name: Setup Nushell uses: hustcer/setup-nu@v3 + if: ${{ matrix.os != 'windows-11-arm' }} with: version: 0.103.0 - name: Release Nu Binary id: nu + if: ${{ matrix.os != 'windows-11-arm' }} run: nu .github/workflows/release-pkg.nu env: OS: ${{ matrix.os }} REF: ${{ github.ref }} TARGET: ${{ matrix.target }} - _EXTRA_: ${{ matrix.extra }} + + - name: Build Nu for Windows ARM64 + id: nu0 + shell: pwsh + if: ${{ matrix.os == 'windows-11-arm' }} + run: | + $env:OS = 'windows' + $env:REF = '${{ github.ref }}' + $env:TARGET = '${{ matrix.target }}' + cargo build --release --all --target aarch64-pc-windows-msvc + cp ./target/${{ matrix.target }}/release/nu.exe . + ./nu.exe -c 'version' + ./nu.exe ${{github.workspace}}/.github/workflows/release-pkg.nu # WARN: Don't upgrade this action due to the release per asset issue. # See: https://github.com/softprops/action-gh-release/issues/445 @@ -107,7 +123,11 @@ jobs: if: ${{ startsWith(github.ref, 'refs/tags/') }} with: draft: true - files: ${{ steps.nu.outputs.archive }} + files: | + ${{ steps.nu.outputs.msi }} + ${{ steps.nu0.outputs.msi }} + ${{ steps.nu.outputs.archive }} + ${{ steps.nu0.outputs.archive }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/scripts/build.rs b/scripts/build.rs index e366b4998c..714f931bdd 100644 --- a/scripts/build.rs +++ b/scripts/build.rs @@ -3,7 +3,7 @@ fn main() { let mut res = winresource::WindowsResource::new(); res.set("ProductName", "Nushell"); res.set("FileDescription", "Nushell"); - res.set("LegalCopyright", "Copyright (C) 2022"); + res.set("LegalCopyright", "Copyright (C) 2025"); res.set_icon("assets/nu_logo.ico"); res.compile() .expect("Failed to run the Windows resource compiler (rc.exe)"); diff --git a/wix/License.rtf b/wix/License.rtf index 54e26fad00..9e78b15aef 100644 Binary files a/wix/License.rtf and b/wix/License.rtf differ diff --git a/wix/main.wixproj b/wix/main.wixproj new file mode 100644 index 0000000000..ccf018e0bd --- /dev/null +++ b/wix/main.wixproj @@ -0,0 +1,36 @@ + + + Package + nu-$(Platform) + 82D756D2-19FA-4F09-B10F-64942E89F364 + + SourceDir=$(MSBuildProjectDirectory)\nu; + + true + ICE80 + + + + x64 + $(DefineConstants) + + + + arm64 + $(DefineConstants) + + + + + + + + + + + + + + + + diff --git a/wix/main.wxs b/wix/main.wxs index 9b7ea91e3a..ee43ac4a1a 100644 --- a/wix/main.wxs +++ b/wix/main.wxs @@ -1,468 +1,234 @@ - - + - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> + - - - - - - - - + + - + + + + + + - + + - + + + - + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + - - - + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - + + + + + + + + + + + + - - - + + + + + + + - - - - + + + + + + - + + + + + + + - - + + + + - + + + - - - - - - - "")]]> - - + + - - - + + + - 1. Uncomment the following two `Publish` tags - 2. Comment out or remove the ` + + - --> - - + + - + + + - - + + + - - - - - - - - - + + + + diff --git a/wix/nu.ico b/wix/nu.ico new file mode 100644 index 0000000000..b74f2a336c Binary files /dev/null and b/wix/nu.ico differ