mirror of
https://github.com/kuaifan/dootask.git
synced 2025-12-12 19:35:50 +00:00
perf: 自动发布Android
This commit is contained in:
parent
a16f5fca07
commit
053daa621b
55
.github/workflows/publish-android.yml
vendored
Normal file
55
.github/workflows/publish-android.yml
vendored
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
name: Publish Android
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- 'v*'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
Build:
|
||||||
|
name: Build Android
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
environment: build
|
||||||
|
|
||||||
|
if: startsWith(github.event.ref, 'refs/tags/v')
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Use Node.js 20.x
|
||||||
|
uses: actions/setup-node@v1
|
||||||
|
with:
|
||||||
|
node-version: 20.x
|
||||||
|
|
||||||
|
- name: Build Js
|
||||||
|
run: |
|
||||||
|
git submodule init
|
||||||
|
git submodule update --remote "resources/mobile"
|
||||||
|
./cmd appbuild
|
||||||
|
|
||||||
|
- name: Set up JDK 11
|
||||||
|
uses: actions/setup-java@v3
|
||||||
|
with:
|
||||||
|
distribution: 'zulu'
|
||||||
|
java-version: '11'
|
||||||
|
|
||||||
|
- name: Build Android
|
||||||
|
run: |
|
||||||
|
cd resources/mobile/platforms/android/eeuiApp
|
||||||
|
chmod +x ./gradlew
|
||||||
|
./gradlew assembleRelease --quiet
|
||||||
|
|
||||||
|
- name: Upload File
|
||||||
|
env:
|
||||||
|
DP_KEY: ${{ secrets.DP_KEY }}
|
||||||
|
run: |
|
||||||
|
node ./electron/build.js android-upload
|
||||||
|
|
||||||
|
- name: Release
|
||||||
|
uses: softprops/action-gh-release@v2
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GH_TOKEN }}
|
||||||
|
GITHUB_REPOSITORY: ${{ github.repository }}
|
||||||
|
with:
|
||||||
|
files: |
|
||||||
|
resources/mobile/platforms/android/eeuiApp/app/build/outputs/apk/release/*.apk
|
||||||
@ -195,7 +195,7 @@ class IndexController extends InvokeController
|
|||||||
$publishPath = "uploads/desktop/{$publishVersion}/";
|
$publishPath = "uploads/desktop/{$publishVersion}/";
|
||||||
$res = Base::upload([
|
$res = Base::upload([
|
||||||
"file" => Request::file('file'),
|
"file" => Request::file('file'),
|
||||||
"type" => 'desktop',
|
"type" => 'publish',
|
||||||
"path" => $publishPath,
|
"path" => $publishPath,
|
||||||
"fileName" => true
|
"fileName" => true
|
||||||
]);
|
]);
|
||||||
@ -239,29 +239,6 @@ class IndexController extends InvokeController
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
$path = "uploads/android";
|
|
||||||
$dirPath = public_path($path);
|
|
||||||
$lists = Base::readDir($dirPath);
|
|
||||||
$apkFile = null;
|
|
||||||
foreach ($lists as $file) {
|
|
||||||
if (!str_ends_with($file, '.apk')) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if ($apkFile && strtotime($apkFile['time']) > filemtime($file)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
$fileName = Base::leftDelete($file, $dirPath);
|
|
||||||
$fileSize = filesize($file);
|
|
||||||
$apkFile = [
|
|
||||||
'name' => substr($fileName, 1),
|
|
||||||
'time' => date("Y-m-d H:i:s", filemtime($file)),
|
|
||||||
'size' => $fileSize > 0 ? Base::readableBytes($fileSize) : 0,
|
|
||||||
'url' => Base::fillUrl($path . $fileName),
|
|
||||||
];
|
|
||||||
}
|
|
||||||
if ($apkFile) {
|
|
||||||
$files = array_merge([$apkFile], $files);
|
|
||||||
}
|
|
||||||
return view('desktop', ['version' => $name, 'files' => $files]);
|
return view('desktop', ['version' => $name, 'files' => $files]);
|
||||||
}
|
}
|
||||||
// 下载
|
// 下载
|
||||||
|
|||||||
@ -2241,8 +2241,8 @@ class Base
|
|||||||
case 'md':
|
case 'md':
|
||||||
$type = ['md'];
|
$type = ['md'];
|
||||||
break;
|
break;
|
||||||
case 'desktop':
|
case 'publish':
|
||||||
$type = ['yml', 'yaml', 'dmg', 'pkg', 'blockmap', 'zip', 'exe', 'msi'];
|
$type = ['yml', 'yaml', 'dmg', 'pkg', 'blockmap', 'zip', 'exe', 'msi', 'apk'];
|
||||||
break;
|
break;
|
||||||
case 'more':
|
case 'more':
|
||||||
$type = []; // 不限制上传文件类型
|
$type = []; // 不限制上传文件类型
|
||||||
|
|||||||
93
electron/build.js
vendored
93
electron/build.js
vendored
@ -1,4 +1,3 @@
|
|||||||
const os = require('os')
|
|
||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
const fse = require('fs-extra');
|
const fse = require('fs-extra');
|
||||||
const path = require('path')
|
const path = require('path')
|
||||||
@ -108,6 +107,78 @@ function axiosAutoTry(data) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 上传app应用
|
||||||
|
* @param url
|
||||||
|
*/
|
||||||
|
function androidUpload(url) {
|
||||||
|
if (!DP_KEY) {
|
||||||
|
console.error("Missing Deploy Key or GitHub Token and Repository!");
|
||||||
|
process.exit()
|
||||||
|
}
|
||||||
|
const releaseDir = path.resolve(__dirname, "../resources/mobile/platforms/android/eeuiApp/app/build/outputs/apk/release");
|
||||||
|
if (!fs.existsSync(releaseDir)) {
|
||||||
|
console.error("Release not found");
|
||||||
|
process.exit()
|
||||||
|
}
|
||||||
|
fs.readdir(releaseDir, async (err, files) => {
|
||||||
|
if (err) {
|
||||||
|
console.warn(err)
|
||||||
|
} else {
|
||||||
|
const uploadOras = {}
|
||||||
|
for (const filename of files) {
|
||||||
|
const localFile = path.join(releaseDir, filename)
|
||||||
|
if (/\.apk$/.test(filename) && fs.existsSync(localFile)) {
|
||||||
|
const fileStat = fs.statSync(localFile)
|
||||||
|
if (fileStat.isFile()) {
|
||||||
|
uploadOras[filename] = ora(`Upload [0%] ${filename}`).start()
|
||||||
|
const formData = new FormData()
|
||||||
|
formData.append("file", fs.createReadStream(localFile));
|
||||||
|
formData.append("file_num", 1);
|
||||||
|
await axiosAutoTry({
|
||||||
|
axios: {
|
||||||
|
method: 'post',
|
||||||
|
url: url,
|
||||||
|
data: formData,
|
||||||
|
headers: {
|
||||||
|
'Publish-Version': config.version,
|
||||||
|
'Publish-Key': DP_KEY,
|
||||||
|
'Content-Type': 'multipart/form-data;boundary=' + formData.getBoundary(),
|
||||||
|
},
|
||||||
|
onUploadProgress: progress => {
|
||||||
|
const complete = Math.min(99, Math.round(progress.loaded / progress.total * 100 | 0)) + '%'
|
||||||
|
uploadOras[filename].text = `Upload [${complete}] ${filename}`
|
||||||
|
},
|
||||||
|
},
|
||||||
|
onRetry: _ => {
|
||||||
|
uploadOras[filename].warn(`Upload [retry] ${filename}`)
|
||||||
|
uploadOras[filename] = ora(`Upload [0%] ${filename}`).start()
|
||||||
|
},
|
||||||
|
retryNumber: 3
|
||||||
|
}).then(({status, data}) => {
|
||||||
|
if (status !== 200) {
|
||||||
|
uploadOras[filename].fail(`Upload [fail:${status}] ${filename}`)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (!utils.isJson(data)) {
|
||||||
|
uploadOras[filename].fail(`Upload [fail:not json] ${filename}`)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (data.ret !== 1) {
|
||||||
|
uploadOras[filename].fail(`Upload [fail:ret ${data.ret}] ${filename}`)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
uploadOras[filename].succeed(`Upload [100%] ${filename}`)
|
||||||
|
}).catch(_ => {
|
||||||
|
uploadOras[filename].fail(`Upload [fail] ${filename}`)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 通用发布
|
* 通用发布
|
||||||
* @param url
|
* @param url
|
||||||
@ -169,7 +240,19 @@ function genericPublish({url, key, version, output}) {
|
|||||||
uploadOras[filename] = ora(`Upload [0%] ${filename}`).start()
|
uploadOras[filename] = ora(`Upload [0%] ${filename}`).start()
|
||||||
},
|
},
|
||||||
retryNumber: 3
|
retryNumber: 3
|
||||||
}).then(_ => {
|
}).then(({status, data}) => {
|
||||||
|
if (status !== 200) {
|
||||||
|
uploadOras[filename].fail(`Upload [fail:${status}] ${filename}`)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (!utils.isJson(data)) {
|
||||||
|
uploadOras[filename].fail(`Upload [fail:not json] ${filename}`)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (data.ret !== 1) {
|
||||||
|
uploadOras[filename].fail(`Upload [fail:ret ${data.ret}] ${filename}`)
|
||||||
|
return
|
||||||
|
}
|
||||||
uploadOras[filename].succeed(`Upload [100%] ${filename}`)
|
uploadOras[filename].succeed(`Upload [100%] ${filename}`)
|
||||||
}).catch(_ => {
|
}).catch(_ => {
|
||||||
uploadOras[filename].fail(`Upload [fail] ${filename}`)
|
uploadOras[filename].fail(`Upload [fail] ${filename}`)
|
||||||
@ -341,6 +424,12 @@ if (["dev"].includes(argv[2])) {
|
|||||||
notarize: false,
|
notarize: false,
|
||||||
}
|
}
|
||||||
}, false, false)
|
}, false, false)
|
||||||
|
} else if (["android-upload"].includes(argv[2])) {
|
||||||
|
config.app.forEach(({publish}) => {
|
||||||
|
if (publish.provider === 'generic') {
|
||||||
|
androidUpload(publish.url)
|
||||||
|
}
|
||||||
|
})
|
||||||
} else if (["all", "win", "mac"].includes(argv[2])) {
|
} else if (["all", "win", "mac"].includes(argv[2])) {
|
||||||
// 自动编译
|
// 自动编译
|
||||||
platforms.filter(p => {
|
platforms.filter(p => {
|
||||||
|
|||||||
@ -1 +1 @@
|
|||||||
Subproject commit 16153670cdcea2e5e7d02c778f69365098e82857
|
Subproject commit a0c290ae876d4526925d835da242169f0d99c875
|
||||||
Loading…
x
Reference in New Issue
Block a user