반응형

NginX 를  현재 서버에 설치해서 사용하는 경우, 서버의 이곳 저곳에 nginx 관련 정보들이 흩어져 있게 됩니다.

Docker로 설정할때 어려운 부분들이죠.

이를 한번 정리해보고자합니다.

 

 

0. 우선 nginx container를 하나 생성

docker run -d --name tmp-nginx nginx

 

 

docker cp 명령어를 사용하여 container의 /etc/nginx/nginx.conf 파일을 현재 프로젝트 폴더의 ./nginx/nginx.conf 로 옮긴다.

 

1. nginx.conf 

docker cp tmp-nginx:/etc/nginx/nginx.conf ./nginx/nginx.conf

 

 

2. config.d

docker cp tmp-nginx:/etc/nginx/conf.d ./nginx

 

 

docker-compose 파일 작성하기

services:
  api_gateway:
    image: nginx
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/conf.d/:/etc/nginx/conf.d
    ports:
      - 8080:80
  mywebserver:
    build: ./mywebserver
  myapiserver:
    build: ./myapiserver

 

 

 

 

 

Tip

1. Docker-Compose 는 어디에 있나?

docker desktop을 설치하고 나서 docker-compose 를 찾으려고 하면 안찾아져요.

이유는 path가 안걸려 있어서 그래요.

mac에서 보면 docker와 compose 의 위치가 상이합니다. (왜 이렇게 해놨는지는... 저도잘..)

docker: /Applications/Docker.app/Contents/Resources/bin/docker

docker-compose: /Applications/Docker.app/Contents/Resources/cli-plugins/docker-compose

 

아무튼 그래서 docker-compose를 terminal에서 실행하려면, PATH에 추가해주는 것이 좋겠죠.

export PATH="~~~~:/Applications/Docker.app/Contents/Resources/bin:/Applications/Docker.app/Contents/Resources/cli-plugins:$PATH"

 

windows나 linux는 또다른 위치 입니다.

[Ubuntu]

docker-compose: usr/lib/docker/cli-plugins/docker-compose

docker: /usr/bin/docker /usr/lib/docker /etc/docker /usr/local/bin/docker /usr/libexec/docker

 

2. Dockerfile 에서 npm build 시 error 발생하면 바로 볼수 있는 방법

 

RUN npm run build || cat npm-debug.log

 

'Node.js , React, Docker' 카테고리의 다른 글

[React] Components  (0) 2024.09.07
[AWS] 여러가지 알아야 할것들  (3) 2024.07.12
Docker 간단히 이해하기  (0) 2024.07.11
[Docker] proxy 문제 해결  (0) 2021.11.11
REST API  (0) 2017.06.20
반응형

 

Edge Function 은 Supabase 기반의 serverless api  솔루션입니다.

AWS Lambda 나 Google Cloud Function 과 같은 서비스라고 보시면 됩니다.

 

 

1. 사용 환경 만들기

EdgeFunction 을 어떻게 개발하지? 코드를 작성해서 클라우드에 올리나? 그럼 코드는 어떻게 확인하지.. 와 같은 의문이 들건데요.

간단히 결론부터 말하면 supabase 에서 cli(command line interface) 기반으로 Edge Function 을 개발할 수 있는 환경을 제공합니다.

이를 이용해서 로컬에서 개발하고 테스트 해볼 수 있습니다.

 

EdgeFunction을 작성하기 위해서는 PC에 개발 환경을 먼저 구축 해야 겠죠?

아래 가이드를 살펴보면서 작성하시면 좋겠습니다.

 

https://supabase.com/docs/guides/local-development?queryGroups=package-manager&package-manager=npm

 

Local Development & CLI | Supabase Docs

Learn how to develop locally and use the Supabase CLI

supabase.com

 

CLI install 하고 실행하기

1. install
npm install supabase --save-dev
2. init
npx supabase init
3. start
npx supabase start

//brew 에서는 
1. install
brew install supabase/tap/supabase
2. init
supabase init
3. start
supabase start

 

[결과 화면]
         API URL: http://127.0.0.1:54321
     GraphQL URL: http://127.0.0.1:54321/graphql/v1
  S3 Storage URL: http://127.0.0.1:54321/storage/v1/s3
          DB URL: postgresql://postgres:postgres@127.0.0.1:54322/postgres
      Studio URL: http://127.0.0.1:54323
    Inbucket URL: http://127.0.0.1:54324
      JWT secret: super-secret-jwt-token-with-at-least-32-characters-long
        anon key: ----dfasdfasdf----------
service_role key: -----asdfasdxx---------
   S3 Access Key: ----asdf90as8d0f98asdf--------
   S3 Secret Key: -----234hjk35h2k34j5h--------
       S3 Region: local

 

 

 

 

 

 

2. CLI와 project 연결하기

npx supabase link --project-ref [project name]

 

1. npx supabase login

 첫 로그인을 시도하려고 하면 아래와 같은 에러가 발생합니다.

~/supabase$ npx supabse login
npm ERR! code E404
npm ERR! 404 Not Found - GET https://registry.npmjs.org/supabse - Not found
npm ERR! 404 
npm ERR! 404  'supabse@*' is not in this registry.
npm ERR! 404 
npm ERR! 404 Note that you can also install from a
npm ERR! 404 tarball, folder, http url, or git url.

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/netplant/.npm/_logs/2024-12-16T07_31_12_169Z-debug-0.log
netplant@netplant01:~/supabase$ npx supabase login
Hello from Supabase! Press Enter to open browser and login automatically.

 

엔터를 치면, 

브라우저가 뜨고  supabse 에 로그인 화면이 나타납니다.

로그인을 합니다.

 

2. 로그인 하고나면, 

 

supabase verify 코드가 보이게 됩니다.

 

3.이 코드를 가지고 terminal에 입력합니다.

- Enter your verification code: f16d4f38 

 

 

3.. 함수 개발해보기

함수를 하나 만들어보자.

 

Edge function을 개발하기 위해서는 Cli를 이용해서 Edge Function을 만들어 줍니다.

supabase functions new my-function --no-verify-jwt
또는
npx supabase functions new my-function --no-verify-jwt

테스트를 위한 것이니 --no-verify-jwt 를 옵션으로 입력했습니다.

그러면 간단한 샘플코드와 함께 함수 폴더가 만들어 집니다.

supabase 밑에 functions 라는 폴더가 생기고, 그 아래 my-function이라는 폴더가 만들어 지죠.

 

폴더 위치 : supabase/functions/my-function

생성된 예제 코드

import "jsr:@supabase/functions-js/edge-runtime.d.ts"

console.log("Hello from Functions!")

Deno.serve(async (req) => {
  const { name } = await req.json()
  const data = {
    message: `Hello ${name}!`,
  }

  return new Response(
    JSON.stringify(data),
    { headers: { "Content-Type": "application/json" } },
  )
})



/* To invoke locally:

  1. Run `supabase start` (see: https://supabase.com/docs/reference/cli/supabase-start)
  2. Make an HTTP request:

  curl -i --location --request POST 'http://127.0.0.1:54321/functions/v1/my-function' \
    --header 'Authorization: Bearer -sdjfklsdfjskldf-sdlfkasm23324l234dsdfk' \
    --header 'Content-Type: application/json' \
    --data '{"name":"Functions"}'

*/

 

함수에 대한 설정은 config.toml 파일에서 설정 할 수도 있습니다.

 

 

이렇게 코드가 만들어지고 나면 그다음은 함수를 테스트 해봐야 하는데요.

테스트를 위해서 함수를 제공하는 서비스를 실행합니다.

 

supabase functions serve my-function --no-verify-jwt

또는 

npx supabase functions serve my-function --no-verify-jwt

 

그리고 나서 함수를 테스트 하기 위해서 샘플 코드에 주석으로 적혀있는 curl 명령을 실행해봅니다.

  curl -i --location --request POST 'http://127.0.0.1:54321/functions/v1/my-function' \
    --header 'Authorization: Bearer -sdjfklsdfjskldf-sdlfkasm23324l234dsdfk' \
    --header 'Content-Type: application/json' \
    --data '{"name":"Functions"}'

 

이렇게 해서 결과가 나오면 api 를 개발할 수 있는 환경이 완성 된것입니다.

 

5. Edge Function 을 서버에 올리기

함수 개발을 끝내고 나면, 서버에 올리는 일이 남았습니다.

//전체 함수를 서버에 올리기
supabase functions deploy

// 한 함수만 올리기
supabase functions deploy my-function

//JWT 토큰 없이 동작할수 있도록 올리기
supabase functions deploy hello-world --no-verify-jwt

 

이렇게 하면 새로 만든 함수가 supabase 에 등록이 됩니다.

 

 

이제 부터는 실제로 개발할때 유용한 몇가지 팁들을 같이 적어볼까 합니다.

 

5. 팁

 

1. 환경 변수 또는 시크릿(Secret) 다루기 

[환경 변수 파일 .env]

일명 .env 또는 dotenv 라고 부르는 환경 변수 설정을 하는 방법입니다.

api key 또는 token 등 서비스를 구동할때 필요한 인증 키나 값들은 보통 소스코드에서 분리해서 사용하죠.

이럴때 일반적으로 .env를 활용하게 됩니다.

//env 사용하기
Deno.env.get('MY_SECRET_NAME')

그럼 어떻게 확인해 볼 수 있느냐?

supabase functions 서비스를 실행할때 env 파일을 설정해서 테스트 해볼 수 있습니다.

supabase functions serve --env-file ./supabase/.env

 

[시크릿 키 Secret]

Supabase 서버에서는 .env 파일을 그대로 사용할수 없고 ,supabase 에는 secret key를 관리하는 page에서 관리되는 키를 사용해야 합니다.

supabase site -> Project Settings -> Edge Functions -> Edge Function Secrets Management

가 바로 키를 관리하는 곳입니다.

 

CLI에 .env에 등록된 키들을 올리는 기능이 있으니 이를 활용하면 쉽게 올리고 테스트 가능하겠죠.

#.env에 있는 모든 키를 올릴때
supabase secrets set --env-file ./supabase/.env

#특정 키만 올일때
supabase secrets set MY_NAME=Chewbacca

 

 

2. 서버의 db를 로컬에 구축 하기(옵션 - 건너 뛰어도 됨.)

되도록이면 로컬의 환경이 서버의 환경과 동일(또는 유사)한것이 개발 및 테스트시 예외상황을 줄일 수 있습니다.

그래서 서버의 내용을 로컬에 구축하는 작업을 진행해보겠습니다.

1. 서버의 데이터를 모두 로컬에 복사해오면 좋겠지만  오버해드(서버의 데이터 내용이 많으면 많을 수록 문제가 되겠죠)가 큽니다.

그래서 서버의 구조, 즉 db schema 를 로컬에 동일하게 구축하는 것입니다.

2. 로컬에는 기본적인 테스트 가능한 데이터만 입력합니다.

서버의 일부 데이터만 입력하는 방법입니다.

 

 

 

#해피코딩

'Supabase' 카테고리의 다른 글

[Flutter] supabase database 의 json 내부 query하기  (0) 2024.09.19
반응형

 

 

 

JFT-300M

https://paperswithcode.com/dataset/jft-300m

 

Papers with Code - JFT-300M Dataset

JFT-300M is an internal Google dataset used for training image classification models. Images are labeled using an algorithm that uses complex mixture of raw web signals, connections between web-pages and user feedback. This results in over one billion labe

paperswithcode.com

 

 

 

반응형

 

#Firebase 를 대처할만한 편리하고 저렴하게 사용할 수 있는 backend solution인 supabase 소개는 따로.!

 

Supabase에서 Database를 생성하고 나서, database 를 사용하는 방법은 다음과 같습니다.

 

supabase guide 를 보면 쉽게 따라하실수 있습니다.

https://supabase.com/docs/reference/dart/upgrade-guide?queryGroups=version&version=2.0x

 

Flutter: Upgrade guide | Supabase Docs

Initialization does not await for session refresh In v1, Supabase.initialize() would await for the session to be refreshed before returning. This caused delays in the app's launch time, especially when the app is opened in a poor network environment. In v2

supabase.com

 

 

 

지금 하고 싶은 이야기는 이미 supabase를 사용하고 계시는 분들에게 유용한 기능인데요.

 

# database 컬럼으로 json 활용

database를 만들어 사용하다 보면, 데이터중에  json 으로 데이터를 넣어야 하는 경우가 있습니다.

 

 

그런데, json 으로 데이터 컬럼을 추가 할경우, 쿼리 할때 데이터를 가져온다음에 name 이나 type을 비교해야 하는 상당히 불편한 부분이 생깁니다.

다행히도 supabase의 eq() 함수는 json data 내부의 필드값을 접근 할 수 있는 기능을 제공합니다.

https://supabase.com/docs/reference/dart/using-filters

final data = await supabase
  .from('test')
  .select()
  .eq('data->type', 'hello');

 

 

 

# eq 의 -> 가 에러가 발생

그런데 안타깝게도 아래와 같은 에러가 발생 할 수 있습니다.

 

PostgrestException(message: invalid input syntax for type json, code: 22P02, details: The input string ended unexpectedly., hint: null)

 

 

아 !,  -> 기능으로 json 내부 접근해서 쿼리 할수 있을 줄 알았는데 동작을 안하네??? 이러고 좌절 하실수 있는데요.

걱정하지 마세요 !

 

제가 찾아본 자료에서는 json 내부에 접근하는 접근자  몇가지 있는데요.

가이드에 나와있는 접근자로는 오류가 발생하고 다른 접근자를 사용하면 됩니다.

가이드에 적힌 '->' 느ㄴ son형태의 값을 넘기는 것이고, '->>'를 사용하면 text 값을 정상적으로 처리할 수 있습니다.

 

final data = await supabase
  .from('test')
  .select()
  .eq('data->>type', 'hello');

 

이렇게 사용하면 정상적으로 eq 가 동작합니다.

 

 

#json, jsonb 의 차이 및 접근자에 대해서 더 알고 싶다면

 

OperatorRight Operand TypeDescriptionExampleExample Result

-> int Get JSON array element (indexed from zero, negative integers count from the end) '[{"a":"foo"},{"b":"bar"},{"c":"baz"}]'::json->2 {"c":"baz"}
-> text Get JSON object field by key '{"a": {"b":"foo"}}'::json->'a' {"b":"foo"}
->> int Get JSON array element as text '[1,2,3]'::json->>2 3
->> text Get JSON object field as text '{"a":1,"b":2}'::json->>'b' 2
#> text[] Get JSON object at specified path '{"a": {"b":{"c": "foo"}}}'::json#>'{a,b}' {"c": "foo"}
#>> text[] Get JSON object at specified path as text '{"a":[1,2,3],"b":[4,5,6]}'::json#>>'{a,2}' 3

https://www.postgresql.org/docs/9.5/functions-json.html

 

 

[참고]

https://yeongunheo.tistory.com/entry/PostgreSQL-json-jsonb-%ED%83%80%EC%9E%85%EA%B3%BC-%EC%97%B0%EC%82%B0%EC%9E%90

 

[PostgreSQL] json, jsonb 타입과 연산자

데이터베이스 테이블 내 하나의 컬럼에 JSON 데이터를 저장하는 경우가 있습니다. 보통 외부에서 제공된 데이터를 별도의 처리 없이 그대로 저장할 때 JSON 타입으로 저장하게 됩니다. PostgreSQL은 J

yeongunheo.tistory.com

 

 

#해피코딩

'Supabase' 카테고리의 다른 글

[Supabase] Edge function 만들기  (0) 2024.12.11
반응형

 

JSON은 상당히 편리하면서 직관적인 데이터 형식이죠.

그래서 사람들이 많이 사용합니다.

 

코딩을 하다보면, json을 그대로 사용하기 보다는 보통 필요한 데이터 형을 class로 만들고 이를 json으로 encoding/decoding 하는 방식으로 많이 사용합니다.

 

그런데  매번 class 만들고 fromJson(), toJson()을 만들어서 사용하는것이 상당히 번거롭고, 실수할 때가 많습니다.

 

그래서 fromJson, toJson을 구현해주는 모듈들이 있죠.

대표적으로 json_serializable 이 있죠.

이를 활용하면 쉽게 json 변환이 가능한 data class를 정의 할 수 있습니다.

 

저는 요즘 freezed 라는 모듈을 주로 사용합니다.

 

freezed 2.5.7

https://pub.dev/packages/freezed

 

freezed | Dart package

Code generation for immutable classes that has a simple syntax/API without compromising on the features.

pub.dev

 

이 freezed 는 json_serialiazble 을 이용하여 data class를 구현해주는 모듈인데요. 제가 이를 사용하게 된 계기는 deep copy 때문이었습니다.

 

freezed는 fromJson, toJson 뿐만 아니라 copyWith() 함수를 자동으로 구현 해줍니다. 그리고 copyWith() 를 수행할때 멤버들의  copyWith()를 수행해서 전체가 복사가 됩니다.

이것이 하나의 큰 장점이고,

freezed 로 선언된 data class는 내부 데이터를 변경할 수 없습니다.

변경하려면, copyWith()로 특정 데이터만 변경해서 복사해서 사용해야 합니다.

그렇지 않고 변경가능한 class를 만들고 싶다면, @unfreezed를 이용합니다.

 

 

주의점!

간혹  freezed 로 정의한 class의 멤버중에 freezed로 되어있지 않은 class들을 데이터로 포함할 경우가 있습니다.

그런데 간혹, toJson() 이 정상적으로 동작하지 않을때도 있는데요.

이럴때 toJson()이 불리도록 explicitToJson  설정이 필요할때가 있습니다.

@unfreezed
class MyDataModel with _$MyDataModelModel {
  @JsonSerializable(explicitToJson: true)

  factory MyDataModel({
    required int id,
    required String name,
    DateTime? created_at,
    DateTime? updated_at,
    required Map<String, Health> data,
    bool? is_demo,
  })= _MyDataModel;

예를 들면 위와 같이 클래스를 정의한 경우, Health라는 class에 fromJson, toJson 을 구현 해놨다 하더라도, MyDataModel의 toJson()을 호출할때 Health의 toJson()이 호출되지 않습니다.

이유는 자동으로 생성된 코드에 Health의 toJson()을 호출하는 코드가 생성되지 않기 때문인데요.

이런 경우, toJson()이 불리도록,   @JsonSerializable(explicitToJson: true) 을 class 밑에 선언해 줍니다.

 

#해피코딩

반응형

 

Nivo 

https://nivo.rocks/components/

 

Components | nivo

 

nivo.rocks

 

 

 

 

Google Fonts

https://fonts.google.com/

 

Browse Fonts - Google Fonts

Making the web more beautiful, fast, and open through great typography

fonts.google.com

 

'Node.js , React, Docker' 카테고리의 다른 글

[Docker] NginX docker 환경 만들기  (0) 2024.12.24
[AWS] 여러가지 알아야 할것들  (3) 2024.07.12
Docker 간단히 이해하기  (0) 2024.07.11
[Docker] proxy 문제 해결  (0) 2021.11.11
REST API  (0) 2017.06.20
반응형

 

우리는 종종  SDK 가 업데이트 되고 나서 원인 모를 빌드 에러가 발생하는 것을 경험하게 됩니다.

 

SDK가 매번 업데이트 되고, 자동으로 패키지들을 설치해줘서 개발 환경들은 점점 좋아지고 있습니다.

그러나 종종 프로젝트를 만든 시점이 오래되어 최신 SDK에서 프로젝트가 만들어졌을 시점의 환경을 더이상 지원하지 않거나 변경되는 경우가 있죠.

 

다행스럽게도 구글링을 해보면 비슷한 문제를 겪는 사람들을 볼수 있고 그들이 포스팅 해놓은 해결책으로 많은 부분을 해결할 수 있습니다.

 

하지만 종종 전혀 해결이 안되는 문제들이 발생할 경우들이 있죠.

이럴때는 정말  project를 완전히 지우고 새 프로잭트를 만들고 소스코드를 카피해서 사용하고 싶은 생각이 들때도 있습니다.

 

 

일단 기초적인 사례부터 정리해보도록 하겠습니다.

 

디버그 모드로 빌드 잘되는데 릴리즈로 이상하게 잘 안된다.

뭔가 app/build.gradle 에서 에러가 발생한다.

 

1. Signing Key

먼저 확인해보실것이 , release 에 사용하는 signing key 입니다.

종종  signing 키가 삭제되거나 signing key  관련 설정이 잘 안되어 있어서 build error 가 이상한 곳에서 발생할때가 있습니다.

 

2. SDK version 확인

compile sdk나 target sdk 설정이 잘못되어있는 경우에 많이 에러가 발생합니다.

또, 현재 개발 환경에 sdk version이 정상적으로 설치 되었는지 확인 하는 것도 필요합니다.

예를 들면 아래와 같이 SDK build tool 35 버전을 잘 설치가 되어있습니다.

 

 

 

그런데. 빌드할때 이상하게 낮은 버전으로 빌드를 하려고 하고 에러가 발생한다면, SDK 설치가 좀 덜되어있을 가능성이 있습니다.

flutter build 시 현재 최신 버전으로 했을때 android sdk version 34를 사용합니다.

그런데 현재 PC에 35, 30.3 만 download 되어있다면, 아마 낮은버전인 30.3으로 빌드를 하게 될것입니다.

현재 빌드환경이 어떤 버전으로 돌아가고 있는지 확인하고 Show Package Details로 해당 버전이 설치되어있는지 확인할 필요가 있습니다.

 

 

 

3. 드물지만, subproject build 할때 sdk 버전이 안먹히는 경우

아래와 같이 afterEvaluate 를 설정해서 트라이 해볼 수 있습니다.

afterEvaluate {
        android {
            compileSdkVersion 34
        }
    }

 

전체 코드

android/build.gradle 파일

allprojects {
    repositories {
        google()
        mavenCentral()
    }
}

rootProject.buildDir = "../build"
subprojects {
    project.buildDir = "${rootProject.buildDir}/${project.name}"
    // Add this
    afterEvaluate {
        android {
            compileSdkVersion 34
        }
    }
    // End
}
subprojects {
    project.evaluationDependsOn(":app")
}

tasks.register("clean", Delete) {
    delete rootProject.buildDir
}

 

 

#해피코딩 !!

반응형


github의 action 을 사용할때 , 환경변수등을 설정할 필요가 있습니다.

이때 활용 할 수 있는 것이 이와 같습니다.

특히 android release 빌드를 할때는 keystore 가 반드시 필요한데, 이 keystore는 외부에 노출하면 안되는 것이라 참 난감합니다.

그런데 이를 지원해줄 수 있는 github의 secret variable 저장 기능이 있습니다.

이를 한번 알아봅시다.!

 

 

유사한 내용이지만 둘다 모두 필요한 내용이 있어서 정리를 위해 링크 남깁니다.

 


https://medium.com/@dcostalloyd90/automating-android-builds-with-github-actions-a-step-by-step-guide-2a02a54f59cd

 

 

Automating Android Builds with GitHub Actions: A Step-by-Step Guide

In this tutorial, we’ll walk you through the process of automating Android builds using GitHub Actions. This will streamline your…

medium.com

 

 

https://www.droidcon.com/2023/09/08/build-sign-and-create-release-build-using-github-actions/

 

 

위 내용들이 mac에서 셋업을 하면서 보니까. 약간 차이점들이 있었습니다. 그리고 오류도 좀 있고요.

저도 순서를 하나씩 짚어보면서 정리해보도록 하겠습니다.

 

1. github 에서 action 과 과련한 secret  파일들을 설정할 수 있는 부분이 있습니다.

github/[내프로젝트]/settings 에서 Secrets and variables 메뉴가 있습니다.

 

 

 

 

Secrets에 secret들을 하나씩 추가해봅시다.

 

 

KEYSTORE_BASE_64

RELEASE_KEYSTORE_ALIAS

RELEASE_KEYSTORE_PASSWORD

RELEASE_KEY_PASSWORD

 

이렇게 4가지를 차례대로 만들 예정입니다.

이미 키가 있다는 전제하에 설명합니다.(키 만드는 것은 여기서 확인!)

 

KEYSTORE_BASE_64 

사용하고 있는 key file이 있으실텐데 해당 key file을 사용하시면 됩니다.

저는 여기서 key.jks 라는 이름의 파일 이라고 가정하고 진행합니다.

base64 인코딩 하기

github의 secret 에는 파일을 추가 할 수 없습니다. 따라서 text를 이용해야 합니다. 때문에 key 파일을 문자열로 변환하기 위해 base64 인코딩합니다.

 

형식 : base64 -i <in-file> -o <outfile>

 

$ base64 -i key.jks -o keystore-b64.txt

 

이렇게 keystore-b64.txt를 열어서 해당 text를 KEYSTORE_BASE_64 에 저장합니다.

 

나머지  RELEASE_KEYSTORE_ALIAS / RELEASE_KEYSTORE_PASSWORD / RELEASE_KEY_PASSWORD

들은 키를 만들때 사용했던 alias, keystore passowrd, key passoword 를 적어주면 됩니다.

 

 

 

2. build.gradle 을 수정합니다.

이제 gradle 파일을 수정하러 가야 합니다.

android/app/build.gradle 

    signingConfigs{
        releaseWithSignedKey {
            
            storeFile file("../keystore.jks")
            storePassword System.getenv("RELEASE_KEYSTORE_PASSWORD")
            keyAlias System.getenv("RELEASE_KEYSTORE_ALIAS")
            keyPassword System.getenv("RELEASE_KEY_PASSWORD")
        }
    }
    
    :
    
    buildTypes {
        release {

            signingConfig = signingConfigs.releaseWithSignedKey
            System.out.println("signingConfig:$signingConfig")
        }
    }

 

signingConfigs 를 추가하고 buildType의 release에서 이 정보를 이용하도록 설정합니다.

 

자! 코드를 보셔서 아시겠지만, 로컬에서 release로 빌드를 하려면 어떻게 해야 할까요?

환경변수에 RELEASE_KEYSTORE_ALIAS,RELEASE_KEYSTORE_PASSWORD,RELEASE_KEY_PASSWORD 를 설정 해야 겠죠.

이건 쉬우니까 구글링 해서 찾어보시면 됩니다.

 

 

3. github action 의 workflow 수정 하기.

github action에서 핵심은 base64로 encoding 된 key를 다시 keystore.jks로 변환하여 사용하는 것과 환경 변수 세팅입니다.

 

    steps:
     - name: Checking out branch
       uses: actions/checkout@v3
     - name: Setup Java
       uses: actions/setup-java@v3
       with:
         distribution: 'zulu' # See 'Supported distributions' for available options
         java-version: '17'
         cache: 'gradle'
     - name: Decode Keystore
       env:
          ENCODED_STRING: ${{ secrets.KEYSTORE_BASE_64 }}
          RELEASE_KEYSTORE_PASSWORD: ${{ secrets.RELEASE_KEYSTORE_PASSWORD }}
          RELEASE_KEYSTORE_ALIAS: ${{ secrets.RELEASE_KEYSTORE_ALIAS }}
          RELEASE_KEY_PASSWORD: ${{ secrets.RELEASE_KEY_PASSWORD }} 

       run: |
          echo $ENCODED_STRING > keystore-b64.txt
          base64 -d -o keystore.jks < keystore-b64.txt
          
     - name: Setup flutter
       uses: subosito/flutter-action@v2
       with:
         flutter-version: '3.24.1'
     - run: flutter pub get

     - run: flutter build apk --debug

 

 

위와 같이 Decode Keystore를  actions/setup-java 다음에 추가해줍니다.

바로 아래 항목입니다.

     - name: Decode Keystore
       env:
          ENCODED_STRING: ${{ secrets.KEYSTORE_BASE_64 }}
          RELEASE_KEYSTORE_PASSWORD: ${{ secrets.RELEASE_KEYSTORE_PASSWORD }}
          RELEASE_KEYSTORE_ALIAS: ${{ secrets.RELEASE_KEYSTORE_ALIAS }}
          RELEASE_KEY_PASSWORD: ${{ secrets.RELEASE_KEY_PASSWORD }} 

       run: |
          echo $ENCODED_STRING > keystore-b64.txt
          base64 -d -o keystore.jks < keystore-b64.txt

 

여기까지 해주면 action 에서 release build 테스트를 위한 환경이 끝났습니다.

 

깃 커밋하시면 자동으로 릴리즈 빌드를 시험해보실 수 있습니다.

 

#해피코딩

+ Recent posts