프로그래밍 326

[Bitrise Cli] 리눅스 서버에서 CI/CD pipeline 직접 구축해보기 (1)

CI/CD pipeline 직접 구축해보기 (1편, 현재 포스트) https://jizard.tistory.com/405 CI/CD pipeline 직접 구축해보기 (2편) https://jizard.tistory.com/410 CI/CD가 왜 필요할까? 일하다보면 빌드 시간이 너무 길게 느껴진다. QA할 버전좀 올려주세요~ 개발서버버전 올려주세요~ 그와 동시에 배포도하고... 프로가드를 사용중인 프로젝트에서 내 컴퓨터로 빌드를하면 10분정도가 걸릴때도 있었다. 무엇보다 개발 열심히 하고있는데 흐름이 끊기는게 가장 큰 문제점이다. CI/CD는 마치 UI/UX처럼 뜻은 다르지만 따라다니는 친구들인데, 앱 개발부터 배포까지 자동화하는 방법이다. CI는 지속적 통합(Continuos Integration)로,..

[Linux] 자바 버전 변경하기

JAVA 16버전을 사용하는 서버에서 안드로이드 빌드를 하는걸 구현하는 도중 "jlink executable /usr/lib/jvm/java-16-openjdk-amd64/bin/jlink does not exist."라는 오류가 발생했었는데, java-11-openjdk 아래에만 jlink가 설치되어 있었다. 그래서 16에서 11로 버전을 변경하게되었는데, 방법을 살펴보자. 1-1. 빠르고 쉬운 방법 update-alternatives를 이용하면된다. $ update-alternatives --config java 대체 항목 java에 대해 (/usr/bin/java 제공) 2개 선택이 있습니다. 선택 경로 우선순? 상태 ---------------------------------------------..

Linux 날짜 기준으로 오래된 파일 삭제하기

find # 수정된지 2일 지난 파일 find -mtime +1 # 수정된지 2일 이내의 파일 find -mtime -1 # 수정된지 2일 지난 파일을 삭제 find -mtime +1 -delete # 수정된지 2일 지난 txt 파일을 삭제 find -name '*.txt' -mtime +1 -delete find 명령어를 이용하여 특정한 날짜 기준으로 파일을 삭제할 수 있다. 아래는 find 명령어의 관련 옵션들이다. 옵션명 설명 mtime modification time, 수정시간 (내용) ctime change time, 변경 시간 (속성/권한/크기 변화) atime access time, 접근 시간 (open) name 파일 이름 delete 삭제 crontab에 Task 등록하여 주기적으로 삭제..

국기 이모지 동적으로 생성하기 (ISO 국가코드 사용)

국가 코드(ISO-3166-1 Alpha-2 Code)를 사용하여 국기 이모지 유니코드를 얻어오는 방법이다. 반대로, 국기 이모지를 받아서 국가 코드로 변환할 수도 있다. 반드시 countryCode가 제대로 들어온다는 보장이 있어야하기 때문에 "/^[a-z]{2}$/i" 같은 정규식을 추가해 줄 수도 있다. Javascript const OFFSET = 127397; function getFlag(countryCode) { const codePoints = [...countryCode.toUpperCase()].map(c => c.codePointAt() + OFFSET); return String.fromCodePoint(...codePoints); } Kotlin const val OFFSET = ..

[Android] 진짜 쉬운 Main Thread와 Handler

Main Thread (UI Thread) 안드로이드는 UI를 업데이트하는데는 메인 스레드만 사용하는, 싱글 스레드 모델이 적용된다. 따라서 I/O나 복잡한 연산이 있는 경우 다른 스레드에서 작업하는 것이 권장된다. 멀티 스레드로 UI를 업데이트 할 경우 일반적인 멀티 스레드 문제에도 직면하게 되는데 Deadlock이나 Race condition등이 대표적인 예시이고, 이는 모든상황에도 그렇지만 특히나 UI에서 발생하면 안되는 문제이다. TextView의 글자를 업데이트 하는데, 여러 스레드에서 동시에 텍스트뷰에 접근해 값을 바꾸는 경우, 어느 한 값은 결국 버려질 수 밖에없다. 따라서 다른 스레드에서 UI를 업데이트 하려고 할 경우 Handler를 이용해 다음 작업때 “이렇게 업데이트 해주세요!”라고 ..

[Android] IllegalStateException: Method addObserver must be called on the main thread

문제발생 IllegalStateException: Method addObserver must be called on the main thread ViewModel을 가지고 뭔가 하려했을때 해당 오류가 발생하는 경우가 있다. 이것은 ViewModel을 lazy init해서 사용할 시에 발생하게 되는데, 나의 경우에는 아래와 같은 코드에서 발생했다. private val splashViewModel by viewModels() override fun onStart() { super.onStart() lifecycleScope.launch(Dispatchers.IO) { splashViewModel.doSomething() } } 원인 처음에는 "무슨 소리야 옵저버같은거 안붙였는데"라고 반발이 올라왔지만, 컴..

[MongoDB] 인증 활성화: DB 사용자 추가 방법 (docker compose)

All your data is a backed up. You must pay 0.01 BTC to 48 hours for recover it. 개발중에 절대 데이터가 날라갈리가 없는데, 데이터가 날라가서 보니 mongodb에 READ_ME라는 DB가 떡하니 생겨있었다. 랜섬웨어인데 지금은 개발도중이라 망정이지 실제 프로덕션에서 데이터가 날라간 상황을 생각하다면 아주 아찔하다. 이런 일을 방지하기 위해서 docker compose 사용시 mongodb 유저를 생성하여 컨테이너를 운용하는 방법을 살펴보도록 하겠다. # MongoDB 사용자(User) 만들기 먼저, mongodb /data/db 볼륨이 마운트되어있다고 가정, mongodb가 돌아가고있는 컨테이너속으로 들어간다. docker exec -it s..

Bitrise에서 버전명(혹은 버전코드) 환경변수로 사용하기

Bitrise로 CI/CD를 구축하려하면 심심찮게 환경변수들을 만들고, 저장해야하는데, 사실상 변수만드는 법만 익히면 나머지는 알아서 줄줄 풀린다. Bitrise에서 정말 많은 환경변수들이 미리 정의되어있지만, 버전명이나 버전코드에 대한 환경변수는 설정되어있지 않다. 그래서 간단하게 버전명을 환경변수로 저장하는 방법에 대해서 적어보려한다. task("printVersionName") { println(android.defaultConfig.versionName) } build.gradle/app에 다음과 같이 사용자 정의 task를 추가한다. ./gradlew printVersionName -q 제대로 설정했자면 터미널에서 task를 실행하면 버전명이 그대로 찍힐 것이다. 여기서 -q는 quiet을 뜻하..

Artillery를 이용한 쉬운 부하 테스트(stress test)

Next.js로 앱을 처음 개발하고, 실제 서비스로 출시하기전 부하테스트를 해보려고 Artillery를 찾아보게되었는데, 너무 간단하고 쉬워서 공유를 해보려고 한다. # Install npm을 이용해 컴퓨터에 artillery를 설치해준다. 딴얘기긴한데, 공식 홈페이지 너무 잘만들어 놓은거같다. 디자인이 완전 취향.... npm install -g artillery artillery -v로 잘 깔렸는지 확인하면 된다. 공룡 보고싶으신 분들은 artillery dino라고 치시길 # Quick Start quick은 하나의 HTTP endpoint를 테스트 할때 사용한다. 예로들자면 다음과 같다. count는 50명의 가상유저들, num은 각각의 유저들이 100번의 GET 요청을 보낸다는 옵션이다. atr..