-
Notifications
You must be signed in to change notification settings - Fork 154
313 lines (292 loc) · 12.2 KB
/
Copy pathbuild_publish.yml
File metadata and controls
313 lines (292 loc) · 12.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
name: Build & Release
# Trigger on push to master branch or with a tag
on:
push:
branches:
- 'master'
tags:
- v*
# If previous workflow is still running, we push again, we will cancel the previous workflow
concurrency:
group: ${{ github.workflow }}-${{ github.ref_name }}
cancel-in-progress: true
jobs:
Build:
strategy:
fail-fast: false
matrix:
include:
- target: Android
os: ubuntu-latest
artifact_name: release-Android
artifact_path: build/app/outputs/apk/release/*.apk
- target: Windows
os: windows-latest
artifact_name: release-Windows
artifact_path: build/windows/*.zip
- target: Linux-x64-deb
os: ubuntu-22.04
artifact_name: release-Linux-x64-deb
artifact_path: |
build/linux/*.deb
# - target: Linux-x64-AppImage
# os: ubuntu-22.04
# artifact_name: release-Linux-x64-AppImage
# artifact_path: |
# build/linux/*.AppImage
- target: Linux-arm64-deb
os: ubuntu-22.04-arm
artifact_name: release-Linux-arm64-deb
artifact_path: |
build/linux/*.deb
- target: iOS
os: macos-latest
cache_pod_key: ios-pods
cache_pod_path: ios/Pods
cache_pod_restore_keys_hash_file: ios/Podfile.lock
artifact_name: release-iOS
artifact_path: build/**/*.ipa
- target: macOS
os: macos-latest
cache_pod_key: macos-pods
cache_pod_path: macos/Pods
cache_pod_restore_keys_hash_file: macos/Podfile.lock
artifact_name: release-macOS
artifact_path: /Users/runner/work/JHenTai/JHenTai/*.dmg
outputs:
version: ${{ steps.get_version.outputs.version }}
arch: ${{ steps.get_version.outputs.arch}}
runs-on: ${{ matrix.os }}
env:
FLUTTER_VERSION: 3.24.4
steps:
# Checkout branch
- name: Checkout
uses: actions/checkout@v3
# Add Android keystore
- name: Setup Android keystore
if: matrix.target == 'Android'
run: |
echo "${{ secrets.ENCODED_KEYSTORE }}" | base64 -di > android/app/upload-keystore.jks
echo "${{ secrets.KEY_PROPERTIES }}" > android/key.properties
# Add JHenTai api serret
- name: Setup JHenTai API Secret
run: |
echo "${{ secrets.JH_API_SECRET_CONFIG }}" > lib/src/config/jh_api_secret_config.dart
# Setup Flutter
- name: Setup Flutter
uses: subosito/flutter-action@v2
with:
flutter-version: ${{ env.FLUTTER_VERSION }}
channel: 'master'
cache: true
# Output Flutter Version
- name: Output Flutter Version
run: flutter --version
# Cache Pod
- name: Cache Pod
if: matrix.cache_pod_key != null
uses: actions/cache@v3
with:
key: ${{ matrix.cache_pod_key }}
path: ${{ matrix.cache_pod_path }}
restore-keys: ${{ matrix.cache_key }}-${{ hashFiles(matrix.cache_pod_restore_keys_hash_file)}}
# Setup JDK
- name: Setup JDK 17 (Android)
if: matrix.target == 'Android'
uses: actions/setup-java@v3
with:
distribution: 'zulu'
java-version: '17'
cache: gradle
# Xcodebuild
- name: Build Xcode
if: matrix.os == 'macos-latest'
run: xcodebuild -resolvePackageDependencies -workspace ios/Runner.xcworkspace -scheme Runner -configuration Release
# Flutter Pub Get
- name: Flutter Pub Get
run: |
git config --global core.longpaths true
flutter pub get
# Get app version
- name: Get app version
id: get_version
shell: bash
run: |
echo "version=$(head -n 5 pubspec.yaml | tail -n 1 | cut -d ' ' -f 2)" >> $GITHUB_OUTPUT
echo "arch=$(echo $RUNNER_ARCH | tr '[:upper:]' '[:lower:]')" >> $GITHUB_OUTPUT
# Build Android .apk
- name: Build Android
if: matrix.target == 'Android'
run: |
flutter build apk -t lib/src/main.dart --release --split-per-abi
cd build/app/outputs/apk/release
mv app-arm64-v8a-release.apk JHenTai-${{ steps.get_version.outputs.version }}-arm64-v8a.apk
mv app-armeabi-v7a-release.apk JHenTai-${{ steps.get_version.outputs.version }}-armeabi-v7a.apk
mv app-x86_64-release.apk JHenTai-${{ steps.get_version.outputs.version }}-x64.apk
# Build iOS .ipa
- name: Build iOS
if: matrix.target == 'ios'
run: |
flutter precache --ios
cd ios
pod update
cd ..
flutter build ios -t lib/src/main.dart --release --no-codesign
sh thin-payload.sh build/ios/iphoneos/*.app
cd build
mkdir -p Payload
mv ios/iphoneos/*.app Payload
zip -9 JHenTai_${{ steps.get_version.outputs.version }}.ipa -r Payload
# Build macOS .dmg
- name: Build macOS
if: matrix.target == 'macOS'
run: |
flutter precache --macos
cd macos
pod update
cd ..
sh dmg.sh
# Build Windows .zip
- name: Build Windows
if: matrix.target == 'Windows'
run: |
flutter build windows -t lib/src/main.dart --release
$DestDir = "build\windows\JHenTai_${{ steps.get_version.outputs.version }}"
$SrcDir = "build\windows\x64\runner\Release"
New-Item -Path $DestDir -ItemType Directory
Copy-Item $SrcDir\* -Recurse $DestDir
Copy-Item -Filter *.dll -Path windows\* -Destination $DestDir -Force
Compress-Archive $DestDir build\windows\JHenTai_${{ steps.get_version.outputs.version }}_Windows.zip
# Build Linux .deb
- name: Build Linux deb
if: matrix.target == 'Linux-x64-deb' || matrix.target == 'Linux-arm64-deb'
run: |
# Prepare build depends
sudo apt-get update -y
sudo apt-get install -y ninja-build libfuse2 webkit2gtk-4.1
# Compile
flutter build linux --release -t lib/src/main.dart
# Build debian package
mkdir -p build/linux/JHenTai-${{ steps.get_version.outputs.version }}-Linux-${{ steps.get_version.outputs.arch }}
cd build/linux/JHenTai-${{ steps.get_version.outputs.version }}-Linux-${{ steps.get_version.outputs.arch }}
mkdir -p opt/jhentai
mkdir -p usr/share/applications
mkdir -p usr/share/icons/hicolor/512x512/apps
cp -r ../${{ steps.get_version.outputs.arch }}/release/bundle/* opt/jhentai
cp -r ../../../linux/assets/DEBIAN .
chmod 0755 DEBIAN/postinst
chmod 0755 DEBIAN/postrm
cp ../../../linux/assets/top.jtmonster.jhentai.desktop usr/share/applications
cp ../../../assets/icon/JHenTai_512.png usr/share/icons/hicolor/512x512/apps/top.jtmonster.jhentai.png
sed -i "/^Version: /s/Version: .*/Version: ${{ steps.get_version.outputs.version }}/" DEBIAN/control
if [ "${{ steps.get_version.outputs.arch }}" = "arm64" ]; then
sed -i "/^Architecture: /s/Architecture: .*/Architecture: arm64/" DEBIAN/control
fi
cd ..
dpkg-deb --build --root-owner-group JHenTai-${{ steps.get_version.outputs.version }}-Linux-${{ steps.get_version.outputs.arch }}
# Build Linux .AppImage
- name: Build Linux AppImage
if: matrix.target == 'Linux-x64-AppImage'
run: |
# Prepare build depends
sudo apt-get update -y
sudo apt-get install -y ninja-build libfuse2 webkit2gtk-4.1
# Compile
flutter build linux --release -t lib/src/main.dart
cd build/linux
mkdir AppDir
cp -r x64/release/bundle/* AppDir
mkdir -p AppDir/usr/share/icons/hicolor/512x512/apps/
mkdir -p AppDir/usr/share/applications
cp ../../linux/assets/top.jtmonster.jhentai.desktop AppDir/usr/share/applications
cp ../../assets/icon/JHenTai_512.png AppDir/usr/share/icons/hicolor/512x512/apps/top.jtmonster.jhentai.png
wget -O appimage-builder https://github.com/AppImageCrafters/appimage-builder/releases/download/v1.1.0/appimage-builder-1.1.0-x86_64.AppImage
chmod +x appimage-builder
./appimage-builder --skip-tests --recipe ../../linux/assets/AppImageBuilder.yml
mv JHenTai-latest-x86_64.AppImage JHenTai-${{ steps.get_version.outputs.version }}-Linux-x64.AppImage
# Upload Artifacts
- name: Upload Artifacts
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.artifact_name }}
path: ${{ matrix.artifact_path }}
if-no-files-found: error
Publish:
if: startsWith(github.ref, 'refs/tags/')
name: Publish
needs: Build
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Make tmp dir
run: mkdir /tmp/artifacts
- name: Download all Artifacts
uses: actions/download-artifact@v4
with:
path: /tmp/artifacts
- name: List all Artifacts
run: ls -R /tmp/artifacts
# Upload release assets
- name: Upload to release
uses: ncipollo/release-action@v1
with:
tag: ${{ github.ref_name }}
allowUpdates: true
bodyFile: changelog/${{ github.ref_name }}.md
artifacts: /tmp/artifacts/release-Android/*.apk,/tmp/artifacts/release-iOS/*.ipa,/tmp/artifacts/release-macOS/*.dmg,/tmp/artifacts/release-Windows/*.zip,/tmp/artifacts/release-Linux-x64-deb/*.deb,/tmp/artifacts/release-Linux-arm64-deb/*.deb
artifactErrorsFailBuild: true
replacesArtifacts: true
# Get IPA file size
- name: Get IPA file size
id: get_ipa_size
run: |
IPA_SIZE=$(stat -c %s /tmp/artifacts/release-iOS/*.ipa)
echo "ipa_size=$IPA_SIZE" >> $GITHUB_OUTPUT
# Get changelog content
- name: Get changelog content
id: get_changelog
run: |
# Read changelog and preserve newlines for JSON
CHANGELOG=$(cat changelog/${{ github.ref_name }}.md | jq -Rs .)
echo "changelog=$CHANGELOG" >> $GITHUB_OUTPUT
# Extract build version from tag
- name: Get build version
id: get_build_version
run: |
BUILD_VERSION=$(echo "${{ github.ref_name }}" | grep -oE '\+[0-9]+' | tr -d '+')
echo "build_version=$BUILD_VERSION" >> $GITHUB_OUTPUT
# Update AltSource.json
- name: Update AltSource.json
run: |
FULL_VERSION="${{ needs.Build.outputs.version }}"
# Remove build number part (content after +)
VERSION="${FULL_VERSION%%+*}"
DATE=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
# Get changelog as raw string (remove quotes added by jq -Rs)
CHANGELOG=${{ steps.get_changelog.outputs.changelog }}
# Create new version entry
jq --arg version "$VERSION" \
--arg build "${{ steps.get_build_version.outputs.build_version }}" \
--arg date "$DATE" \
--arg desc "$CHANGELOG" \
--arg url "https://github.com/${{ github.repository }}/releases/download/${{ github.ref_name }}/JHenTai_${FULL_VERSION}.ipa" \
--arg size "${{ steps.get_ipa_size.outputs.ipa_size }}" \
'.apps[0].versions[0] = {
"version": $version,
"buildVersion": $build,
"date": $date,
"localizedDescription": $desc,
"downloadURL": $url,
"size": ($size | tonumber)
}' altsource/AltSource.json > altsource/AltSource.json.tmp
mv altsource/AltSource.json.tmp altsource/AltSource.json
# Commit and push updated AltSource.json
- name: Commit changes
run: |
git config --local user.email "action@github.com"
git config --local user.name "GitHub Action"
git add altsource/AltSource.json
git commit -m "Update AltSource.json for version ${{ needs.Build.outputs.version }}"
git push origin HEAD:master