Skip to content

Commit dd141d8

Browse files
authored
Merge pull request #17 from KidsPOSProject/feature/raspberry-pi-deployment
feat: Raspberry Piデプロイ対応とリリースビルドワークフロー追加
2 parents 019c516 + 5358ef9 commit dd141d8

7 files changed

Lines changed: 823 additions & 0 deletions

File tree

Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
name: Release Build
2+
3+
# バイナリファイル(JAR)を生成してアーティファクトとして提供
4+
5+
on:
6+
# 手動実行を許可
7+
workflow_dispatch:
8+
9+
# リリースタグ(v*)がプッシュされた時に実行
10+
push:
11+
tags:
12+
- 'v*'
13+
14+
# mainブランチへのプルリクエスト時にビルドテスト
15+
pull_request:
16+
branches: [ main, master ]
17+
18+
jobs:
19+
build-release:
20+
name: Build Release Binary
21+
runs-on: ubuntu-latest
22+
23+
steps:
24+
- name: Checkout repository
25+
uses: actions/checkout@v4
26+
27+
- name: Set up JDK 21
28+
uses: actions/setup-java@v4
29+
with:
30+
java-version: '21'
31+
distribution: 'temurin'
32+
cache: gradle
33+
34+
- name: Grant execute permission for gradlew
35+
run: chmod +x gradlew
36+
37+
- name: Build with Gradle
38+
run: ./gradlew clean bootJar -x test -x detekt
39+
40+
- name: Get version from build.gradle
41+
id: get_version
42+
run: |
43+
VERSION=$(./gradlew properties -q | grep "^version:" | awk '{print $2}')
44+
echo "VERSION=$VERSION" >> $GITHUB_OUTPUT
45+
echo "Building version: $VERSION"
46+
47+
- name: Rename JAR file
48+
run: |
49+
cd build/libs
50+
# bootJarで生成されたJARファイルを見つける(server-*.jar)
51+
JAR_FILE=$(ls server-*.jar 2>/dev/null | grep -v plain | head -1)
52+
if [ -n "$JAR_FILE" ]; then
53+
mv "$JAR_FILE" kidspos-${{ steps.get_version.outputs.VERSION }}.jar
54+
echo "Renamed to: kidspos-${{ steps.get_version.outputs.VERSION }}.jar"
55+
ls -lh
56+
else
57+
echo "Error: JAR file not found"
58+
ls -la
59+
exit 1
60+
fi
61+
62+
- name: Upload JAR as artifact
63+
uses: actions/upload-artifact@v4
64+
with:
65+
name: kidspos-jar-${{ steps.get_version.outputs.VERSION }}
66+
path: build/libs/kidspos-${{ steps.get_version.outputs.VERSION }}.jar
67+
retention-days: 90
68+
69+
- name: Create Release Info
70+
run: |
71+
echo "# Release Build Information" > release-info.txt
72+
echo "" >> release-info.txt
73+
echo "Version: ${{ steps.get_version.outputs.VERSION }}" >> release-info.txt
74+
echo "Build Date: $(date -u +'%Y-%m-%d %H:%M:%S UTC')" >> release-info.txt
75+
echo "Commit: ${{ github.sha }}" >> release-info.txt
76+
echo "Branch: ${{ github.ref_name }}" >> release-info.txt
77+
echo "" >> release-info.txt
78+
echo "## Deploy to Raspberry Pi" >> release-info.txt
79+
echo "" >> release-info.txt
80+
echo "1. Download the JAR file from GitHub Actions Artifacts" >> release-info.txt
81+
echo "2. Transfer to Raspberry Pi:" >> release-info.txt
82+
echo " scp kidspos-*.jar pi@[raspberry-pi-ip]:~/kidspos/" >> release-info.txt
83+
echo "3. Run on Raspberry Pi:" >> release-info.txt
84+
echo " java -Xmx512m -jar ~/kidspos/kidspos-*.jar" >> release-info.txt
85+
cat release-info.txt
86+
87+
- name: Upload Release Info
88+
uses: actions/upload-artifact@v4
89+
with:
90+
name: release-info
91+
path: release-info.txt
92+
retention-days: 90
93+
94+
# タグプッシュ時にGitHub Releaseを作成
95+
create-release:
96+
name: Create GitHub Release
97+
runs-on: ubuntu-latest
98+
needs: build-release
99+
if: startsWith(github.ref, 'refs/tags/v')
100+
101+
permissions:
102+
contents: write
103+
104+
steps:
105+
- name: Checkout repository
106+
uses: actions/checkout@v4
107+
108+
- name: Get version from tag
109+
id: get_tag_version
110+
run: |
111+
TAG_VERSION=${GITHUB_REF#refs/tags/}
112+
echo "TAG_VERSION=$TAG_VERSION" >> $GITHUB_OUTPUT
113+
echo "Tag version: $TAG_VERSION"
114+
115+
- name: Download JAR artifact
116+
uses: actions/download-artifact@v4
117+
with:
118+
pattern: kidspos-jar-*
119+
merge-multiple: true
120+
path: ./artifacts
121+
122+
- name: Download Release Info
123+
uses: actions/download-artifact@v4
124+
with:
125+
name: release-info
126+
path: ./artifacts
127+
128+
- name: Create GitHub Release
129+
uses: softprops/action-gh-release@v1
130+
with:
131+
files: |
132+
./artifacts/*.jar
133+
./artifacts/release-info.txt
134+
body: |
135+
## KidsPOS Release ${{ steps.get_tag_version.outputs.TAG_VERSION }}
136+
137+
### ダウンロード
138+
139+
下記のAssetsセクションから `kidspos-*.jar` ファイルをダウンロードしてください。
140+
141+
### Raspberry Piへのデプロイ
142+
143+
詳細なデプロイ手順は[README.md](https://github.com/KidsPOSProject/KidsPOS-Server#raspberry-pi%E3%81%B8%E3%81%AE%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4)をご覧ください。
144+
145+
```bash
146+
# Raspberry Piでの起動
147+
java -Xmx512m -jar kidspos-*.jar
148+
```
149+
150+
### システム要件
151+
152+
- Java 21以上
153+
- メモリ: 最小512MB(推奨1GB)
154+
- 対応: Raspberry Pi 3/4/5, Zero W/2W
155+
156+
詳細は `release-info.txt` を参照してください。
157+
draft: false
158+
prerelease: false
159+
env:
160+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

README.md

Lines changed: 190 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,196 @@ java -jar app.jar
9595

9696
SQLiteデータベース(`kidspos.db`)は初回起動時に自動生成されます。追加の設定は不要です。
9797

98+
## Raspberry Piへのデプロイ
99+
100+
KidsPOSはRaspberry Piで動作するため、学校や教育機関で低コストで展開できます。
101+
102+
### 対応ハードウェア
103+
104+
- Raspberry Pi 5
105+
- Raspberry Pi 4 Model B
106+
- Raspberry Pi 3 Model B/B+
107+
- Raspberry Pi Zero W/2W
108+
109+
### システム要件
110+
111+
- Raspberry Pi OS (Bullseye以降推奨)
112+
- Java 21以上
113+
- 最小メモリ: 512MB(推奨: 1GB以上)
114+
- ストレージ: 最小200MB
115+
116+
### Java 21のインストール
117+
118+
Raspberry PiにJava 21をインストールします:
119+
120+
```bash
121+
# システムパッケージの更新
122+
sudo apt update && sudo apt upgrade -y
123+
124+
# OpenJDK 21のインストール
125+
sudo apt install openjdk-21-jdk -y
126+
127+
# インストール確認
128+
java -version
129+
```
130+
131+
### デプロイ方法
132+
133+
#### 方法1: ビルド済みバイナリの使用(推奨)
134+
135+
GitHubのActionsページからビルド済みJARファイルをダウンロード:
136+
137+
```bash
138+
# 作業ディレクトリの作成
139+
mkdir -p ~/kidspos
140+
cd ~/kidspos
141+
142+
# GitHubからビルド済みJARファイルをダウンロード
143+
# (GitHub Actionsの最新成功ビルドからArtifactsをダウンロード)
144+
# ダウンロードしたファイルを展開
145+
unzip kidspos-*.zip
146+
147+
# JARファイルの実行権限を設定
148+
chmod +x kidspos-*.jar
149+
```
150+
151+
#### 方法2: ソースからビルド
152+
153+
```bash
154+
# リポジトリのクローン
155+
git clone https://github.com/KidsPOSProject/KidsPOS-Server.git
156+
cd KidsPOS-Server
157+
158+
# ビルド
159+
./gradlew bootJar
160+
161+
# JARファイルを作業ディレクトリにコピー
162+
mkdir -p ~/kidspos
163+
cp build/libs/kidspos-*.jar ~/kidspos/app.jar
164+
cd ~/kidspos
165+
```
166+
167+
### アプリケーションの起動
168+
169+
```bash
170+
# 手動起動
171+
java -jar kidspos-*.jar
172+
173+
# メモリオプション付きで起動(512MBヒープ)
174+
java -Xmx512m -jar kidspos-*.jar
175+
176+
# バックグラウンドで起動
177+
nohup java -jar kidspos-*.jar > kidspos.log 2>&1 &
178+
```
179+
180+
ブラウザで `http://[Raspberry PiのIPアドレス]:8080` にアクセスしてください。
181+
182+
### 自動起動設定(Systemdサービス)
183+
184+
システム起動時に自動的にKidsPOSを起動するようにSystemdサービスを設定します:
185+
186+
```bash
187+
# サービスファイルの作成
188+
sudo nano /etc/systemd/system/kidspos.service
189+
```
190+
191+
以下の内容を入力:
192+
193+
```ini
194+
[Unit]
195+
Description=KidsPOS Server
196+
After=network.target
197+
198+
[Service]
199+
Type=simple
200+
User=pi
201+
WorkingDirectory=$HOME$/kidspos
202+
ExecStart=/usr/bin/java -Xmx512m -jar $HOME$/kidspos/app.jar
203+
Restart=on-failure
204+
RestartSec=10
205+
StandardOutput=append:$HOME$/kidspos/kidspos.log
206+
StandardError=append:$HOME$/kidspos/kidspos-error.log
207+
208+
[Install]
209+
WantedBy=multi-user.target
210+
```
211+
212+
サービスを有効化して起動:
213+
214+
```bash
215+
# サービスのリロード
216+
sudo systemctl daemon-reload
217+
218+
# サービスの有効化(自動起動)
219+
sudo systemctl enable kidspos
220+
221+
# サービスの起動
222+
sudo systemctl start kidspos
223+
224+
# ステータス確認
225+
sudo systemctl status kidspos
226+
```
227+
228+
### サービス管理コマンド
229+
230+
```bash
231+
# サービスの停止
232+
sudo systemctl stop kidspos
233+
234+
# サービスの再起動
235+
sudo systemctl restart kidspos
236+
237+
# ログの確認
238+
journalctl -u kidspos -f
239+
240+
# アプリケーションログの確認
241+
tail -f ~/kidspos/kidspos.log
242+
```
243+
244+
### トラブルシューティング
245+
246+
#### ポート8080が既に使用されている場合
247+
248+
別のポートを使用する:
249+
250+
```bash
251+
java -Dserver.port=8081 -jar kidspos-*.jar
252+
```
253+
254+
#### メモリ不足エラーの場合
255+
256+
ヒープサイズを調整:
257+
258+
```bash
259+
# 最小メモリ: 256MB、最大メモリ: 512MB
260+
java -Xms256m -Xmx512m -jar kidspos-*.jar
261+
```
262+
263+
#### IPアドレスの確認
264+
265+
```bash
266+
hostname -I
267+
```
268+
269+
#### ファイアウォール設定
270+
271+
```bash
272+
# ポート8080を開放(UFWを使用している場合)
273+
sudo ufw allow 8080/tcp
274+
```
275+
276+
### パフォーマンスチューニング
277+
278+
Raspberry Piでの最適なパフォーマンスのための推奨設定:
279+
280+
```bash
281+
# 推奨起動コマンド
282+
java -Xms256m -Xmx512m \
283+
-XX:+UseG1GC \
284+
-XX:MaxGCPauseMillis=200 \
285+
-jar kidspos-*.jar
286+
```
287+
98288
## 使用方法
99289

100290
### アクセス

0 commit comments

Comments
 (0)