diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 41319f8d4a9af0d9d36c0fb85571ea7439beeb4a..d54b6d51d14319e35e89705f0ae0cf8f85409b32 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -10,7 +10,7 @@ jobs:
   release:
     strategy:
       matrix:
-        os: [windows-latest, macos-11]
+        os: [windows-latest, ubuntu-latest, macos-latest]
     runs-on: ${{ matrix.os }}
     if: |
       startsWith(github.repository, 'zzzgydi') &&
@@ -34,6 +34,12 @@ jobs:
         with:
           node-version: 14
 
+      - name: Install Dependencies (ubuntu only)
+        if: matrix.os == 'ubuntu-latest'
+        run: |
+          sudo apt-get update
+          sudo apt-get install -y libgtk-3-dev webkit2gtk-4.0 libappindicator3-dev librsvg2-dev patchelf
+
       - name: Get yarn cache dir path
         id: yarn-cache-dir-path
         run: echo "::set-output name=dir::$(yarn cache dir)"
@@ -68,6 +74,7 @@ jobs:
           prerelease: true
 
       - name: Green zip bundle
+        if: matrix.os == 'windows-latest'
         run: |
           yarn run green
         env:
@@ -75,7 +82,7 @@ jobs:
 
   release-update:
     needs: release
-    runs-on: macos-11
+    runs-on: macos-latest
     if: |
       startsWith(github.repository, 'zzzgydi') &&
       startsWith(github.ref, 'refs/tags/v')
@@ -97,7 +104,7 @@ jobs:
             ${{ runner.os }}-yarn-
 
       - name: Yarn install
-        run: yarn
+        run: yarn install
 
       - name: Release update.json
         run: yarn run release
diff --git a/scripts/release.mjs b/scripts/release.mjs
index 175204374bde9f92e5b5f82d3b1119a63b42d239..4599e021a0abb4d4ad109c078819a6c2ec4267e7 100644
--- a/scripts/release.mjs
+++ b/scripts/release.mjs
@@ -37,6 +37,7 @@ async function resolveRelease() {
     pub_date: new Date().toISOString(),
     platforms: {
       win64: { signature: "", url: "" },
+      linux: { signature: "", url: "" },
       darwin: { signature: "", url: "" },
     },
   };
@@ -48,22 +49,34 @@ async function resolveRelease() {
     if (/\.msi\.zip$/.test(name)) {
       updateData.platforms.win64.url = browser_download_url;
     }
-    // darwin url
-    if (/\.app\.tar\.gz$/.test(name)) {
-      updateData.platforms.darwin.url = browser_download_url;
-    }
     // win64 signature
     if (/\.msi\.zip\.sig$/.test(name)) {
       updateData.platforms.win64.signature = await getSignature(
         browser_download_url
       );
     }
+
+    // darwin url
+    if (/\.app\.tar\.gz$/.test(name)) {
+      updateData.platforms.darwin.url = browser_download_url;
+    }
     // darwin signature
     if (/\.app\.tar\.gz\.sig$/.test(name)) {
       updateData.platforms.darwin.signature = await getSignature(
         browser_download_url
       );
     }
+
+    // linux url
+    if (/\.AppImage\.tar\.gz$/.test(name)) {
+      updateData.platforms.linux.url = browser_download_url;
+    }
+    // linux signature
+    if (/\.AppImage\.tar\.gz\.sig$/.test(name)) {
+      updateData.platforms.linux.signature = await getSignature(
+        browser_download_url
+      );
+    }
   });
 
   await Promise.allSettled(promises);