최근 회사에서 Credential 내역이 노출되어 보안 위협이 된 사례가 발생을 하였다.


즉, 아이디/패스워드, AWS 토큰 값들을 소스파일 안에 적어놓고

그것을 그대로 commit 하여 push 까지 해버린 것이다.



그래서, 소스코드에 이러한 Credential 정보가 들어있는지 점검하는 것을 강화하였다.

자동으로 분석하도록 한 것이다.



문제는 이러한 Credential 정보가 들어있는 파일을 발견했을 때

개발자들이 어떻게 조치를 취해야하는지에 대한 가이드가 부재하고 있다는...





1. 기본 배경


    - 개발자들이 특정 API 사용을 위한 인증 정보를 파일에 적어놓고 무심코 commit을 했을 경우를 전제 해보자

    - 즉, 아래 그림과 같이 "commit D"에 token 값이 있다는 것을 발견한 것이다!!!



2. 최악의 해결 방법


    - Credential 정보가 발견되었다는 경고를 받은 개발자는 당황한 나머지 아래와 같이 작업을 할 수 있다.


    - 설마! 라고 하지만 정말로 저렇게 할 수 있다 !!!

    - 위와 같이 하면 "commit E"에서는 Credential 정보가 안보이지만, "commit D"로 checkout을 하면 볼 수 있게 되기에 해결책이 아니다 !!!!!




3. 기본적인 해결 방법


    - 실습을 위해 아래와 같이 실제 commit들을 만들어보았다.



    - 마지막 commit인 "2651682"에서 Credential 정보가 발견되었을 경우에 대한 대처법을 알아보자.


$ git clone git@github.com:whatwant/whatwant.git

Cloning into 'whatwant'...

remote: Enumerating objects: 8, done.

remote: Counting objects: 100% (8/8), done.

remote: Compressing objects: 100% (4/4), done.

Receiving objects: 100% (11/11), done.

Resolving deltas: 100% (2/2), done.

remote: Total 11 (delta 2), reused 8 (delta 2), pack-reused 3



$ cd whatwant/



$ git log --oneline

2651682 (HEAD -> master, origin/master, origin/HEAD) write token in no002.txt

a2004f0 add no002.txt

93afc28 add no001.txt

2b73c6e Initial commit



$ git reset --hard HEAD^

HEAD is now at a2004f0 add no002.txt



$ git log --oneline

a2004f0 (HEAD -> master) add no002.txt

93afc28 add no001.txt

2b73c6e Initial commit



$ git push origin master

To github.com:whatwant/whatwant.git

 ! [rejected]        master -> master (non-fast-forward)

error: failed to push some refs to 'git@github.com:whatwant/whatwant.git'

hint: Updates were rejected because the tip of your current branch is behind

hint: its remote counterpart. Integrate the remote changes (e.g.

hint: 'git pull ...') before pushing again.

hint: See the 'Note about fast-forwards' in 'git push --help' for details.



$ git push -f origin master

Total 0 (delta 0), reused 0 (delta 0)

To github.com:whatwant/whatwant.git

 + 2651682...a2004f0 master -> master (forced update)


    - 위와 같이 진행하고 commit 현황을 보면 "2651682" commit이 사라진 것을 볼 수 있다.



    - 아래 그림과 같이 표현할 수 있을 것이다



    - "git reset"은 매우 위험한 명령이기에 그냥 push를 하고자 하면 reject을 당한다! 그래서 "-f" 옵션을 통해 force 실행해야 한다!!!



4. 특정 파일의 이력을 모두 삭제하는 방법


    - 이번 포스팅을 하게 된 이유이다 !!!



    - 위와 같이 commit들이 있다고 해보자. 그림으로 표현하면 아래와 같다.



    - 즉, 예전에 이미 Credential 정보를 넣었는데... 불행하게도 뒤늦게 (이미 commit들이 쌓이고 난 뒤에) Credential 정보를 발견하게 된것이다.

    - 문제가 된 파일과 관련된 모든 이력을 지워보자.


$ git clone git@github.com:whatwant/whatwant.git

Cloning into 'whatwant'...

remote: Enumerating objects: 9, done.

remote: Counting objects: 100% (9/9), done.

remote: Compressing objects: 100% (7/7), done.

Receiving objects: 100% (13/13), done.

Resolving deltas: 100% (3/3), done.

remote: Total 13 (delta 3), reused 7 (delta 1), pack-reused 4



$ cd whatwant/



$ git log --oneline

d81bb67 (HEAD -> master, origin/master, origin/HEAD) add no003.txt

df3c9e0 write token in no002.txt

ea11c2d add no002.txt

83bc6a8 add no001.txt

2b73c6e Initial commit


$ git filter-branch --tree-filter "rm -f no002.txt" HEAD

Rewrite d81bb67affec459cd3e25fa57b98cf64a1bf05be (3/5) (1 seconds passed, remaining 0 predicted)

Ref 'refs/heads/master' was rewritten



$ ls -al

total 9

drwxr-xr-x 1 chani 197121  0 11월  9 20:41 ./

drwxr-xr-x 1 chani 197121  0 11월  9 20:40 ../

drwxr-xr-x 1 chani 197121  0 11월  9 20:41 .git/

-rw-r--r-- 1 chani 197121  0 11월  9 20:40 no001.txt

-rw-r--r-- 1 chani 197121  0 11월  9 20:40 no003.txt

-rw-r--r-- 1 chani 197121 10 11월  9 20:40 README.md



$ git log --oneline

69c84e3 (HEAD -> master) add no003.txt

94413d9 write token in no002.txt

1a2d568 add no002.txt

83bc6a8 add no001.txt

2b73c6e Initial commit



$ git push origin master

To github.com:whatwant/whatwant.git

 ! [rejected]        master -> master (non-fast-forward)

error: failed to push some refs to 'git@github.com:whatwant/whatwant.git'

hint: Updates were rejected because the tip of your current branch is behind

hint: its remote counterpart. Integrate the remote changes (e.g.

hint: 'git pull ...') before pushing again.

hint: See the 'Note about fast-forwards' in 'git push --help' for details.



$ git push -f origin master

Counting objects: 4, done.

Delta compression using up to 4 threads.

Compressing objects: 100% (4/4), done.

Writing objects: 100% (4/4), 515 bytes | 515.00 KiB/s, done.

Total 4 (delta 1), reused 0 (delta 0)

remote: Resolving deltas: 100% (1/1), done.

To github.com:whatwant/whatwant.git

 + d81bb67...69c84e3 master -> master (forced update)


    - 실제 commit이 어떻게 되어있는지 확인해 보자.



    - 무엇이 바뀌었는지 그림으로 확인해 보자.



    - 위의 방법은 문제가 발생한 파일과 관련한 내용을 전체 히스토리에서 삭제를 하는 것이다.

      → 그렇기 때문에, 영향을 받은 commit을 보면 앞의 commit 까지 포함이 된다.





※ 주의사항


    - 문제가 발생한 정확한 위치를 찾기가 어렵기 때문에 문제가 발생한 파일을 전체 history에서 삭제를 해버리는 방식이다.

      → 해당 파일에 Credential 정보 외의 내역도 있고 이에 대한 내용도 중요하다고 하면 문제가 있을 수 있는 방법이라는 말이다.


    - 그리고, 기존 commit ID 값도 변경이 된다.

      → commit ID 이력을 관리하고 있는 상황인 경우 문제가 있을 수 있다는 말이다.




이러한 번거로움을 피하기 위해서는 애초에 Credential 정보를 파일안에 기재하는 일이 없어야 하겠다.



반응형


업무 관련하여 GitHub의 로그인(인증)을 가지고 웹사이트를 구축하고자 알아보고 있다.

별도의 웹페이지를 구성하는데, 로그인 부분을 GitHub 것을 가지고 오고 싶은 것이다.


구글신님께 여쭤보니 자꾸만 Node.JS 기반의 샘플 코드만 알려주시는데,

미천한 중생인 필자는 구석기 시대를 살고 있는 무식한 종자이기에... 버겨웠다 ㅠㅠ


하지만, 구현은 해야하는데...


필자에게 남은 선택지는 두 가지 !!!

① Node.JS 공부하기

② 무조건 다른 방식 찾아내기


그러다가 우연히 만난 구글신님의 중얼거림..... "PHP로 구현한 샘플도 있는데..."


그래서, 대세 흐름은 아니지만 PHP로 구현한 코드를 직접 한 번 되는지 해보기로 했다.



1. WAS 환경 구축하기

    - Docker 기반으로 nginx + php 환경을 간단히 구축해봤다.

        ① Docker 설치하기 (링크)

        ② Docker-Compose 설치하기 (링크)

        ③ docker-compose.yml 작성


version: '3'


services:


    web:

        image: nginx:latest

        ports:

            - "80:80"

        volumes:

            - ./html:/code

            - ./web/conf/default.conf:/etc/nginx/conf.d/default.conf

            - ./web/log:/var/log/nginx


    php:

        image: php:7.3-fpm

        expose:

            - "9000"

        volumes:

            - ./html:/code


        ④ ./web/conf/default.conf 작성


server {

    listen 80;


    server_name 192.168.100.xxx localhost;


    index index.php index.html;


    root /code;


    location ~ \.php$ {

        try_files $uri =404;

        fastcgi_split_path_info ^(.+\.php)(/.+)$;

        fastcgi_pass php:9000;

        fastcgi_index index.php;

        include fastcgi_params;

        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

        fastcgi_param PATH_INFO $fastcgi_path_info;

    }


    error_log  /var/log/nginx/error.log;

    access_log /var/log/nginx/access.log;

}


    ⑤ ./html/index.php


<?php


echo phpinfo();


?>


    ⑥ 브라우져로 접속해서 확인 → 성공~



※ 진행하다보니.... 집에서 VirtualBox로 생성한 서버에서 테스트를 진행하려다보니 여러가지 제약사항이 생겼다.

   일단 외부에 있는 GitHub.com에서 내부로 들어올 수도 없고..... 포트포워딩 등을 셋팅하면 되겠지만...

   야밤에 귀찮기도 하고... 그래서 외국에 있는 저렴이 서버 호스팅을 이용해서 테스트 진행하기로 했다.




2. GitHub 에서 App 등록하기


    - GitHub 인증을 이용하기 위해서는 GitHub에 "OAuth Apps"로 등록하는 과정이 필요하다.

    - 회사에서는 GitHub Enterprise에서 진행을 해야하지만, 지금 집에서는 GitHub.com을 이용하기로 했다.



    - GitHub.com 로그인 후 계정에서 Settings 메뉴 선택 후 Developer settings 항목을 선택하자



    - 우리가 사용할 것은 OAuth Apps 메뉴이다.



    - 위와 같이 정보를 채우자. (GitHub로 시작하는 이름은 사용할 수 없단다 ^^)

    - 생성할 때 callback URL을 어떻게 해야할지 몰라서 위와 같이 했는데... 실제 구성 時 로그인 페이지의 URL로 작성해주자.




    - 이제 우리에게 필요한 정보를 얻었다!!!




3. 페이지 구성하기


    ① index.php : 첫 접근 페이지

        - 이미 로그인이 되어있으면 main.php 페이지로 전환

        - 로그인을 원하면 login.php 링크 제공

<?php

session_start();


if (isset($_SESSION['github_data'])) {

    header("location: main.php");

}

?>

<a href="login.php">Login with Github</a>


    ② login.php

        - 로그인이 안되어 있으면 GitHub.com으로 보내버리고,

        - 로그인이 되어 있으면 세션에 사용자 정보를 넣고선 main.php로 전환

        - 위에서 생성한 정보는 각자 알맞게 입력!

<?php


$config = array(

    'client_id'     => 'xxx',

    'client_secret' => 'xxx',

    'redirect_url'  => 'http://xxx.xxx.xxx.xxx:8080/login.php',

    'app_name'      => 'WHATWANT GH Login'

);


session_start();


if($_SERVER['REQUEST_METHOD'] == 'GET') {

    if(isset($_GET['code'])) {


        $curl = curl_init('https://github.com/login/oauth/access_token');


        //TO DO: code 값이 없을 경우 처리

        $config['code'] = $_GET['code'];


        curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);

        curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($config));

        curl_setopt($curl, CURLOPT_HTTPHEADER, array("Accept: application/json"));


        $json_response = curl_exec($curl);

        curl_close($curl);



        $token = json_decode($json_response);


        //TO DO: access_token 값이 리턴되지 않을 경우 처리

        $_SESSION['access_token'] = $token->access_token;


        $curl = curl_init("https://api.github.com/user?access_token=".$_SESSION["access_token"]);


        curl_setopt($curl, CURLOPT_HEADER, false);

        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

        curl_setopt($curl, CURLOPT_HTTPHEADER, array("Accept: application/json", "User-Agent: WHATWANT App"));


        $json_response = curl_exec($curl);

        curl_close($curl);


        $userdata = json_decode($json_response, true);



        $_SESSION['github_data'] = $userdata;

        header("location: main.php");

    }


    else {


        $url = "https://github.com/login/oauth/authorize?client_id=".$config['client_id']."&redirect_uri=".$config['redirect_url']."&scope=user";

        header("Location: $url");

    }

}


?>


    ③ main.php

        - 세션에 값이 없으면 index.php로 전환

        - 세션에 값이 있으면 정보 출력, 더불어 로그아웃 링크 제공

<?php

session_start();


if (!isset($_SESSION['github_data'])) {

    header("location: index.php");

}

else {


    foreach( $_SESSION['github_data'] as $key => $value ) {

        echo "$key => $value<br>";

    }


    echo "<a href='logout.php'>Logout</a>";

}

?>


    ④ logout.php

        - 세션값 날리고, index.php 페이지로 전환

<?php

session_start();

unset($_SESSION['github_data']);

header("Location: index.php");

?>


일단 급한대로 여기에서 마무리.

아직 구현하지 않은 부분은 구현하는대로 업데이트 하겠음~!!


참고사이트 : https://www.9lessons.info/2014/02/login-with-github-oauth-php.html


반응형


회사에서 repo를 사용해야할 개발팀이 Windows 환경에서 개발을 한단다. 이런...

Windows는 테스트 환경도 마땅치 않은데...


그나마 다행인 것은 친절하게도 Windows 환경에서

repo를 사용할 수 있도록 노력을 해주는 사람들이 이미 있다는 것이다 ~ !!! 쌩유 !!!


    ▷ https://github.com/esrlabs/git-repo


이하 내용은 MS Windows 7 64bit 환경에서 테스트 되었다.



1. Precondition


    ① git

        - 여러 종류의 SW가 존재하지만, 표준 제품(?)으로 설치하자 !!!

        ▷ https://git-scm.com/download/

        - 설치는 기본 설정값으로 진행하되 아래 부분은 조금만 신경쓰자





        - 특히 아래와 같이 Enable symbolic links 항목을 꼭 체크하자



    ② Python

        - repo는 python으로 작성된 스크립트이므로, 당연하게도 python이 설치되어 있어야 한다

        ▷ https://www.python.org/downloads/

        - Python 3에서도 실행이 되지만, 아직은 호환성을 고려했을 때 2.7 버전으로 설치하자


        - 가능한 기본 설정값으로 설치를 진행하자



2. Install


    ▷ Ubuntu 환경에서와 마찬가지로 2가지 방법으로 설치 진행할 수 있다.


    (방법 1) curl

        - 평범한(?) 방법이다~


$ cd ~

$ mkdir ./bin

$ curl https://raw.githubusercontent.com/esrlabs/git-repo/stable/repo > ./bin/repo

$ curl https://raw.githubusercontent.com/esrlabs/git-repo/stable/repo.cmd > ./bin/repo.cmd

$ export PATH=$PATH:~/bin


    (방법 2) git clone

        - git으로 존재하는 배포판인데, git clone을 해야지.... ^^


$ cd ~

$ git clone https://github.com/esrlabs/git-repo.git

$ cd ./git-repo

$ git checkout -b stable origin/stable

$ export PATH=$PATH:~/git-repo


    (공통) PATH

        - 영구적으로 실행 경로를 등록하기 위해서 아래와 같이 해보자


$ cd ~

$ nano ./.bashrc


        - 각자 필요한 경로로 작성하면 된다


export PATH=$PATH:~/bin

export PATH=$PATH:~/git-repo



3. How to #1


    □ precondition

        - git을 사용하기 위한 사용자 정보 입력과 작업 공간(directory)를 만들고 시작하자 (기본 경로는 필자 개인 취향이다)


$ cd /srv/workspace

$ mkdir ./whatwant

$ cd ./whatwant


$ git config --global user.name "whatwant"

$ git config --global user.email "whatwant@gmail.com"


    ① init

        - 작업 공간(directory)을 작업하기 위한 상태로 만드는 과정이다


$ repo init -u https://github.com/whatwant-school/manifest --no-clone-bundle


    ② sync

        - 실제 사용할 repository를 가져오는 과정이다


$ repo sync --no-clone-bundle




반응형


long, long time ago ...

필자가 안드로이드 플랫폼과 토발즈 형님의 Git에 한참 빠져있을 때 알게된 repo라는 희한한(?) 도구 !!


안드로이드 플랫폼이 여러개의 repo로 구성되어 공개되다보니,

한 번에 내려받기에 불편함이 많았고, 그래서 google 님께서 만들어 배포한 repo라는 도구.



여러 개의 repository로 구성된 프로젝트를 위해서 git 에서는 submodule이라는 기능을 지원해주고 있다.

최근에 많이 좋아졌다고는 하는데... 개인적으로 안좋아한다. 너무 어렵고 햇갈려서..... ㅠㅠ


그렇다고 해서 repo가 사용하기에 엄청 쉬운 것은 아니지만

그래도 개인적으로는 다수의 repository를 관리하는 용도로는 괜찮은 도구라고 생각된다.


아래 참고자료를 바탕으로 한 번 정리해보겠다.


▷ 소스코드 URL : https://gerrit.googlesource.com/git-repo/

▷ 가 이 드  URL : https://source.android.com/setup/develop/repo

▷ 설치방법 URL : https://source.android.com/setup/build/downloading#installing-repo


매뉴얼과는 조금 진행 방식에서 차이가 날 수는 있다.

필자 회사 사정상.... curl 등을 통한 외부와의 연결(?)이 수월하지 않기에...

별도의 온라인(?) 없이 편하게 사용할 수 있는 방향으로.... ^^



이하 내용은 Ubuntu 14.04 64bit 환경에서 테스트 되었습니다.



1. Precondition


    ① git

        - 당연하게도 git은 미리 설치가 되어있어야 한다.


$ sudo apt-get install git



    ② bundle

        - repo에서는 git 기능 中 bundle이라는 것을 사용한다. 일단, 이런게 있다라는 것만 알아두면 된다

        - 참고 : https://git-scm.com/book/ko/v2/Git-%EB%8F%84%EA%B5%AC-Bundle



    ③ proxy

        - proxy를 사용하는 network 상황이라고 하면, 다음과 같이 설정이 되어 있어야 한다


export HTTP_PROXY=http://<proxy_user_id>:<proxy_password>@<proxy_server>:<proxy_port>

export HTTPS_PROXY=http://<proxy_user_id>:<proxy_password>@<proxy_server>:<proxy_port>



2. Install


    ▷ repo를 설치하는 경로는 각자 알아서 하면 되지만, 필자의 경우 개인적인 취향으로 "/srv/install/repo/" 경로로 잡았다.

    ▷ 아래 두가지 방법 中 개인적인 취향에 따라 선택하면 된다.


    (방법1) curl

        - 일반적으로 알려진 방법으로써 대부분 이렇게 가이드 되고 있다.

        - curl을 이용해서 다운로드 받은 후, 실행권한 주고, 경로에 추가해서 어디서나 실행할 수 있도록 하는 방법이다.


$ cd /srv/install/repo/

$ curl https://storage.googleapis.com/git-repo-downloads/repo > ./repo

$ chmod a+x ./repo

$ export PATH=/srv/install/repo:$PATH


    (방법2) git clone

        - 그냥 repo 프로젝트를 그대로 다운로드 받아서 사용하는 방법이다.

        - repo 업그레이드 같은 것을 할 때 유리할지도... ?!


$ cd /srv/install/

$ git clone https://gerrit.googlesource.com/git-repo

$ cd ./git-repo

$ git checkout -b stable origin/stable

$ export PATH=/srv/install/git-repo:$PATH



3. manifest


    ▷ 여러 repository들에 대한 정보를 관리하기 위한 파일이 바로 manifest 파일이다.

    ▷ 필요한 정보를 저장하는 방법을 알아보자.


    □ sample

        - repo의 가장 표본이 되는 android 에서 사용되는 manifest 파일의 일부를 아래와 같이 뽑아보았다.


<?xml version="1.0" encoding="UTF-8"?>

<manifest>

    <remote  name="aosp"  fetch=".."   review="https://android-review.googlesource.com/" />

    <default revision="master"   remote="aosp"   sync-j="4" />

    <project path="build/make" name="platform/build" groups="pdk" >

      <copyfile src="core/root.mk" dest="Makefile" />

      <linkfile src="CleanSpec.mk" dest="build/CleanSpec.mk" />

    </project>

    <project path="build/blueprint" name="platform/build/blueprint" groups="pdk,tradefed" />

</manifest>


    ① <remote />

        - 가장 중요한 기본적인 프로젝트 정보를 적는 곳이다.

            . name : remote 별칭

            . fetch : repository들을 받아올 server 정보

            . review : review를 요청할 server 정보


    ② <default />

        - 뒤에 나올 project에서 사용될 기본 설정값을 적는 곳이다.

            . revision : default branch name

            . remote : default remote name

            . sync-j : repository 정보를 내려받을 때, 동시에 몇 개씩 할 것인지...


    ③ <project />

        - 개별 repository에 관련된 정보를 적는 곳이다.

            . name : server 에서 repository 경로

            . path : local에 실제 저장될 경로

            . group : repository들을 묶음으로 관리하기 위한 별칭

            . revision : sync 한 뒤에 HEAD가 될 commit id


    ④ <copyfile />

        - 파일 복사가 필요한 경우에 사용할 수 있다.

            . src : 복사할 원본 파일 경로

            . dest : 복사될 타켓 파일 경로


    ⑤ <linkfile />

        - 링크 파일 생성이 필요한 경우에 사용할 수 있다.

            . src : 링크될 원본 파일 경로

            . dest : 타겟 링크 파일 경로



4. how to #1


    ▷ 모든 명령어(옵션?)를 공부한다는 것은 말도 안되는 것이고... 몇 가지 시나리오를 가지고 따라해봐야 할텐데 ... 일단 한 번 


    □ precondition

        - git을 사용하기 위한 사용자 정보 입력과 작업 공간(directory)를 만들고 시작하자 (기본 경로는 필자 개인 취향이다)


$ cd /srv/workspace

$ mkdir ./whatwant

$ cd ./whatwant


$ git config --global user.name "whatwant"

$ git config --global user.email "whatwant@gmail.com"


    ① init

        - 작업 공간(directory)을 작업하기 위한 상태로 만드는 과정이다


$ repo init -u https://github.com/whatwant-school/manifest --no-clone-bundle


        - 뒤의 "--no-clone-bundle" 옵션을 빼도 실행에는 지장이 없지만, 에러 메시지 보기 싫어서 넣었다.

        - 'repo init'을 실행하게 되면, git-repo repository를 clone 받게 되는데...

          회사에서는 이 부분을 좀 수정해야할 수도 있을 것 같다. 나중에 하게 되면 그 때 다시 포스팅을~^^


    ② sync

        - 실제 사용할 repository를 가져오는 과정이다


$ repo sync --no-clone-bundle


        - 자꾸 "--no-clone-bundle" 옵션을 넣는 것도 귀찮으니... 회사에서는 이 부분도 기본값을 수정하면 편할 것 같다는 느낌이...




이번 포스팅은 여기까지만 ... 뒷 부분 이야기는 필요에 따라서 ... ^^


반응형

회사에서 Gerrit~GitHub 연계를 위해서 방법을 찾던 中

부서원들이 GitHub Plugin이라는 것이 있다는 것을 알아냈는데... 좀 문제가 있었다.


바이너리가 아니라 빌드를 해서 사용해야한다는 문제인데...

더욱 더 큰 문제는... 빌드가 쉽지는 않다는 사태가...


기본 가이드 링크는 아래와 같다.

   - https://gerrit.googlesource.com/plugins/github/+/refs/heads/stable-2.12/README.md


언제나 그렇지만... 시키는대로 따라할 수가 없어서 문제이지...



[ Action ]


참고할 정보가 있는 기준(?) 레퍼런스...


https://gerrit-review.googlesource.com/Documentation/dev-buck.html

링크가 깨졌다.


그렇지만, 포기하지 않는다!!!

https://review.openstack.org/Documentation/dev-buck.html

여기에서 확인할 수 있었다.



① Git

   - 소스들을 받아오기 위해서는 기본적으로 Git이 필요하다.


$ sudo apt-get install git


② JDK

   - Gerrit은 기본적으로 Java 기반이기에... 가이드에는 JDK7이 필요하다고 되어있다.

   - 무시하고 JDK8로 환경을 맞춰서 했다가 다 망했다..

   - 무조건 JDK7 환경으로 진행을 해라!!!


③ Ant

   - Buck 이라는 빌드 도구를 빌드하기 위해서는 Ant가 필요하다.

   - 응!? Unix is not Unix ?


$ sudo apt-get install ant


④ Gerrit download

   - Gerrit 빌드할 준비를 위해 미리 소스코드를 내려 받는다.

   - 이번 빌드는 2.10 버전을 기준으로 할 것이다.

     (실제로 2.10 버전을 보면 2.10.7 까지 있는데, 우선은 가이드에 있는 2.10.2 버전으로 해보겠다)


$ cd /srv/workspace

$ git clone --recursive https://gerrit.googlesource.com/gerrit

$ cd gerrit

$ git reset --hard v2.10.2



⑤ Buck

   - 이번에 처음 들어본 빌드 도구이다. Buck ?!

   - Facebook 에서 만들었고, 오픈소스로 공개한 것인가 보다.

      . https://buckbuild.com/

      . https://github.com/facebook/buck


$ cd /srv/workspace

$ git clone https://github.com/facebook/buck

$ cd buck

$ git checkout $(cat ../gerrit/.buckversion)

$ ant

$ export PATH=$PATH:/srv/workspace/buck/bin/



⑥ Gerrit Build

   - 이제 Buck으로 Gerrit을 빌드해보자. 안해도 된다. 그냥 해보기.


$ cd /srv/workspace/gerrit

$ buck build gerrit



⑦ maven

   - 뒤에 것들을 진행하기 위해서 이것도 필요하다.


$ sudo apt-get install maven



⑧ GitHub API

   - 이것도 필요하단다...


$ cd /srv/workspace

$ git clone https://github.com/lucamilanesio/github-api.git

$ cd github-api/

$ mvn install -DskipTests=true



⑨ singleusergroup plugin

   - 또 필요한거 빌드 하자.


$ cd /srv/workspace/gerrit

$ cd ./plugins/singleusergroup

$ git reset --hard v2.10.2

$ cd /srv/workspace/gerrit

$ buck build plugins/singleusergroup/



⑩ github plugin

   - 이제 본게임으로 들어가자

   - 최신 버전으로는 빌드가 안되어 알아낸 방법..... 2.10 버전으로 하면 된다.


$ cd /srv/workspace

$ git clone https://gerrit.googlesource.com/plugins/github

$ cd github

$ git checkout -b stabe-2.10 origin/stable-2.10

$ mvn install


...


[INFO] ------------------------------------------------------------------------

[INFO] Reactor Summary:

[INFO] 

[INFO] Gerrit Code Review - GitHub integration ........... SUCCESS [2.338s]

[INFO] Gerrit Code Review - GitHub OAuth login ........... SUCCESS [22.009s]

[INFO] Gerrit Code Review - GitHub plugin ................ SUCCESS [18.869s]

[INFO] ------------------------------------------------------------------------

[INFO] BUILD SUCCESS

[INFO] ------------------------------------------------------------------------

[INFO] Total time: 44.113s

[INFO] Finished at: Mon Mar 27 00:09:03 KST 2017

[INFO] Final Memory: 31M/91M

[INFO] ------------------------------------------------------------------------


빌드까지는 성공~

이후 설치 및 셋팅은 다음 기회에~^^


github-oauth-2.10.3.jar

original-github-oauth-2.10.3.jar

github-plugin-2.10.3.jar

original-github-plugin-2.10.3.jar

github-api-1.69.jar

github-api-1.69-SNAPSHOT.jar

singlegroup.tar.gz

singlegroup.tar.gz

singlegroup.tar.gz

github-oauth-2.13.jar

original-github-oauth-2.13.jar

github-plugin-2.13.jar

original-github-plugin-2.13.jar

singleusergroup.tar.gz

github-api-1.69-SNAPSHOT.jar

singlegroup.tar.gz


반응형


Git에 대해서 공부하다보면, 조금 답답한 것 중 하나가 용어 정리를 해주지를 않는다는 점이다.
그런 것 중 하나가 바로 [ Fast-Forward ]라는 용어다.


이 블로그에 포스팅하고 있는 내용들 모두 마찬가지이지만,
특히 이번 블로그는 절대적으로 개인적인 의견과 함께 개인적으로 정리한 내용이다.
즉, 완전 거짓말일 수 있다는 말이다. 꼭 참고하길 바란다!!! (책임지지 않아요~)



1. 합치자고~

     - Git에서 이루어지는 merge 방법은 다음의 세가지 타입이 있다.
          ▷ 3-way merge
          ▷ fast-forward merge
          ▷ cherry-pick

     - 명령어로 따지면 다음 3가지 방법이 있다.
          ▷ merge
          ▷ rebase
          ▷ cherry-pick



2. 명령어와 방식의 구분

     - 각 명령어와 merge 방식의 관계는 다음과 같다.

  merge rebase cherry-pick
3-way merge O X X
fast-forward merge O O X
cherry-pick X X O

 


     - 즉, merge 명령을 통해서는 상황에 따라 "3-way merge"가 이루어질 수도 있고,
       "fast-forward merge"가 이루어질 수도 있다.

     - rebase 명령의 경우에는 기본적으로 "fast-forward merge"가 이루어진다.
     - cherry-pick 명령은 "cherry-pick"을 위한 명령이다.




3. fast-forward merge

     - fast-forward의 본래 뜻은...!? 앞으로 감다!!! 즉, FF 버튼이나 FFWD 버튼이 바로 이것이다.
     - fast-forward merge가 이루어지는 경우는 두 가지이다.

          ▷ merge 상황에서 merge를 하는 branch에서 별도의 commit이 없는 경우
          ▷ rebase를 수행하는 경우

 


4. 3-way merge

     - 일반적인 merge 상황에서 git은 기본적으로 3-way merge를 수행한다. 
     - 양쪽 브랜치에 commit이 있는 상황에서 merge를 하면 merge commit과 함께 합쳐지는 것이다.

 

5. cherry-pick merge

     - 특정 commit만을 반영하고 싶은 경우이다. 
     - 양쪽 브랜치에 commit이 있는 상황에서 merge를 하면 merge commit과 함께 합쳐지는 것이다.

 

정말 옛날에 작성해놓고 keep 하고 있는 포스팅인데...

자세한 설명은 다음 기회에 하기로 하고... 그냥 발행한다 ^^

(잠자고 있는 포스트 발행하기 프로젝트 중이라서... ㅋㅋ)

 

반응형

 

간단하게 Git 서버가 필요해서 떠오른 GitLab을 어떻게 하면 한방에 설치할 수 있을지 연구하다가... ^^

최종적으로는 GitLab을 Docker 기반으로 실행을 하고 싶어서 이것 저것 알아보았다.

 

 

그런데, 이번에도 느낀 것이지만 개발환경(Development Environment)과 관련된 도구들은

막상 알게되면 그리 어렵지도 않고 별것도 아닌데 그 조금을 알아내기가 쉽지 않다.

 

Docker도 그렇고 GitLab도 그런 것 같다.

막상 알게 되면 그닥 어려운 애들이 아닌데 내가 필요한 것들을 알아내기가 쉽지는 않다.

 

내가 블로그를 시작한 이유처럼... 내가 알아낸 것들을 최대한 쉽게 많은 사람들에게 공유! 공유! 파이팅!!

 

 

 

 

1. Docker 설치하기

   - http://www.whatwant.com/825

 

 

 

2. 기존 Server SW 제거

   - 포트 충돌 방지를 위해서 기존에 해당 포트들을 사용하는 것들이 있으면 제거(?) 하자

   - 기본 포트는 [ 443, 80, 22 ] 이다.

   - 필자는 22번 SSh Server가 있어서 삭제를 진행했었다.

 

$ sudo apt-get purge openssh-server

 

 

 

3. Docker 실행

   - docker 설치 잘 되어있고, 포트 충돌날 것들 없앴고... 준비는 모두 끝났다.

   - 그냥 실행 확 해버리면 알아서 이미지 내려받고 알아서 잘 실행한다.

 

$ sudo docker run --detach --hostname gitlab.example.com --publish 443:443 --publish 80:80 --publish 22:22 --name gitlab --restart always --volume /srv/gitlab/config:/etc/gitlab --volume /srv/gitlab/logs:/var/log/gitlab --volume /srv/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce:latest

 

   - 위에 작성된 옵션들을 잘 해석해보기 바란다. GitLab을 운영하기 위한 많은 것들이 녹아들어 있다.

   - 아래와 같은 옵션도 넣을 수 있다는 것을 참고하기 바란다(필요에 따라).

 

-e 'GITLAB_SSH_PORT=10022' -p 10022:22 -v /var/run/docker.sock:/run/docker.sock -v $(which docker):/bin/docker -v /home/swc/gitlab/data:/home/git/data -e 'GITLAB_HOST=git.site.net' -e 'GITLAP_TIMEZONE=UTC+9' -e 'GITLAB_EMAIL=git@git.site.net' -e 'SMTP_ENABLED=true' -e 'SMTP_DOMAIN=site.net' -e 'SMTP_HOST=123.234.345.456' -e 'SMTP_PORT=25' -e 'SMTP_OPENSSL_VERIFY_MODE=none' -e 'SMTP_AUTENTICATION=none' -e 'LDAP_ENABLED=true' -e 'LDAP_HOST=ldap.site.net' -e 'LDAP_PORT=636' -e 'LDAP_UID=uid' -e 'LDAP_METHOD=ssl' -e 'LDAP_BASE=ou=People,dc=swc,dc=site,dc=net' gitlab/gitlab-ce:latest

 

 

 

4. Login

   - http://localhost  접속하면 된다.

      • username: root

      • password: 5iveL!fe

 

 

 

파이팅!

 

반응형

Global 적으로 가장 많은 사용자를 갖고 있다는 Linux Mint 환경에서
무언가를 테스트해보기 위해서 작업을 하다가...

갑작스레 최신 Git을 설치해보고 싶어서 진행을 해봤다.

 


1. 필수 패키지 설치
   - Linux Mint 라고 해도 결국은 Debian 기반의 Ubuntu 친구들이다. 다를 것이 없다.


 

$ sudo apt-get install make libcurl4-gnutls-dev libexpat1-dev gettext zlib1g-dev libssl-dev asciidoc xmlto autoconf

 

 

2. 다운로드

$ cd /srv/install/git

$ wget http://www.kernel.org/pub/software/scm/git/git-2.1.2.tar.gz
$ tar zxvf git-2.1.2.tar.gz
$ cd git-2.1.2/


3. 빌드

$ make configure
$ ./configure --prefix=/usr/local
$ make all doc
$ sudo make install install-doc install-html

   - 설치가 잘 되었는지 확인을 해보기 위해서 버전 확인을 해보자.

$ git --version



GIT 자동완성을 지원하기 위해서는...

   - https://www.whatwant.com/entry/Git-명령어-자동-완성-기능-Source-설치-時

 


우리 모두 Git으로 행복한 형상관리를...



반응형

+ Recent posts