mirror of
				https://github.com/snltty/linker.git
				synced 2025-10-31 20:43:00 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			274 lines
		
	
	
		
			9.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			274 lines
		
	
	
		
			9.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| const fs = require('fs');
 | |
| const yaml = require('js-yaml');
 | |
| const xml2js = require('xml2js');
 | |
| const moment = require('moment');
 | |
| 
 | |
| const parser = new xml2js.Parser();
 | |
| 
 | |
| function readVersionDesc() {
 | |
|     return new Promise((resolve, reject) => {
 | |
|         const fileContents = fs.readFileSync('../src/linker/linker.csproj', 'utf8');
 | |
|         parser.parseString(fileContents, (error, result) => {
 | |
|             resolve(
 | |
|                 { desc: result.Project.PropertyGroup[0].Description[0], version: result.Project.PropertyGroup[0].FileVersion[0] }
 | |
|             );
 | |
|         });
 | |
|     });
 | |
| }
 | |
| function readYaml(path) {
 | |
|     try {
 | |
|         const fileContents = fs.readFileSync(path, 'utf8');
 | |
|         return yaml.load(fileContents);
 | |
|     } catch (e) {
 | |
|         console.log(e);
 | |
|     }
 | |
| }
 | |
| function writeYaml(path, data) {
 | |
|     try {
 | |
|         const yamlContent = yaml.dump(data);
 | |
|         return fs.writeFileSync(path, yamlContent, 'utf8');
 | |
|     } catch (e) {
 | |
|         console.log(e);
 | |
|     }
 | |
| }
 | |
| function readText(path) {
 | |
|     try {
 | |
|         const fileContents = fs.readFileSync(path, 'utf8');
 | |
|         return fileContents;
 | |
|     } catch (e) {
 | |
|         console.log(e);
 | |
|     }
 | |
| }
 | |
| function writeText(path, data) {
 | |
|     try {
 | |
|         return fs.writeFileSync(path, data, 'utf8');
 | |
|     } catch (e) {
 | |
|         console.log(e);
 | |
|     }
 | |
| }
 | |
| function writeUpload(data, tagName) {
 | |
|     const platforms = {
 | |
|         'win': ['x86', 'x64', 'arm64'],
 | |
|         'linux': ['x64', 'arm', 'arm64'],
 | |
|         'linux-musl': ['x64', 'arm', 'arm64'],
 | |
|         'osx': ['x64', 'arm64'],
 | |
|     };
 | |
|     for (let plat in platforms) {
 | |
|         let archs = platforms[plat];
 | |
|         for (let i = 0; i < archs.length; i++) {
 | |
|             let arch = archs[i];
 | |
| 
 | |
|             data.jobs.build.steps.push({
 | |
|                 name: `upload-${plat}-${arch}-oss`,
 | |
|                 id: `upload-${plat}-${arch}-oss`,
 | |
|                 uses: 'tvrcgo/oss-action@v0.1.1',
 | |
|                 with: {
 | |
|                     'region': 'oss-cn-shenzhen',
 | |
|                     'key-id': '${{ secrets.ALIYUN_OSS_ID }}',
 | |
|                     'key-secret': '${{ secrets.ALIYUN_OSS_SECRET }}',
 | |
|                     'bucket': 'ide-qbcode',
 | |
|                     'asset-path': `./public/publish-zip/linker-${plat}-${arch}.zip`,
 | |
|                     'target-path': `/downloads/linker/${tagName}/linker-${plat}-${arch}.zip`
 | |
|                 }
 | |
|             });
 | |
|             data.jobs.build.steps.push({
 | |
|                 name: `upload-${plat}-${arch}`,
 | |
|                 id: `upload-${plat}-${arch}`,
 | |
|                 uses: 'actions/upload-release-asset@master',
 | |
|                 env: {
 | |
|                     'GITHUB_TOKEN': '${{ secrets.ACTIONS_TOKEN }}'
 | |
|                 },
 | |
|                 with: {
 | |
|                     'upload_url': '${{ steps.create_release.outputs.upload_url }}',
 | |
|                     'asset_path': `./public/publish-zip/linker-${plat}-${arch}.zip`,
 | |
|                     'asset_name': `linker-${plat}-${arch}.zip`,
 | |
|                     'asset_content_type': 'application/zip'
 | |
|                 }
 | |
|             });
 | |
|         };
 | |
|     }
 | |
|     data.jobs.build.steps.push({
 | |
|         name: `upload-windows-route`,
 | |
|         id: `upload-windows-route`,
 | |
|         uses: 'actions/upload-release-asset@master',
 | |
|         env: {
 | |
|             'GITHUB_TOKEN': '${{ secrets.ACTIONS_TOKEN }}'
 | |
|         },
 | |
|         with: {
 | |
|             'upload_url': '${{ steps.create_release.outputs.upload_url }}',
 | |
|             'asset_path': `./public/publish-zip/linker-windows-route.zip`,
 | |
|             'asset_name': `linker-windows-route.zip`,
 | |
|             'asset_content_type': 'application/zip'
 | |
|         }
 | |
|     });
 | |
|     data.jobs.build.steps.push({
 | |
|         name: `upload-windows-route-oss`,
 | |
|         id: `upload-windows-route-oss`,
 | |
|         uses: 'tvrcgo/oss-action@v0.1.1',
 | |
|         with: {
 | |
|             'region': 'oss-cn-shenzhen',
 | |
|             'key-id': '${{ secrets.ALIYUN_OSS_ID }}',
 | |
|             'key-secret': '${{ secrets.ALIYUN_OSS_SECRET }}',
 | |
|             'bucket': 'ide-qbcode',
 | |
|             'asset-path': `./public/publish-zip/linker-windows-route.zip`,
 | |
|             'target-path': `/downloads/linker/${tagName}/linker-windows-route.zip`
 | |
|         }
 | |
|     });
 | |
| 
 | |
|     data.jobs.build.steps.push({
 | |
|         name: `upload-version-oss`,
 | |
|         id: `upload-version-oss`,
 | |
|         uses: 'tvrcgo/oss-action@v0.1.1',
 | |
|         with: {
 | |
|             'region': 'oss-cn-shenzhen',
 | |
|             'key-id': '${{ secrets.ALIYUN_OSS_ID }}',
 | |
|             'key-secret': '${{ secrets.ALIYUN_OSS_SECRET }}',
 | |
|             'bucket': 'ide-qbcode',
 | |
|             'asset-path': `./public/version.txt`,
 | |
|             'target-path': `/downloads/linker/version.txt`
 | |
|         }
 | |
|     });
 | |
| 
 | |
|     data.jobs.build.steps.push({
 | |
|         name: `upload-install-service-oss`,
 | |
|         id: `upload-install-service-oss`,
 | |
|         uses: 'tvrcgo/oss-action@v0.1.1',
 | |
|         with: {
 | |
|             'region': 'oss-cn-shenzhen',
 | |
|             'key-id': '${{ secrets.ALIYUN_OSS_ID }}',
 | |
|             'key-secret': '${{ secrets.ALIYUN_OSS_SECRET }}',
 | |
|             'bucket': 'ide-qbcode',
 | |
|             'asset-path': `./src/linker/linker.service`,
 | |
|             'target-path': `/downloads/linker/linker.service`
 | |
|         }
 | |
|     });
 | |
|     data.jobs.build.steps.push({
 | |
|         name: `upload-install-oss`,
 | |
|         id: `upload-install-oss`,
 | |
|         uses: 'tvrcgo/oss-action@v0.1.1',
 | |
|         with: {
 | |
|             'region': 'oss-cn-shenzhen',
 | |
|             'key-id': '${{ secrets.ALIYUN_OSS_ID }}',
 | |
|             'key-secret': '${{ secrets.ALIYUN_OSS_SECRET }}',
 | |
|             'bucket': 'ide-qbcode',
 | |
|             'asset-path': `./src/linker/linker-install.sh`,
 | |
|             'target-path': `/downloads/linker/linker-install.sh`
 | |
|         }
 | |
|     });
 | |
| 
 | |
| }
 | |
| function writeUploadIpk(data, tagName) {
 | |
|     const platforms = ['x64', 'arm', 'arm64'];
 | |
|     for (let i = 0; i < platforms.length; i++) {
 | |
|         let arch = platforms[i];
 | |
| 
 | |
|         data.jobs.build.steps.push({
 | |
|             name: `upload-${arch}-oss`,
 | |
|             id: `upload-${arch}-oss`,
 | |
|             uses: 'tvrcgo/oss-action@v0.1.1',
 | |
|             with: {
 | |
|                 'region': 'oss-cn-shenzhen',
 | |
|                 'key-id': '${{ secrets.ALIYUN_OSS_ID }}',
 | |
|                 'key-secret': '${{ secrets.ALIYUN_OSS_SECRET }}',
 | |
|                 'bucket': 'ide-qbcode',
 | |
|                 'asset-path': `./public/publish-ipk/${arch}/linker-${arch}.ipk`,
 | |
|                 'target-path': `/downloads/linker/${tagName}/linker-${arch}.ipk`
 | |
|             }
 | |
|         });
 | |
|         data.jobs.build.steps.push({
 | |
|             name: `upload-${arch}`,
 | |
|             id: `upload-${arch}`,
 | |
|             uses: 'actions/upload-release-asset@master',
 | |
|             env: {
 | |
|                 'GITHUB_TOKEN': '${{ secrets.ACTIONS_TOKEN }}'
 | |
|             },
 | |
|             with: {
 | |
|                 'upload_url': '${{ steps.get_release.outputs.upload_url }}',
 | |
|                 'asset_path': `./public/publish-ipk/${arch}/linker-${arch}.ipk`,
 | |
|                 'asset_name': `linker-${arch}.ipk`,
 | |
|                 'asset_content_type': 'application/ipk'
 | |
|             }
 | |
|         });
 | |
|     };
 | |
| }
 | |
| function writeUploadLoongArch64(data, tagName) {
 | |
|     data.jobs.build.steps.push({
 | |
|         name: `upload-loongarch64-oss`,
 | |
|         id: `upload-loongarch64-oss`,
 | |
|         uses: 'tvrcgo/oss-action@v0.1.1',
 | |
|         with: {
 | |
|             'region': 'oss-cn-shenzhen',
 | |
|             'key-id': '${{ secrets.ALIYUN_OSS_ID }}',
 | |
|             'key-secret': '${{ secrets.ALIYUN_OSS_SECRET }}',
 | |
|             'bucket': 'ide-qbcode',
 | |
|             'asset-path': `./linker-loongarch64.zip`,
 | |
|             'target-path': `/downloads/linker/${tagName}/linker-loongarch64.zip`
 | |
|         }
 | |
|     });
 | |
|     data.jobs.build.steps.push({
 | |
|         name: `upload-loongarch64`,
 | |
|         id: `upload-loongarch64`,
 | |
|         uses: 'actions/upload-release-asset@master',
 | |
|         env: {
 | |
|             'GITHUB_TOKEN': '${{ secrets.ACTIONS_TOKEN }}'
 | |
|         },
 | |
|         with: {
 | |
|             'upload_url': '${{ steps.get_release.outputs.upload_url }}',
 | |
|             'asset_path': `./linker-loongarch64.zip`,
 | |
|             'asset_name': `linker-loongarch64.zip`,
 | |
|             'asset_content_type': 'application/zip'
 | |
|         }
 | |
|     });
 | |
| }
 | |
| 
 | |
| readVersionDesc().then((desc) => {
 | |
| 
 | |
|     const data = readYaml('../ymls/dotnet.yml');
 | |
|     data.jobs.build.steps = data.jobs.build.steps.filter(c => c.uses != 'actions/upload-release-asset@master' && c.uses != 'tvrcgo/oss-action@v0.1.1');
 | |
| 
 | |
|     data.jobs.build.steps.filter(c => c.id == 'create_release')[0].with.body = desc.desc;
 | |
|     data.jobs.build.steps.filter(c => c.id == 'create_release')[0].with.tag_name = `v${desc.version}`;
 | |
|     data.jobs.build.steps.filter(c => c.id == 'create_release')[0].with.release_name = `v${desc.version}.\${{ steps.date.outputs.today }}`;
 | |
| 
 | |
|     fs.writeFileSync('../version.txt', `v${desc.version}\n${moment().format('YYYY-MM-DD HH:mm:ss')}\n${desc.desc}`, 'utf8');
 | |
| 
 | |
|     writeUpload(data, `v${desc.version}`);
 | |
|     writeYaml('../.github/workflows/dotnet.yml', data);
 | |
| 
 | |
|     let publishText = readText('../ymls/publish-docker.sh');
 | |
|     while (publishText.indexOf('{{version}}') >= 0) {
 | |
|         publishText = publishText.replace('{{version}}', desc.version);
 | |
|     }
 | |
|     writeText('../publish-docker.sh', publishText);
 | |
| 
 | |
|     let publishIpkText = readText('../ymls/publish-ipk.sh');
 | |
|     while (publishIpkText.indexOf('{{version}}') >= 0) {
 | |
|         publishIpkText = publishIpkText.replace('{{version}}', desc.version);
 | |
|     }
 | |
|     writeText('../publish-ipk.sh', publishIpkText);
 | |
| 
 | |
| 
 | |
|     let dockerText = readText('../ymls/docker.yml');
 | |
|     while (dockerText.indexOf('{{version}}') >= 0) {
 | |
|         dockerText = dockerText.replace('{{version}}', desc.version);
 | |
|     }
 | |
|     writeText('../.github/workflows/docker.yml', dockerText);
 | |
| 
 | |
| 
 | |
|     let nugetText = readText('../ymls/nuget.yml');
 | |
|     while (nugetText.indexOf('{{version}}') >= 0) {
 | |
|         nugetText = nugetText.replace('{{version}}', desc.version);
 | |
|     }
 | |
|     writeText('../.github/workflows/nuget.yml', nugetText);
 | |
| 
 | |
| 
 | |
|     const ipkData = readYaml('../ymls/ipk.yml');
 | |
|     writeUploadIpk(ipkData, `v${desc.version}`);
 | |
|     writeYaml('../.github/workflows/ipk.yml', ipkData);
 | |
| 
 | |
|     /*
 | |
|     const loongarch64Data = readYaml('../ymls/loongarch64.yml');
 | |
|     writeUploadLoongArch64(loongarch64Data, `v${desc.version}`);
 | |
|     writeYaml('../.github/workflows/loongarch64.yml', loongarch64Data);
 | |
|     */
 | |
| }); | 
