瀏覽代碼

Cross Compile linux armhf/arm64 artifacts #8613 by @Jai-JAP

Eugene Pankov 2 年之前
父節點
當前提交
87a893480c
共有 8 個文件被更改,包括 139 次插入88 次删除
  1. 128 77
      .github/workflows/build.yml
  2. 0 2
      HACKING.md
  3. 1 1
      app/lib/pty.ts
  4. 1 1
      app/package.json
  5. 1 1
      app/webpack.config.main.mjs
  6. 1 1
      scripts/build-linux.mjs
  7. 1 1
      scripts/sentry-upload.mjs
  8. 6 4
      scripts/vars.mjs

+ 128 - 77
.github/workflows/build.yml

@@ -131,101 +131,146 @@ jobs:
     needs: Lint
     strategy:
       matrix:
-        build-arch: [ x64, arm64, armv7l ]
+        include:
+          - build-arch: x64
+            arch: amd64
+          - build-arch: arm64
+            arch: arm64
+            triplet: aarch64-linux-gnu-
+          - build-arch: arm 
+            arch: armhf
+            triplet: arm-linux-gnueabihf-
+    env:
+      CC: ${{matrix.triplet}}gcc
+      CXX: ${{matrix.triplet}}g++
+      ARCH: ${{matrix.build-arch}}
+      npm_config_arch: ${{matrix.build-arch}}
+      npm_config_target_arch: ${{matrix.build-arch}}
 
     steps:
     - name: Checkout
       uses: actions/checkout@v3
       with:
         fetch-depth: 0
-
-    - name: Set up multiarch/qemu-user-static
-      run: docker run --rm --privileged multiarch/qemu-user-static:register --reset
-      if: matrix.build-arch != 'x64'
-
-    - name: Install Node (x64)
+            
+    - name: Install Node
       uses: actions/[email protected]
       with:
-        node-version: 16
-      if: matrix.build-arch == 'x64'
+        node-version: 18
 
-    - name: Install deps (x64)
+    - name: Install deps (amd64)
       run: |
         sudo apt-get update
-        sudo apt-get install libarchive-tools zsh
+        sudo apt-get install libarchive-tools zsh 
+        
+    - name: Install npm_modules (amd64)
+      run: |
         npm i -g yarn
         yarn --network-timeout 1000000
       if: matrix.build-arch == 'x64'
+      
+    - name: Setup Crossbuild (${{matrix.arch}})
+      run: |
+          sudo apt-get update -y && sudo apt-get install schroot sbuild debootstrap -y
+          sudo debootstrap --include=git,curl,gnupg,ca-certificates,crossbuild-essential-${{matrix.arch}},python-dev,python3-dev,libarchive-tools,cmake --variant=buildd --exclude=snapd --components=main,restricted,universe,multiverse --extractor=dpkg-deb bionic /build-chroot/
+          echo 'deb [arch=amd64,i386] http://archive.ubuntu.com/ubuntu bionic main restricted universe multiverse' | sudo tee /build-chroot/etc/apt/sources.list >/dev/null
+          echo 'deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports bionic main restricted universe multiverse' | sudo tee -a /build-chroot/etc/apt/sources.list >/dev/null
+          curl -s https://deb.nodesource.com/gpgkey/nodesource.gpg.key | gpg --dearmor | sudo tee /build-chroot/etc/apt/trusted.gpg.d/nodesource.gpg >/dev/null
+          echo 'deb http://deb.nodesource.com/node_16.x bionic main' | sudo tee /build-chroot/etc/apt/sources.list.d/nodesource.list >/dev/null
+          echo "[build-chroot]
+          description=Ubuntu 18.04 Build chroot
+          type=directory
+          directory=/build-chroot
+          root-groups=root,sudo
+          profile=buildd
+          personality=linux
+          union-type=overlay" | sudo tee /etc/schroot/chroot.d/build-chroot.pref >/dev/null 
+          echo "/home           /home           none    rw,bind         0       0" | sudo tee -a /etc/schroot/buildd/fstab >/dev/null
 
-    - name: Webpack (x64)
-      run: yarn run build
-      if: matrix.build-arch == 'x64'
+      if: matrix.build-arch != 'x64'
 
-    - name: Prepackage plugins (x64)
-      run: scripts/prepackage-plugins.mjs
-      if: ${{matrix.build-arch == 'x64'}}
+    - name: Install node_modules & CrossBuild native modules for ${{matrix.arch}}
+      run: |
+          sudo schroot -c build-chroot -u root -- bash -c "apt-get update -y
+          dpkg --add-architecture ${{matrix.arch}}
+          apt-get install -y nodejs libfontconfig-dev:${{matrix.arch}} libsecret-1-dev:${{matrix.arch}} libnss3:${{matrix.arch}} libatk1.0-0:${{matrix.arch}} libatk-bridge2.0-0:${{matrix.arch}} libgdk-pixbuf2.0-0:${{matrix.arch}} libgtk-3-0:${{matrix.arch}} libgbm1:${{matrix.arch}}
+          export CC=${{matrix.triplet}}gcc CXX=${{matrix.triplet}}g++ LD=${{matrix.triplet}}ld 
+          if [[ ${{matrix.arch}} == 'arm64' ]]; then
+            export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/lib/aarch64-linux-gnu/pkgconfig/
+          elif [[ ${{matrix.arch}} == 'armhf' ]]; then
+            export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/lib/arm-linux-gnueabihf/pkgconfig/
+          fi
+          export ARCH=${{matrix.build-arch}} npm_config_arch=${{matrix.build-arch}} npm_config_target_arch=${{matrix.build-arch}}
+          npm i -g yarn
+          yarn --network-timeout 1000000 --arch=${{matrix.build-arch}} --target_arch=${{matrix.build-arch}}"
+      if: matrix.build-arch != 'x64'
 
-    - name: Build packages (x64)
+    - name: Webpack (${{matrix.arch}})
+      run: yarn run build --arch=${{matrix.build-arch}} --target_arch=${{matrix.build-arch}}
+
+    - name: Prepackage plugins (${{matrix.arch}})
+      run: scripts/prepackage-plugins.mjs
+      
+    - name: Build packages (${{matrix.arch}})
       run: scripts/build-linux.mjs
-      if: ${{matrix.build-arch == 'x64'}}
       env:
         GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
         KEYGEN_TOKEN: ${{ secrets.KEYGEN_TOKEN }}
         USE_HARD_LINKS: false
         # DEBUG: electron-builder,electron-builder:*
-
+        
     - name: Build web resources
       run: zsh -c 'tar czf tabby-web.tar.gz (tabby-*|web)/dist'
       if: matrix.build-arch == 'x64'
 
-    - name: Install deps and Build (arm64)
-      uses: docker://multiarch/ubuntu-core:arm64-bionic
-      with:
-          args: >
-            bash -c
-            "apt update && apt install curl lsb-release gnupg -y &&
-            curl -fsSL https://deb.nodesource.com/setup_16.x | bash - &&
-            apt install make build-essential git ruby libarchive-tools nodejs rpm libsecret-1-dev libfontconfig1-dev -y &&
-            git config --global --add safe.directory /github/workspace &&
-            gem install public_suffix -v 4.0.7 &&
-            gem install fpm --no-document &&
-            npm i -g yarn &&
-            cd /github/workspace &&
-            yarn --network-timeout 1000000 &&
-            yarn run build &&
-            scripts/prepackage-plugins.mjs &&
-            USE_SYSTEM_FPM=true scripts/build-linux.mjs"
-      env:
-        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
-        KEYGEN_TOKEN: ${{ secrets.KEYGEN_TOKEN }}
-        USE_HARD_LINKS: false
-      if: matrix.build-arch == 'arm64' && github.repository == 'Eugeny/tabby' && startsWith(github.ref, 'refs/tags')
-
-    - name: Install deps and Build (armv7l)
-      uses: docker://multiarch/ubuntu-core:armhf-bionic
-      with:
-          args: >
-            bash -c
-            "apt update && apt install curl lsb-release gnupg -y &&
-            curl -fsSL https://deb.nodesource.com/setup_16.x | bash - &&
-            apt install make build-essential git ruby libarchive-tools nodejs rpm libsecret-1-dev libfontconfig1-dev -y &&
-            git config --global --add safe.directory /github/workspace &&
-            gem install public_suffix -v 4.0.7 &&
-            gem install fpm --no-document &&
-            npm i -g yarn &&
-            cd /github/workspace &&
-            sed -i '/    \"electron\":/c\    \"electron\": \"17.0.0\",' package.json &&
-            yarn --network-timeout 1000000 &&
-            yarn run build &&
-            scripts/prepackage-plugins.mjs &&
-            USE_SYSTEM_FPM=true scripts/build-linux.mjs"
-      env:
-        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
-        KEYGEN_TOKEN: ${{ secrets.KEYGEN_TOKEN }}
-        USE_HARD_LINKS: false
-      if: matrix.build-arch == 'armv7l' && github.repository == 'Eugeny/tabby' && startsWith(github.ref, 'refs/tags')
-
-    - name: Upload symbols
+#     - name: Install deps and Build (arm64)
+#       uses: docker://multiarch/ubuntu-core:arm64-bionic
+#       with:
+#           args: >
+#             bash -c
+#             "apt update && apt install curl lsb-release gnupg -y &&
+#             curl -fsSL https://deb.nodesource.com/setup_16.x | bash - &&
+#             apt install make build-essential git ruby libarchive-tools nodejs rpm libsecret-1-dev libfontconfig1-dev -y &&
+#             git config --global --add safe.directory /github/workspace &&
+#             gem install public_suffix -v 4.0.7 &&
+#             gem install fpm --no-document &&
+#             npm i -g yarn &&
+#             cd /github/workspace &&
+#             yarn --network-timeout 1000000 &&
+#             yarn run build &&
+#             scripts/prepackage-plugins.mjs &&
+#             USE_SYSTEM_FPM=true scripts/build-linux.mjs"
+#       env:
+#         GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+#         KEYGEN_TOKEN: ${{ secrets.KEYGEN_TOKEN }}
+#         USE_HARD_LINKS: false
+#       if: matrix.build-arch == 'arm64' && github.repository == 'Eugeny/tabby' && startsWith(github.ref, 'refs/tags')
+
+#     - name: Install deps and Build (armv7l)
+#       uses: docker://multiarch/ubuntu-core:armhf-bionic
+#       with:
+#           args: >
+#             bash -c
+#             "apt update && apt install curl lsb-release gnupg -y &&
+#             curl -fsSL https://deb.nodesource.com/setup_16.x | bash - &&
+#             apt install make build-essential git ruby libarchive-tools nodejs rpm libsecret-1-dev libfontconfig1-dev -y &&
+#             git config --global --add safe.directory /github/workspace &&
+#             gem install public_suffix -v 4.0.7 &&
+#             gem install fpm --no-document &&
+#             npm i -g yarn &&
+#             cd /github/workspace &&
+#             sed -i '/    \"electron\":/c\    \"electron\": \"17.0.0\",' package.json &&
+#             yarn --network-timeout 1000000 &&
+#             yarn run build &&
+#             scripts/prepackage-plugins.mjs &&
+#             USE_SYSTEM_FPM=true scripts/build-linux.mjs"
+#       env:
+#         GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+#         KEYGEN_TOKEN: ${{ secrets.KEYGEN_TOKEN }}
+#         USE_HARD_LINKS: false
+#       if: matrix.build-arch == 'arm' && github.repository == 'Eugeny/tabby' && startsWith(github.ref, 'refs/tags')
+
+    - name: Upload symbols (amd64 only)
       run: |
         sudo npm install -g @sentry/cli --unsafe-perm
         ./scripts/sentry-upload.mjs
@@ -245,31 +290,37 @@ jobs:
         dir: 'dist'
 
     - uses: actions/upload-artifact@master
-      name: Upload DEB
+      name: Upload AppImage (${{matrix.arch}})
+      with:
+        name: Linux AppImage (${{matrix.arch}})
+        path: dist/*.AppImage
+    
+    - uses: actions/upload-artifact@master
+      name: Upload DEB (${{matrix.arch}})
       with:
-        name: Linux DEB (${{matrix.build-arch}})
+        name: Linux DEB (${{matrix.arch}})
         path: dist/*.deb
 
     - uses: actions/upload-artifact@master
-      name: Upload RPM
+      name: Upload RPM (${{matrix.arch}})
       with:
-        name: Linux RPM (${{matrix.build-arch}})
+        name: Linux RPM (${{matrix.arch}})
         path: dist/*.rpm
 
     - uses: actions/upload-artifact@master
-      name: Upload Pacman Package
+      name: Upload Pacman Package (${{matrix.arch}})
       with:
-        name: Linux Pacman (${{matrix.build-arch}})
+        name: Linux Pacman (${{matrix.arch}})
         path: dist/*.pacman
 
     - uses: actions/upload-artifact@master
-      name: Upload Linux tarball
+      name: Upload Linux tarball (${{matrix.arch}})
       with:
-        name: Linux tarball (${{matrix.build-arch}})
+        name: Linux tarball (${{matrix.arch}})
         path: dist/*.tar.gz
 
     - uses: actions/upload-artifact@master
-      name: Upload web tarball
+      name: Upload web tarball (amd64 only)
       with:
         name: Web tarball
         path: tabby-web.tar.gz

+ 0 - 2
HACKING.md

@@ -17,8 +17,6 @@ First, from within the `tabby` directory install the dependencies via yarn:
 yarn
 ```
 
-**Note: For compiling for Linux armv7l, you need to downgrade electron to 17.0.0 in package.json present in root directory of tabby source**
-
 ```
 # Linux (Debian/Ubuntu here as an example)
 sudo apt install libfontconfig-dev libsecret-1-dev libarchive-tools libnss3 libatk1.0-0 libatk-bridge2.0-0 libgdk-pixbuf2.0-0 libgtk-3-0 libgbm1 cmake

+ 1 - 1
app/lib/pty.ts

@@ -1,4 +1,4 @@
-import * as nodePTY from '@tabby-gang/node-pty'
+import * as nodePTY from 'node-pty'
 import { v4 as uuidv4 } from 'uuid'
 import { ipcMain } from 'electron'
 import { Application } from './app'

+ 1 - 1
app/package.json

@@ -16,7 +16,7 @@
   },
   "dependencies": {
     "@electron/remote": "2.0.10",
-    "@tabby-gang/node-pty": "^0.11.0-beta.203",
+    "node-pty": "^0.11.0-beta32",
     "any-promise": "^1.3.0",
     "electron-config": "2.0.0",
     "electron-debug": "^3.2.0",

+ 1 - 1
app/webpack.config.main.mjs

@@ -47,7 +47,7 @@ const config = {
         mz: 'commonjs mz',
         npm: 'commonjs npm',
         'node:os': 'commonjs os',
-        '@tabby-gang/node-pty': 'commonjs @tabby-gang/node-pty',
+        'node-pty': 'commonjs node-pty',
         path: 'commonjs path',
         util: 'commonjs util',
         'source-map-support': 'commonjs source-map-support',

+ 1 - 1
scripts/build-linux.mjs

@@ -9,7 +9,7 @@ process.env.ARCH = (process.env.ARCH || process.arch) === 'arm' ? 'armv7l' : pro
 
 builder({
     dir: true,
-    linux: ['deb', 'tar.gz', 'rpm', 'pacman'],
+    linux: ['deb', 'tar.gz', 'rpm', 'pacman', 'appimage'],
     armv7l: process.env.ARCH === 'armv7l',
     arm64: process.env.ARCH === 'arm64',
     config: {

+ 1 - 1
scripts/sentry-upload.mjs

@@ -9,7 +9,7 @@ sh.exec(`${sentryCli} releases new ${vars.version}`)
 if (process.platform === 'darwin') {
     for (const path of [
         'app/node_modules/@serialport/bindings/build/Release/bindings.node',
-        'app/node_modules/@tabby-gang/node-pty/build/Release/pty.node',
+        'app/node_modules/node-pty/build/Release/pty.node',
         'app/node_modules/fontmanager-redux/build/Release/fontmanager.node',
         'app/node_modules/macos-native-processlist/build/Release/native.node',
     ]) {

+ 6 - 4
scripts/vars.mjs

@@ -3,6 +3,8 @@ import * as fs from 'fs'
 import * as semver from 'semver'
 import * as childProcess from 'child_process'
 
+process.env.ARCH = ((process.env.ARCH || process.arch) === 'arm') ? 'armv7l' : process.env.ARCH || process.arch
+
 import * as url from 'url'
 const __dirname = url.fileURLToPath(new URL('.', import.meta.url))
 
@@ -58,21 +60,21 @@ export const keygenConfig = {
         win32: {
             x64: 'f481b9d6-d5da-4970-b926-f515373e986f',
             arm64: '950999b9-371c-419b-b291-938c5e4d364c',
-        }[process.env.ARCH ?? process.arch],
+        }[process.env.ARCH],
         darwin: {
             arm64: '98fbadee-c707-4cd6-9d99-56683595a846',
             x86_64: 'f5a48841-d5b8-4b7b-aaa7-cf5bffd36461',
             x64: 'f5a48841-d5b8-4b7b-aaa7-cf5bffd36461',
-        }[process.env.ARCH ?? process.arch],
+        }[process.env.ARCH],
         linux: {
             x64: '7bf45071-3031-4a26-9f2e-72604308313e',
             arm64: '39e3c736-d4d4-4fbf-a201-324b7bab0d17',
             armv7l: '50ae0a82-7f47-4fa4-b0a8-b0d575ce9409',
             armhf: '7df5aa12-04ab-4075-a0fe-93b0bbea9643',
-        }[process.env.ARCH ?? process.arch],
+        }[process.env.ARCH],
     }[process.platform],
 }
 
 if (!keygenConfig.product) {
-    throw new Error(`Unrecognized platform ${process.platform}/${process.env.ARCH ?? process.arch}`)
+    throw new Error(`Unrecognized platform ${process.platform}/${process.env.ARCH}`)
 }