Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[TEST] 앱 버전 자동 업데이트 Major #105

Merged
merged 8 commits into from
Aug 30, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions .github/PULL_REQUEST_TEMPLATE/RELEASE_PR_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
## RELEASE 모하냥

> 해당하는 업데이트 사항을 선택해주세요:

- [ ] Major
- [ ] Minor
- [ ] Patch

## 설명

이 PR에 포함된 변경 사항을 간략히 설명해주세요.

## 체크리스트

- [ ] 체크 해야 하는 내용
39 changes: 39 additions & 0 deletions .github/actions/get-app-version/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
name: 'Get App Version'
description: 'Get App Version'

outputs:
major:
description: "앱 버전 중 major"
value: ${{ steps.get-app-version.outputs.major }}
minor:
description: "앱 버전 중 minor"
value: ${{ steps.get-app-version.outputs.minor }}
patch:
description: "앱 버전 중 patch"
value: ${{ steps.get-app-version.outputs.patch }}
code:
description: "앱 버전 코드"
value: ${{ steps.get-app-version.outputs.code }}
version_name:
description: "앱 버전 이름"
value: ${{ steps.get-app-version.outputs.version_name }}

runs:
using: "composite"
steps:
- name: Get App Version
id: get-app-version
shell: bash
run: |
major=$(jq .major app-version.json)
minor=$(jq .minor app-version.json)
patch=$(jq .patch app-version.json)
code=$(jq .code app-version.json)

{
echo "major=$major"
echo "minor=$minor"
echo "patch=$patch"
echo "code=$code"
echo "version_name=$major.$minor.$patch"
} >> $GITHUB_OUTPUT
47 changes: 47 additions & 0 deletions .github/actions/update-app-version/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
name: "Update App Version"

inputs:
major:
description: "업데이트 할 앱 major"
required: true
minor:
description: "업데이트 할 앱 버전 minor"
required: true
patch:
description: "업데이트 할 앱 버전 patch"
required: true
code:
description: "업데이트 할 앱 버전 code"
required: true
file:
description: "업데이트 할 파일 경로"
required: true

runs:
using: "composite"
steps:
- name: Update app version
shell: bash
if: success()
run: |
VERSION_FILE="${{ inputs.file }}"
if command -v jq &> /dev/null; then
# jq가 설치되어 있는 경우
jq '.major = $major | .minor = $minor | .patch = $patch | .code = $code' \
--argjson major "${{ inputs.major }}" \
--argjson minor "${{ inputs.minor }}" \
--argjson patch "${{ inputs.patch }}" \
--argjson code "${{ inputs.code }}" \
$VERSION_FILE > tmp.$$.json && mv tmp.$$.json $VERSION_FILE
else
# jq가 설치되어 있지 않은 경우
sed -i "s/\"major\": [0-9]\+/\"major\": ${{ inputs.major }}/" $VERSION_FILE
sed -i "s/\"minor\": [0-9]\+/\"minor\": ${{ inputs.minor }}/" $VERSION_FILE
sed -i "s/\"patch\": [0-9]\+/\"patch\": ${{ inputs.patch }}/" $VERSION_FILE
sed -i "s/\"code\": [0-9]\+/\"code\": ${{ inputs.code }}/" $VERSION_FILE
fi
git config --local user.email "github-actions[bot]@users.noreply.github.com"
git config --local user.name "github-actions[bot]"
git add $VERSION_FILE
git commit -m "Update app version to ${{ inputs.major }}.${{ inputs.minor }}.${{ inputs.patch }} [${{ inputs.code }}]"
git push
94 changes: 94 additions & 0 deletions .github/workflows/deploy-new-version.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
name: Deploy New Version

on:
push:
branches:
- test/app-version

jobs:
versioning:
if: github.ref == 'refs/heads/test/app-version'
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Set up Node.js
uses: actions/setup-node@v3
with:
node-version: '14'

- name: Install jq
run: sudo apt-get install jq -y

- name: Determine Version Release Type
id: version_type
run: |
pr_body=$(echo "${{ github.event.pull_request.body }}" | tr '[:upper:]' '[:lower:]')
if [[ "$pr_body" =~ "major" ]]; then
echo "release_type=major" >> $GITHUB_ENV
elif [[ "$pr_body" =~ "minor" ]]; then
echo "release_type=minor" >> $GITHUB_ENV
else
echo "release_type=patch" >> $GITHUB_ENV
fi

- name: Get App Version
uses: ./.github/actions/get-app-version
id: get-version

- name: Echo Current App Version
run: |
echo "App Version: ${{ steps.get-version.outputs.version_name }}"
echo "Major Version: ${{ steps.get-version.outputs.major }}"
echo "Minor Version: ${{ steps.get-version.outputs.minor }}"
echo "Patch Version: ${{ steps.get-version.outputs.patch }}"
echo "Code: ${{ steps.get-version.outputs.code }}"


- name: Calculate New Version
id: calculate_version
run: |
major=${{ steps.get-version.outputs.major }}
minor=${{ steps.get-version.outputs.minor }}
patch=${{ steps.get-version.outputs.patch }}
code=${{ steps.get-version.outputs.code }}

if [ "$release_type" = "major" ]; then
major=$((major + 1))
minor=0
patch=0
elif [ "$release_type" = "minor" ]; then
minor=$((minor + 1))
patch=0
else
patch=$((patch + 1))
fi

code=$((code + 1))

echo "major=${major}" >> $GITHUB_OUTPUT
echo "minor=${minor}" >> $GITHUB_OUTPUT
echo "patch=${patch}" >> $GITHUB_OUTPUT
echo "code=${code}" >> $GITHUB_OUTPUT
echo "version_name=${major}.${minor}.${patch}" >> $GITHUB_OUTPUT

- name: Update App Version
uses: ./.github/actions/update-app-version
with:
major: ${{ steps.calculate_version.outputs.major }}
minor: ${{ steps.calculate_version.outputs.minor }}
patch: ${{ steps.calculate_version.outputs.patch }}
code: ${{ steps.calculate_version.outputs.code }}
file: "app-version.json"

- name: Get Updated App Version
id: get-updated-version
uses: ./.github/actions/get-app-version

- name: Create Git Tag
run: |
version_name=${{ steps.get-updated-version.outputs.version_name }}
git tag -a "v$version_name" -m "Version $version_name"
git push origin "v$version_name"
6 changes: 6 additions & 0 deletions app-version.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"major": 0,
"minor": 1,
"patch": 3,
"code": 6
}
5 changes: 3 additions & 2 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,16 @@ plugins {
id("mohanyang.android.hilt")
id("mohanyang.android.application.compose")
id("mohanyang.android.application.firebase")
id("mohanyang.appversion")
}

android {
namespace = "com.pomonyang.mohanyang"

defaultConfig {
applicationId = "com.pomonyang.mohanyang"
versionCode = 6
versionName = "0.1.3"
versionCode = appVersion.code
versionName = appVersion.name
}

signingConfigs {
Expand Down
4 changes: 4 additions & 0 deletions build-logic/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -46,5 +46,9 @@ gradlePlugin {
id = "mohanyang.android.hilt"
implementationClass = "AndroidHiltConventionPlugin"
}
register("appVersion") {
id = "mohanyang.appversion"
implementationClass = "com.pomonyang.mohanyang.AppVersionPlugin"
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package com.pomonyang.mohanyang

import groovy.json.JsonSlurper
import java.io.File
import org.gradle.api.Plugin
import org.gradle.api.Project

open class AppVersionExtension(val name: String, val code: Int)

data class AppVersion(
val major: Int,
val minor: Int,
val patch: Int,
val code: Int
) {
fun getName() = "$major.$minor.$patch"
fun getVersionCode() = code
}

class AppVersionPlugin : Plugin<Project> {
override fun apply(project: Project) {
val versionFile = getAppVersionFile(project)
val appVersion = getAppVersion(versionFile)
setupAppVersionExtension(project, appVersion)
}

private fun getAppVersionFile(project: Project): File {
val file = File(project.rootDir, "app-version.json")
if (!file.exists()) {
throw IllegalStateException("app-version.json file not found")
}
return file
}

private fun getAppVersion(versionFile: File): AppVersion {
val appVersionJson = JsonSlurper().parseText(versionFile.readText()) as Map<*, *>
return AppVersion(
(appVersionJson["major"] as Number).toInt(),
(appVersionJson["minor"] as Number).toInt(),
(appVersionJson["patch"] as Number).toInt(),
(appVersionJson["code"] as Number).toInt()
)
}

private fun setupAppVersionExtension(project: Project, appVersion: AppVersion) {
project.extensions.create(
"appVersion",
AppVersionExtension::class.java,
appVersion.getName(),
appVersion.getVersionCode()
)
}
}
Loading