Aug 16, 2019 - gitignore 와 git commit 제외

한 번도 커밋 되지 않은 파일은 .gitignore 를 사용하면 변경 사항을 무시 할 수 있습니다.

하지만 커밋 된 적이 있는 파일은 .gitignore 에 등록 해도 변경 사항을 트래킹하여, gitignore에 등록되더라도 계속 커밋되는 현상이 생기게 됩니다. git status 사용시에 변경되는 파일 목록을 볼수있습니다.

임의의 파일 datasource.properties 라는 파일을 gitignore에 등록을 했는데, 트래킹되면서 커밋이 발생할 수 있습니다.

인텔리J의 경우는 커밋하지 않을 파일들을, Move Files to Another Changelist… 를 이용해서 별도의 파일을 관리할 수 있습니다. 그러나, 타툴을 사용하시는 분들의 경우 (이클립스, 소스트리 등등)에는 해당 기능이 없어 git 순수한 명령어를 통해 커밋을 제외할 수 있습니다. 그렇기 때문에 기본적인 git 명령어를 통해 커밋 된 파일의 수정 사항 무시하는 방법은 다음과 같습니다.

특정 파일의 수정사항 무시

git update-index --assume-unchanged [file path]

보통의 git이 설치된 분들이라면 git이 기본적으로 환경설정되어있을 터이니, 설정되어있을겁니다.

{경로}\src\main\resources>git update-index --assume-unchanged ./datasource.properties

처럼 특정파일(위의 예제는 datasource.properties) 와같이 위와같은 형태로 등록하시면, 커밋목록에서 삭제됩니다.

특정 파일의 수정사항 무시 취소

git update-index --no-assume-unchanged [file path]

추가로 해당 기능을 제외하고자 하면 위와같이 사용하시면됩니다. 이클립스의 경우, 우측버튼을 눌러 메뉴를 사용할 수 있으며, 인텔리J의 경우, Move to Another Changelist 를 통해 특정파일들을 별도의 그룹으로 하여 관리할 수 있습니다.

임시로 사용할 때는 좋지만 현재 unchanged로 지정된 파일의 내역을 보는 명령어는 없으므로 너무 장기간 사용해서 –assume-unchanged로 지정된 것을 잊어먹으로 오히려 혼란을 초래할 수도 있어 보입니다. 이럴 경우에는 git update-index –really-refresh 를 사용하면 앞에서 –assume-unchanged로 지정한 내용을 무시하고 워킹트리에 대한 인덱스를 새로 갱신합니다.

위 방법을 사용하는 것은 로컬의 계정이 다 틀리기 때문에 발생하는 이슈입니다.

로컬 설정값이 실수로 올라가게 되는 경우를 방지하기 위한 목적이므로, 해당 방법이 좋아보입니다.

git ignore Plugins

  1. 인텔리J의 플러그인 설치
Settings > Plugins > Browse repositories…

에서 ‘.ignore’ 검색 후 install 실행 후 재시작하면, 제외할 파일을 우측메뉴에서 하나씩하나씩 추가할 수 있습니다. 회색음영으로 변경되며 커밋리스트에 나타나지 않는다.

  1. 이클립스의 메뉴 이클립스 메뉴를 통해서도 설정가능합니다.
    이클립스의 경우, assume 자체를 메뉴 명령어를 통해 등록하고 해지할 수 있는 것으로 확인됩니다.
    Assume 등록할 경우, 해당 파일은 체크 이미지가 붙게 되며, 마우스 우측 버튼을 통해 해지할 수 있습니다.
    Team > Advanced > Assume Unchanged
    

반대의 경우에는

Team > Advanced > No Assume Unchanged

으로 해지하면됩니다.

Aug 15, 2019 - Safe Deploy - 안전하게 L4 에서 제외하는 방법

6월 달까지 배포할때 L4에 접속하여 처리했습니다.

여하튼, L4에서 서버를 ena, dis 를 하지 않고, 어플리케이션에서 제어할 수 있는 방법이 전 회사에서는 있었습니다. 외부 웹페이지에서 특정권한만 공유하여, 웹페이지에서 버튼 하나로 붙였다가 띄었다가 하는 형태인데요.

현재 회사에서는 해당 페이지에 별도의 권한이 없이 모든 권한이 있는 페이지형태로 접근하는 것이라, telnet 으로 접속하여 처리하였습니다.

그러다가 6월 경 증 Meetup의 글을 보게 되었습니다. Safe Deploy - 안전하게 L4 에서 제외하는 방법인데요.

방화벽 룰에 L4 쪽 IP 를 추가해서, L4에서 health check 시 서버가 죽었다고 판단하는 방법이었습니다.

배포할 deploy 서버에 접속하여, 들어오는 요청을 DROP하는 방화벽 룰 추가하여 L4 에서 제거하는 방법으로

sudo iptables -A INPUT -s L4ip -p tcp --dport 80 -j DROP

배포 완료 후, 방화벽 룰을 삭제하여 다시금 L4를 통해 유입되도록 합니다.

sudo iptables -D INPUT -s L4ip -p tcp --dport 80  -j DROP

위의 방법으로 대략 5~10초 정도 안에 유입이 중단되었다가 다시 유입되는 것을 확인했습니다. 해당 글을 보고 아이덴티티에 엄청난 충격을 주었습니다. iptables 을 알고 있고, L4 Ip도 알고 있는데, 해당 방법을 연결해서 사용하는 것을 생각하지 못했던 겁니다. 바로 서버한대에 테스트를 진행해봤는데, L4 에 접속해서 enable, disable 하지 않고도, 안정적으로 deploy 할 수 있었습니다.

6월달부터, 안정적인 배포를 진행하고 있었는데, 생각이 나는 김에 정리해서 올립니다.


참조


Aug 13, 2019 - NetworkInterface.getNetworkInterfaces

String hostAddr = null;
        try {
            Enumeration<NetworkInterface> nienum = NetworkInterface.getNetworkInterfaces();
            while (nienum.hasMoreElements()) {
                NetworkInterface ni = nienum.nextElement();
                Enumeration<InetAddress> kk= ni.getInetAddresses();
                while (kk.hasMoreElements()) {
                    InetAddress inetAddress = kk.nextElement();
                    if (!inetAddress.isLoopbackAddress() &&
                            !inetAddress.isLinkLocalAddress() &&
                            inetAddress.isSiteLocalAddress()) {
                        hostAddr = inetAddress.getHostAddress();
                        logger.info("hostAddr ########### {}", hostAddr);
                    }
                }
            }
        } catch (SocketException e) {
            logger.error("######### Memory Load #########",e);
        }

프로퍼티로 관리하고 있는 서버가 있는데, 특정 서버에서만 별도의 동작을 수행하기 위하여, IP를 체크한 후 해당 아이피에 따른 SERVER_TYPE 을 정의하여, IP별로 서비스 구분을 하거나, 하나의 IP서버에만 특정 기능이 동작하도록 구현하였습니다.

문제는 이렇게 할 경우, 서버가 증설하여 그룹해야할 IP가 추가될 때마다 일일이 추가해야하는 문제가 있습니다.