배포 단계 뱃지 표시 유저스크립트

용도

  • 배포 단계 뱃지(phase badge) : 그냥 내가 혼자 쓰는 말인데, 서비스 개발을 하다보면 dev/stage/real/sandbox/cbt/production/live 등의 용어로 서비스의 배포 단계(deploy phase)를 구분하기 마련이고, 이들은 거의 같은 디자인의 웹페이지이고 도메인도 대충 비슷하지만 일부분만 다르게 되어 있을 것이다. 개발하면서 이슈 처리를 위해 이 페이즈와 저 페이즈를 왔다갔다하다보면 개발서버인줄 알고 보다보니 프로덕션 서버였고 하는 일이 이따금 생길 수 있다. 그래서 지금 보고 있는게 어느 페이즈인지 브라우저 주소창의 주소를 통해 식별해야하는게 너무 귀찮아서 적당한 뱃지(라기엔 그냥 박스지만) 표시를 CSS pseudo element를 통해 주입하여 써오고 있다.

prod

sandbox

  • 예전에는 Stylebot이라는 크롬확장을 통해, 도메인마다 지정하여 써오고 있었는데, 크롬확장보다 userscript가 메모리를 덜 먹을 듯 하여, 이번에 새로운 조직에 합류하여 업무를 시작하게 된 김에 userscript로 옮겨보았다.

코드

아래 코드는 다음과 같은 주소 패턴을 가진 서비스를 가졌고, phase 구분은 local/sandbox/cbt/prod 으로 한다고 가정했을 경우이다.

  • http://local.product.awesomeservice.com
  • http://dev.product.awesomeservice.com
  • https://sandbox.product.awesomeservice.com
  • https://cbt.product.awesomeservice.com
  • https://product.awesomeservice.com
// ==UserScript==
// @name        phase-badge-for-SERVICE-NAME
// @namespace   http://127.0.0.1
// @description User Script for phase-badge-for-SERVICE-NAME
// @author      Heesang Chae
// @include     /https?://.*product.awesomeservice.com
// @require     https://cdn.jsdelivr.net/gh/theand/userscript-util@latest/add.js
// @require     https://cdn.jsdelivr.net/gh/theand/userscript-util@latest/element.js
// @require     https://cdn.jsdelivr.net/gh/theand/userscript-util@latest/exec.js
// @version     2019.01.04
// @grant       none
// ==/UserScript==


/*global userscript_util*/

const userscript = function (GM_info) {

    console.group(GM_info.script.name);

    userscript_util.exec.logGmInfo(GM_info);


    const HostMap = [
        {
            phase: "local",
            hosts: [
                "local.product.awesomeservice.com",
                "local-my.product.awesomeservice.com",
            ]
        },
        {
            phase: "sandbox",
            hosts: [
                "dev.product.awesomeservice.com",
                "m-dev.product.awesomeservice.com",
                "sandbox.product.awesomeservice.com",
                "m-sandbox.product.awesomeservice.com",
            ]
        },
        {
            phase: "cbt",
            hosts: [
                "cbt.product.awesomeservice.com",
                "m-cbt.product.awesomeservice.com",
            ]
        },
        {
            phase: "prod",
            hosts: [
                "product.awesomeservice.com",
                "m.product.awesomeservice.com",
            ]
        }
    ];

    const findPhase = (hostname) => {
        const found = HostMap.filter( e => e.hosts.includes(hostname))[0];
        console.log(found);
        return found.phase;
    };

    try {
        const url = new URL(document.location);
        const hostname = url.hostname;
        console.log(`current hostname is ${hostname}`);
        const key = findPhase(hostname);
        console.log(`phase key is ${key}`);
        const button = userscript_util.element.pseudoBodyButtonWith(key);
        userscript_util.add.addGlobalStyle(button);
    } catch (err) {
        userscript_util.exec.logGmError(GM_info, err);
    }

    console.groupEnd();

};

if (top.document.location === self.document.location) {
    userscript_util.exec.executeLater(userscript, GM_info, 500);
}