openSTF로 Devicefarm 구축하기

정태경·2022년 2월 27일
1

Device Farm 구축

목록 보기
2/3
post-thumbnail

openSTF 특징

  • 브라우저에서 연결된 모든 디바이스를 원격으로 제어할 수 있다.
  • iOS & Android 모두 지원한다.
  • PC의 키보드 및 마우스를 통해 연결된 디바이스를 제어할 수 있다.
  • PC와 디바이스 간에 복사/붙여넣기가 가능하다
  • 스크린샷을 지원한다.
  • APK 드래그 앤 드롭 설치가 가능하다.
  • 실시간 ADB 로그를 볼 수 있다. (ADB Logcat)
  • ADB Shell 명령어를 사용할 수 있다.
  • Appium, Selemium 등 자동화 테스트 실행이 가능하다.

요구 사항

Mac 사용자의 경우 homebrew를 활용하여 종속성 없이 설치가 가능하다.

$ brew install rethinkdb graphicsmagick zeromq protobuf yasm pkg-config

openSTF의 아키텍처

STF의 공식 문서에 첨부되어 있는 아키텍처를 가져와보았다. STF는 첨부한 이미지와 같이 마이크로 서비스 아키텍처로 구성되어 있다. 각 서비스는 ZeroMQ와 Protocol Buffers로 통신하며 총 19개의 마이크로 서비스가 Docker 이미지로 제공된다. 구축하려는 목적과 사양에 맞게 적절하게 서비스를 실행하면 될 듯하다.

docker-compose 파일 작성

docker-compose.yml 파일은 yaml으로 Docker 컨테이너에 관한 실행 옵션(build 옵션도 포함되어 있는 경우도 있다)을 기재한 파일이다. STF 실행을 위한 docker-compose.yml 파일을 작성해보자.

docker 환경변수 설정(.env)

PUBLIC_IP={SERVER_IP}
SECRET={SESSION_SECRET_HERE}
RETHINKDB_PORT_28015_TCP=tcp://rethinkdb:28015
STATION_NAME={DEVICEFARM_NAME}

docker-compose.yml 작성

version: '3'

volumes:
  rethinkdb:
  storage-temp:

services:
  nginx:
    build: nginx/
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
    restart: unless-stopped
    ports:
      - 80:80
    depends_on:
      - app
      - auth
      - storage-plugin-apk
      - storage-plugin-image
      - storage-temp
      - websocket
      - api
  adb:
    image: sorccu/adb:latest
    restart: unless-stopped
  rethinkdb:
    image: rethinkdb:2.3
    restart: unless-stopped
    volumes:
      - rethinkdb:/data
  app:
    image: openstf/stf:latest
    restart: unless-stopped
    environment:
      - RETHINKDB_PORT_28015_TCP
      - SECRET
    command: stf app --auth-url http://${PUBLIC_IP}/auth/mock/ --websocket-url ws://${PUBLIC_IP}/ --port 3000
    depends_on:
      - rethinkdb
      - auth
      - websocket
  auth:
    image: openstf/stf:latest
    restart: unless-stopped
    environment:
      - RETHINKDB_PORT_28015_TCP
      - SECRET
    command: stf auth-mock --app-url http://${PUBLIC_IP}/ --port 3000
    depends_on:
      - rethinkdb
  processor:
    image: openstf/stf:latest
    restart: unless-stopped
    environment:
      - RETHINKDB_PORT_28015_TCP
    command: stf processor --connect-app-dealer tcp://triproxy:7160 --connect-dev-dealer tcp://dev-triproxy:7260
    depends_on:
      - rethinkdb
      - triproxy
      - dev-triproxy
  triproxy:
    image: openstf/stf:latest
    restart: unless-stopped
    command: stf triproxy app --bind-pub "tcp://*:7150" --bind-dealer "tcp://*:7160" --bind-pull "tcp://*:7170"
  dev-triproxy:
    image: openstf/stf:latest
    restart: unless-stopped
    command: stf triproxy dev --bind-pub "tcp://*:7250" --bind-dealer "tcp://*:7260" --bind-pull "tcp://*:7270"
  migrate:
    image: openstf/stf:latest
    environment:
      - RETHINKDB_PORT_28015_TCP
    command: stf migrate
    depends_on:
      - rethinkdb
  provider:
    image: openstf/stf:latest
    restart: unless-stopped
    command: stf provider --name ${STATION_NAME} --connect-sub tcp://dev-triproxy:7250 --connect-push tcp://dev-triproxy:7270 --storage-url http://${PUBLIC_IP}/ --public-ip ${PUBLIC_IP} --heartbeat-interval 10000 --screen-ws-url-pattern "ws://${PUBLIC_IP}/d/nuc/<%= serial %>/<%= publicPort %>/" --adb-host adb --min-port 7400 --max-port 7700 --allow-remote
    ports:
      - 7400-7700:7400-7700
    depends_on:
      - adb
      - dev-triproxy
      - triproxy
      - storage-temp
  reaper:
    image: openstf/stf:latest
    restart: unless-stopped
    environment:
      - RETHINKDB_PORT_28015_TCP
    depends_on:
      - migrate
      - rethinkdb
      - dev-triproxy
      - triproxy
    command: stf reaper dev --connect-push tcp://dev-triproxy:7270 --connect-sub tcp://triproxy:7150 --heartbeat-timeout 30000
  storage-plugin-apk:
    image: openstf/stf:latest
    restart: unless-stopped
    command: stf storage-plugin-apk --port 3000 --storage-url http://${PUBLIC_IP}/
    depends_on:
      - storage-temp
  storage-plugin-image:
    image: openstf/stf:latest
    restart: unless-stopped
    command: stf storage-plugin-image --port 3000 --storage-url http://${PUBLIC_IP}/
    depends_on:
      - storage-temp
  storage-temp:
    build: storage-temp/
    restart: unless-stopped
    volumes:
      - storage-temp:/app/data
    command: stf storage-temp --port 3000 --save-dir /app/data
  websocket:
    image: openstf/stf:latest
    restart: unless-stopped
    environment:
      - SECRET
      - RETHINKDB_PORT_28015_TCP
    command: stf websocket --port 3000 --storage-url http://${PUBLIC_IP}/ --connect-sub tcp://triproxy:7150 --connect-push tcp://triproxy:7170
    depends_on:
      - migrate
      - rethinkdb
      - storage-temp
      - triproxy
      - dev-triproxy
  api:
    image: openstf/stf:latest
    restart: unless-stopped
    environment:
      - SECRET
      - RETHINKDB_PORT_28015_TCP
    command: stf api --port 3000 --connect-sub tcp://triproxy:7150 --connect-push tcp://triproxy:7170 --connect-sub-dev tcp://dev-triproxy:7250 --connect-push-dev tcp://dev-triproxy:7270
    depends_on:
      - migrate
      - rethinkdb
      - triproxy

빌드하기

docker-compose로 빌드하여 STF가 실행되는지 확인해보자.

$ docker-compose up -d --build

https://github.com/openstf/stf/blob/master/doc/DEPLOYMENT.md

profile
現 두나무 업비트 QA 엔지니어, 前 마이리얼트립 TQA 엔지니어

0개의 댓글