Codepush standalone 서버 구축하기

Sean park·2025년 3월 3일
0

개발일지

목록 보기
3/3
post-thumbnail

개요

Visual Studio App Center is scheduled for retirement on March 31, 2025. After that date, it will not be possible to sign in with your user account nor make API calls. App Center will continue to be supported until March 31, 2025, with critical bug fixes and technical support.

MS에서 지원하는 App center 서비스가가 3월 31까지만 지원하고 서비스를 종료하기로 했습니다. App center와 연관된 서비스인 Codepush 서비스도 같이 종료하게 되었는데요.

MS에서는 Codepush 서비스를 직접 구축할 수 있도록 standalone 버전의 코드를 배포했습니다.

설치

CodePush를 로컬에서 실행할 수 있도록 MS에서 제공하는 CodePush Standalone 레포지토리를 통해 로컬에서 구축할 수 있습니다.

Repo : https://github.com/microsoft/code-push-server

Azurite

CodePush는 내부적으로 Azure Storage를 사용하여 배포 데이터를 관리하고 있습니다.

Azurite는 Azure Storage를 로컬에 구현할 수 있도록 지원하는 에뮬레이터로 CodePush를 실행하기 위해 필수적으로 Azurite 혹은 Azure Storage 서비스 이용이 필요합니다.

Azurite 설치 링크 : https://learn.microsoft.com/ko-kr/azure/storage/common/storage-use-azurite?tabs=npm%2Ctable-storage

Azurite는 로컬 테스트를 위한 에뮬레이터로 local stack과 같이 테스트 용도로 사용하며 실제로 이를 이용해 서비스를 운영하는 사례는 찾지 못했습니다.

저는 여러가지 시도 끝에 azurite 대신 S3를 저장소로 사용하는 오픈소스 프로젝트를 사용하기로 했습니다. 아래 오픈소스 프로젝트를 제 상황에 맞게 수정하여 서버를 실행했고, 실제로 앱에 새로운 업데이트가 잘 적용되는 것 까지 확인했습니다.

Repo : https://github.com/nmengual/code-push-server

Code-Push-Server

Codepush 서버는 위 Azurite 설치 설명글에 있는 S3를 저장소로 사용하는 오픈소스를 이용했으며, api/ 디렉토리에 있는 README를 참고하여 설치 했습니다.

git clone 후 아래 명령어를 통해 code-push-server 실행합니다.

cp .env.example .env #.env에 github, redis등 필요한 정보 기입
npm install
npm run build
npm run start:env

CodePush 서버는 설치 메트릭 정보를 Redis로 관리하고 있습니다. 따라서 CodePush 서버 실행을 위해 Redis를 실행하고, 해당 Redis 서버 정보를 .env에 기입해주시기 바랍니다.

본 글에서는 Redis의 설치 및 실행에 대해서는 다루지 않습니다.

Github 어플리케이션 등록

CodePush 서버는 사용자 인증을 위해 Oauth(Azure, GitHub)를 사용할 수 있습니다. 저는 Azure를 사용하지 않아 GitHub 계정을 이용해 로그인 하기로 했습니다.

CodePush 서버 인증을 위해 github developer에서 OAuth 앱에 Codepush server를 등록합니다. (https://github.com/settings/developers )

Callback url은 <server_url>/auth/callback/github 형태로 작성합니다.

CodePush 서버 cli 접속

CodePush 서버 실행을 완료했다면, 프로젝트에 cli/ 디렉토리에 있는 README를 참고하여 CodePush를 실행할 수 있는 cli 패키지를 설치합니다.

Cli 설치를 완료했다면 아래 명령어를 통해 cli로 조작할 CodePush 서버를 등록합니다.

code-push-standalone register <server_url> #server_url가 공백인 경우 localhost로 적용됨
code-push-standalone login <server_url> #server_url가 공백인 경우 localhost로 적용됨

위 명령어를 실행하여 GitHub 로그인 후 access key를 터미널에 입력하면 서버등록/로그인이 완료됩니다.

명령어 정리

CodePush app 생성

code-push-standalone app add <app_name>

생성된 앱 확인


code-push-standalone deployment ls <app_name> -k(optional, deploy key 확인 옵션)

환경 key 추가

code-push-standalone deployment add intgapp <env_name>(develop, staging등)

이슈 사항

RN 파일 release 후 서버 응답을 안하는 경우

RN 파일을 release하면 CodePush 서버에서 S3에 배포한 파일을 저장하고, Redis에 설치 메트릭(어떤 버전을 누가 얼마나 업데이트 받았는지 등) 정보를 기록합니다.

설치 메트릭 정보를 가져오려면 redis에 tls 기능이 활성화 되어있어야 합니다.
tls 기능을 사용하지 않고 서비스를 이용하고 싶다면, redis-manager.ts 파일에 있는 redis config 변수에 tls 설정을 지워주면 됩니다.

const redisConfig = {
        host: process.env.REDIS_HOST,
        port: process.env.REDIS_PORT,
        auth_pass: process.env.REDIS_KEY,
        tls: { //tls를 비활성화 하려면 해당 프로퍼티를 삭제
          rejectUnauthorized: true,
        },
      };

Redis tls 활성화 하고싶다면, 아래 방법으로 redis 인증 파일을 생성해주면 됩니다.

Redis 인증서를 생성할 폴더에 openssl.cnf라는 파일 명으로 아래 코드를 입력하고 저장합니다. (openssl.cnf를 수정하면 redis 인증키를 다시 생성해야 함)

[ req ]
distinguished_name = req_distinguished_name
x509_extensions = v3_req
prompt = no

[ req_distinguished_name ]
CN = redis

[ v3_req ]
subjectAltName = @alt_names

[ alt_names ]
DNS.1 = redis
DNS.2 = localhost
DNS.3 = host.docker.internal #codepush 서버를 도커에서 사용하는 경우
IP.1 = 127.0.0.1
IP.2 = 172.17.0.1 #codepush 서버를 도커에서 사용하는 경우
IP.3 = 172.20.0.1 #codepush 서버를 도커에서 사용하는 경우

아래 명령어로 redis 인증키를 생성합니다.

openssl genrsa -out redis.key 2048
openssl req -new -key redis.key -out redis.csr -config openssl.cnf
openssl x509 -req -in redis.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out redis.crt -days 365 -sha256 -extfile openssl.cnf -extensions v3_req

아래는 tls를 적용한 Redis docker compose 파일입니다. 필요하신 분들은 상황에 맞게 값을 수정해서 사용하시면 될 것 같습니다.

version: "3.8"
services:
  redis:
    image: redis
    container_name: redis_tls
    environment:
      - REDIS_PASSWORD=<your_password>
    restart: always
    ports:
      - "6379:6379"
    volumes:
      - <your_path>/ca.crt:/etc/ssl/redis/ca.crt
      - <your_path>/redis.crt:/etc/ssl/redis/redis.crt
      - <your_path>/redis.key:/etc/ssl/redis/redis.key
    command: >
      redis-server --tls-port 6379 --port 0
      --tls-cert-file /etc/ssl/redis/redis.crt
      --tls-key-file /etc/ssl/redis/redis.key
      --tls-ca-cert-file /etc/ssl/redis/ca.crt
      --tls-auth-clients no
      --requirepass <your_password>
    deploy:
      resources:
        limits:
          memory: 1G

로컬에서 테스트 하는 경우

로컬에서 codepush 서버를 테스트할 때 SSL 관련 에러가 발생하는 경우 경로에 맞게 아래 환경변수를 적용한 후 서버를 실행하여 해결할 수 있습니다.

Error: self-signed certificate in certificate chain
    at TLSSocket.onConnectSecure (node:_tls_wrap:1659:34)
    at TLSSocket.emit (node:events:514:28)
    at TLSSocket.emit (node:domain:488:12)
    at TLSSocket._finishInit (node:_tls_wrap:1070:8)
    at ssl.onhandshakedone (node:_tls_wrap:856:12) {
  code: 'SELF_SIGNED_CERT_IN_CHAIN'
}
export NODE_EXTRA_CA_CERTS=<your_path>/ca.crt
profile
제 코드가 세상에 보탬이 되면 좋겠습니다.

0개의 댓글

관련 채용 정보