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