인프라/Jenkins 2020. 3. 21. 20:11

 

이전 포스팅에 이어 Jenkins&GitHub을 이용한 CI 실습을 다루어볼 것이다. 이번 포스팅에서는 본격적으로 실습을 진행하기 전에 아주 간단한 echo를 찍어주는 pipeline 하나를 만들어 볼 것이다. 사실 이것을 설명하는 이유는 멀티브랜치 파이프라인에 대해 조금 이해해보기 위함이다.

 

1. Multibranch Pipeline 생성

사실 우리가 개발할때, 버전관리 시스템에서 브랜치를 하나만 사용하여 개발하지 않는다. 각 회사마다의 브랜치 전략이 있겠지만 가장 대중적인 브랜치 전략은 아래와 같다.

 

  • Feature branch
  • Integration branch
  • Master branch(production branch)

이렇게 여러개의 브랜치를 가지고 개발을 진행하고 이러한 멀티 브랜치 전략에 대해 Jenkins를 이용하여 CI를 구현할때는 Multibranch Pipeline을 이용한다. 자세한 브랜치 전략은 구글링해서 참고하자 ㅎㅎ.

 

새로운 Item 메뉴를 클릭하면 다음과 같은 페이지가 보일 것이다.

 

 

item 이름을 넣고 Multibranch Pipeline을 생성해준다. 하나 설명하면 Multibranch Pipeline은 직접 스크립트를 Jenkins에서 작성하지 않고 소스코드가 있는 Github project root에 Jenkinsfile로 정의된다. Jenkinsfile은 쉽게 말하면 파이프라인 스크립트가 정의된 파일로 보면 된다.

 

Branch Sources 탭을 클릭하여 필요한 정보를 기입할 것이다. 지금은 자세한 설명보다는 파이프라인이 동작하는 것을 집중적으로 볼 것이기 때문에 정말 필요한 정보만 기입한다.

 

Repository HTTPS URL에 생성한 GitHub 레포지토리 주소를 기입한다. Discover branchesStrategyAll branches로 바꿔준다. Add 버튼을 클릭하고 Filter by name (with wildcards)를 추가한다. 그리고 Includemaster develop을 입력한다. 여기까지 작성하고 save해준다.

 

다음으로 간단하게 springboot project를 생성하고 해당 프로젝트 root에 Jenkinsfile을 생성해준다. 소스코드는 아래 깃헙 정보를 참고하자

 

 

yoonyeoseong/jenkins_sample

Contribute to yoonyeoseong/jenkins_sample development by creating an account on GitHub.

github.com

 

2. Jenkinsfile 작성

간단하게 Jenkinsfile을 작성해보자. 샘플은 위 깃헙에 있으니 내려받아도 무방하다.

 

pipeline {
    agent none

    stages {
        stage('example build') {
            steps {
                echo 'jenkins sample build ! ${AUTHOR}'
            }
        }
    }
    post {
        always {
            echo 'post process !'
        }
    }
}

 

여기까지 작성한 후 master branch를 기준으로 develop branch를 하나 딴 후에 간단히 수정 후 커밋&푸시 해보자 ! 우리는 이전 포스팅에서 "GitHub의 master와 develop 브랜치의 PR, push를 인식시킨다." 라는 설정을 넣었기 때문에 Jenkins pipeline이 돌기를 기대해야한다. 과연 파이프라인이 작동하였을까?

 

오?! 뭔가 돌았다?(필자는 테스트로 한번 더 돌려서 2개가 보인다.) #1을 클릭한 후에 정말 잘 돌았는지 Console Output을 보자 !

 

 

오호 우리가 정의한 파이프라인이 작동했다 ! 정말 신기방기하다. 정말 간단한 것이지만 여기까지 진행했다면 Jenkins&GitHub을 이용한 CI의 느낌을 어느정도 느꼈을 것이다. 그리고 조금더 감각있는 사람은 앞으로 어떠한 실습을 진행할지 예상도 될것이다. 여기까지 간단하게 멀티브랜치 파이프라인 실습을 마친다. 다음 포스팅부터는 본격적으로 실무적인 레벨의 실습을 다루어본다.

 

3. 지금까지 다룬것

 

  1. CentOS 환경에서 Docker로 Jenkins 설치
  2. Jenkins와 GitHub 연동
  3. develop branch로 수정한 후 커밋&푸시를 통해 간단한 멀티브랜치 파이프라인 동작확인
posted by 여성게
:
Tools/Git&GitHub 2019. 10. 15. 17:34

아래 명령어는 특정 브랜치만 clone하는 방법이다.

 

git clone -b {branch_name} --single-branch {git_repository_host}

 

 

posted by 여성게
:
Tools/Git&GitHub 2019. 2. 12. 13:48

GitHub - Git 사용법 2 (branch, checkout, reset 등)



이전 포스팅에서는 간단한 Git 사용법에 대하여 다루어봤습니다. 이번에는 조금 더 나아가서 branch, tag, 잘못 반영된 작업을 되돌리는 작업 등 조금 더 진화된 예제를 다루어보려고합니다. 혹시 이전 포스팅을 보시지 못하셨다면 이전 포스팅을 참고하시고 오시면 좋을 듯 싶습니다. 혹시라도 대부분의 기본 명령어들이 숙지 되어있으시다면 굳이 보시지 않으셔도 됩니다.


▶︎▶︎▶︎GitHub - 간단한 Git사용법(로컬 레포지토리,원격 레포지토리)









로컬 저장소는 git이 관리하는 세그루의 나무로 구성되어 있습니다.

첫번째 나무인 작업 디렉토리(Working Directory)는 이전 포스팅에서 생성한 git 위한 로컬디렉토리입니다.

두번째 Index는 staging 역할을 합니다.("add 명령어로 파일을 관리하에 추가")

마지막 세번째 HEAD는 commit된 스냅샷, 즉 최종 확정본을 나타냅니다.




Branch 만들기 (일명 가지치기)

master라는 최종본의 형상이 있고, 무엇인가를 변경해야하는 작업이 생겨났습니다.

만약 master branch에 직접 수정을 하면? 큰일 날 수도 있겠죠.... 그렇기 때문에

새로운 Branch를 하나 따서 원하는 작업을 진행 할 수 있게 됩니다.

이제 새로운 작업을 새로운 Branch에서 진행하고 개발이 완료된다면

master 가지로 돌아와 병합을 하면 됩니다.










"git checkout -b yeoseong_branch" 라는 명령어로 새로운 Branch 하나를 생성함과 동시에
그 Branch로 스위칭 해줍니다.
"git status" 명령으로 현재 어떠한 Branch에 있는지 확인할 수 있습니다.
만약 다시 Master Branch로 돌아가고 싶다면 "git checkout master"로 돌아가시면 됩니다.
다른 Branch 역시 동일합니다.

만약 Branch를 삭제하고 싶다면 "git branch -d yeoseong_branch"로 삭제해줍니다.







이제 작업을 진행하기 위하여 수정할 소스를 다른 Branch에서 pull 해옵니다.
"git pull origin master"






새로운 파일도 생성했습니다.
이전 포스팅과 똑같은 과정입니다. "git add yeoseong_yoon.txt" 로 
git이 관리할 수 있는 파일로 만들어주고 commit 하여 HEAD에 최종본을
반영합니다.





이제는 변경하려고 pull 했던 파일을 수정합니다.

"add" 하지않은 파일은 "git status" 명령에 수정되었으니 

"add" 해라라는 상태를 보여줍니다.





만약 파일을 add 하지 않고 commit 한다면 이러한 예외문구를 만날 수 있을 겁니다.









파일을 모두 변경하고 commit까지 해놓은 상태입니다. 이제 commit된 모든 변경사항을

원격 레포지토리에 push합니다.




깃허브에 접속해보니 yeoseong_branch에 변경사항들이 모두 잘 적용이 되었습니다.




변경사항을 master Branch에 merge

이제는 변경사항이 모두 yeoseong_branch로 적용되었으니(개발완료) 

master branch에 병합하는 작업입니다.





현재 branch를 master로 스위치 해줍니다. 그리고 yeoseong_branch에 있는 변경내용과
master의 내용을 병합해줍니다.
"git merge yeoseong_branch" 명령어는 현재 Branch와 target Branch를
병합해라 라는 명령어입니다.







master에 추가된 파일과 변경된 파일이 잘 들어온것이 보입니다.
이제는 이것을 원격 레포지토리에 push 해줍니다!



와우... 깃허브에 master Branch를 보면 변경 사항이 잘 merge 된것을 볼 수 있습니다.!!!



로컬 레포지토리에서 잘못 반영되어 되돌리고싶을때(Checkout OR Reset,Fetch)



만약 commit하지 않았다면 "git checkout -- filename"으로 변경내용을 변경 전 상태(HEAD)로 되돌려줍니다.

다만, 이미 인덱스에 추가된 변경 내용과 새로 생성한 파일은 그대로 남습니다.

but add 하지않아서 index에 들어가지도 않았다면 완벽한 reset입니다.






만약 위와 같이 이미 인덱싱했고 commit까지 했다고 가정하면 



"git fetch origin" 명령어를 치고,

"git reset --hard orgin/master" 명령어로 리셋을 합니다. 그렇다면

결과를 보듯이 commit된 것이 없어졌습니다.



그렇다면 여기서

Pull & Fetch의 차이점이란 무엇인가?

Fetch : 중앙 저장소의 소스를 로컬 저장소로 가져온다!  그러나 현재 작업중인 소스들을 변경하는 Merge 작업을 하지는 않는다

즉, 변경된 소스는 버려지고 원격저장소의 소스로 업데이트가 된다.

Pull : 중앙 저장소의 소스를 로컬 저장소로 가져온다! 또한 현재 작업중인 소스들의 Merge 작업까지 통합하여 수행한다

변경된 소스 + 원격저장소 소스가 merge된다.


posted by 여성게
:
Tools/Git&GitHub 2019. 2. 12. 11:29

GitHub - 간단한 Git사용법(로컬 레포지토리,원격 레포지토리)



Git이란?

-깃(git)은 프로그램 등의 소스 코드 관리를 위한 분산 버전 관리 시스템입니다. 깃의 작업 폴더는 모두 기록하고 있어서 추적이 가능하고, 완전한 형태의 저장소입니다. 


Github란?

-git을 호스팅해주는 웹 서비스이며,  git 저장소 서버를 대신 유지 및 관리해주는 서비스입니다. 

오픈소스 프로젝트는 무료이며, private 프로젝트는 유료입니다. 다른 유저들과 함께 온라인으로 하나의 프로그램을 제작하는 것도 가능하여, 많은 오픈소스 프로그램들이 github을 통해서 전세계 유저들에 의해 제작되고 있습니다. 




Github를 왜 사용하는가?

-깃허브의 심장에서 작동되는 소프트웨어인 깃(Git: 재수없고 멍청한 놈, 자식)을 만든 유명한 소프트웨어 개발자 리누스 토발즈에 감사한다. 깃은 프로젝트의 어떤 부분도 겹쳐쓰지 않게 프로젝트의 변경을 관리하는 버전관리 소프트웨어이다.

왜 깃같은 것을 사용해야 하나? 당신과 동료가 동시에 같은 웹사이트에서 페이지를 업데이트하고 있다고 하자. 당신이 무언가를 변경하고 저장한 다음 웹사이트에 그것을 업로드한다. 지금까지는 좋았다. 문제는 동료가 동시에 같은 페이지에서 작업할 때이다. 누군가의 작업은 겹쳐쓰여질 것이고 지워질 것이다.

깃과 같은 버전관리 앱은 그런 일을 방지한다. 당신과 동료는 같은 페이지에 각자의 수정사항을 각각 업로드할 수 있고, 깃은 두 개의 복사본을 저장한다. 나중에, 당신들은 그대로 어떤 작업도 잃어버리지 않고 변경사항들을 병합할 수 있다. 깃은 이전에 만들어진 모든 변경사항의 “스냅샷”을 저장하기 때문에 이전 시점의 어떤 버전으로 되돌릴 수도 있다.

깃을 사용할 때 어려운 점은 90년대 해커와 같이 코드를 타이핑하는 명령어(커맨드 라인 - 맥 사용자라면 터미널)를 사용하여 접근해야하는 것이다. 이것은 요즘 컴퓨터 사용자에겐 까다로운 일일 수는 있다. 이제 깃허브를 들여다보자.

깃허브는 두 가지 방식으로 깃을 더 편리하게 해준다. 먼저, 깃허브 소트프웨어를 다운로드하면, 로컬에서 당신의 프로젝트를 관리할 수 있게하는 비주얼 인터페이스를 제공한다. 두번째는, Github.com에 계정을 생성하면 웹에서 프로젝트를 버전관리할 수 있으며, 평가측정 등의 소셜 네트워크 기능을 사용할 수 있다.

다른 깃허브 사용자의 프로젝트를 둘러볼 수 있고, 그것들을 변경하거나 배우기 위해 자신만의 복사본을 다운로드할 수도 있다. 다른 사용자도 당신의 공개 프로젝트에 대해 같은 걸 할 수 있으며 에러를 발견해서 해결책을 제안할 수도 있다. 어느 경우든, 깃이 모든 변경사항에 대한 “스냅샷”을 저장하기 때문에 어떤 데이타도 잃어버리지 않는다.

깃을 배우지 않고 깃허브를 사용할 수 있지만, 사용하는 것과 이해하는 것은 큰 자이점이 있다. 깃을 이해하기 전에도 깃허브를 사용할 수 있으며, 나도 진짜로 이해하는 것은 아니다. 이 튜토리얼에선, 커맨드 라인에서 깃을 사용하는 것을 배울 것이다.



지금 할 것은 무엇인가?

-현재 예제에서 하려고하는 작업은 간단한 Git 명령어를 숙지하고 결론적으로는 원격 레포지토리(Remote Repository)를 만들고 로컬 레포지토리(Local Repository)를 만들어 두개의 레포지토리를 연결하여 로컬 레포지토리에 파일 하나를 생성하여 원격 레포지토리로 보내는 것까지 진행 할 것이다.


▶︎▶︎▶︎깃허브 회원가입하기



위의 링크를 타고 들어가서 깃허브에 로그인 혹은 회원가입을 해줍니다.

가입 이후 원격 레포지토리를 생성해준다(Create New Repository)



윈도우에선 방금 설치한 Git Bash 앱으로, OS X에선 터미널로 시작한다. 



git의 기본정보를 입력해준다. user.name = "your name", user.email = "your email"

git config --list 명령을 통해 입력한 정보가 출력되는 것을 확인 할 수 있다.




다음은 로컬 레포지토리를 만든다.(원격 레포지토리와 연결될 본인 PC의 로컬 레포지토리)





로컬 레포지토리로 사용할 디렉토리를 생성해준다.





생성한 디렉토리에 git의 로컬 레포지토리로 사용하는 디렉토리라고 명령을 내려주는 것이다.





Readme.txt라는 파일을 하나 만들어준다. 그리고 해당 파일의 내용을 원하는데로 수정해준 후에

git status라는 명령으로 로컬 레포지토리의 상태를 확인한다.

"On branch master"란 아직 branch를 생성 혹은 branch off 하지 않았기 때문에

현재는 master branch상에 상주하고 있다는 뜻이다.

그리고 방금 생성한 Readme.txt가 git의 관리하에 존재하지 않는 다는 뜻으로 Untracked files 목록에 뜬다.





"git add Readme.txt"라는 명령으로 이제는 Readme.txt가 git의 관리하에 있는 파일로 되었다. 

그리고 "git commit -m "Add Readme.txt" 명령을 통해 지금까지의 변경사항을

commit 하고, commit message로 "Add Readme.txt"를 남겼다.

커밋 메시지는 현재형으로 작성하는 것이 좋다. 버전 관리는 현재 시점의 변경사항을

반영하는 것이기 때문에 항상 현재형으로 작성하는 것이 사상에 맞는 것 같다.

이제 "git status" 명령어를 치면 Readme.txt가 잘 추가 되어있을 것이다.(new File)


다음은 Remote Repository와 Local Repository를 연결할 것이다.




해당 명령으로 원격 레포지토리에 대한 정보를 입력해줄 수 있다.

"https://github.com/yourname/yourrepositoryname.git"

반드시 url에 ".git"을 붙여주어야한다.

혹시라도 나처럼 .git 안붙이고 잘못 연결한 사람이 있을 것같아서 orgin을 삭제하는 명령어를

예제로 해보았다.






"git remote rm origin"을 통해 현재 연결된 origin을 제거한다.





원격 레포지토리와 로컬 레포지토리가 잘 연결된 것을 볼 수 있다.




다음은 변경사항을 커밋했으니 원격 레포지토리에 push 할 차례이다.

위의 명령어로 원격 레포지토리에 변경사항을 merge할 수 있다.


혹시나 아래와 같은 메시지가 뜬다면 해당 레포지토리의 브랜치가 존재하지 않는 다는 뜻이다.(ex- git push origin branch-1, master branch는 기본으로 생성되는 브랜치이다.)


fatal: The current branch master has no upstream branch.

To push the current branch and set the remote as upstream, use


    git push --set-upstream origin master



"git push -u origin master" 명령을 통해 master branch가 없으면 생성하여 push하라는 명령어를 날려준다.






만약 이미 만들어 놓은 원격 레포지토리가 있고, 그곳에 소스들이 존재한다면 원격 레포지토리를

clone하여서 로컬 레포지토리에 동기화(내려받는다)를 한다.





아까 입력한 메시지와 파일 그리고 파일 내용으로 push가 된것을 확인할 수 있다.




Git의 주요 명령어


깃은 리눅스와 같은 큰 프로젝트를 염두에 두고 디자인되었기 때문에, 깃 명령어는 아주 많다. 그러나, 깃의 기본을 사용할 때에는 몇 개의 명령어만 알면된다. 모두 “git”이란 단어로 시작된다.

-git init: 깃 저장소를 초기화한다. 저장소나 디렉토리 안에서 이 명령을 실행하기 전까지는 그냥 일반 폴더이다. 이것을 입력한 후에야 추가적인 깃 명령어들을 줄 수 있다.

-git config: “configure”의 준말, 처음에 깃을 설정할 때 가장 유용하다.

-git help: 명령어를 잊어버렸다? 커맨드 라인에 이걸 타이핑하면 21개의 가장 많이 사용하는 깃 명령어들이 나타난다. 좀 더 자세하게 “git help init”이나 다른 용어를 타이핑하여 특정 깃 명령어를 사용하고 설정하는 법을 이해할 수도 있다.

-git status: 저장소 상태를 체크. 어떤 화일이 저장소 안에 있는지, 커밋이 필요한 변경사항이 있는지, 현재 저장소의 어떤 브랜치에서 작업하고 있는지 등을 볼 수 있다.

-git add: 이 명령이 저장소에 새 화일들을 추가하진 않는다. 대신, 깃이 새 화일들을 지켜보게 한다. 화일을 추가하면, 깃의 저장소 “스냅샷”에 포함된다.

-git commit: 깃의 가장 중요한 명령어. 어떤 변경사항이라도 만든 후, 저장소의 “스냅샷”을 찍기 위해 이것을 입력한다. 보통 “git commit -m “Message hear.” 형식으로 사용한다. -m은 명령어의 그 다음 부분을 메시지로 읽어야 한다는 것을 말한다.

-git branch: 여러 협업자와 작업하고 자신만의 변경을 원한다? 이 명령어는 새로운 브랜치를 만들고, 자신만의 변경사항과 화일 추가 등의 커밋 타임라인을 만든다. 당신의 제목이 명령어 다음에 온다. 새 브랜치를 “cats”로 부르고 싶으면, git branch cats를 타이핑한다.

-git checkout: 글자 그대로, 현재 위치하고 있지 않은 저장소를 “체크아웃”할 수 있다. 이것은 체크하길 원하는 저장소로 옮겨가게 해주는 탐색 명령이다. master 브랜치를 들여다 보고 싶으면, git checkout master를 사용할 수 있고, git checkout cats로 또 다른 브랜치를 들여다 볼 수 있다.

-git merge: 브랜치에서 작업을 끝내고, 모든 협업자가 볼 수 있는 master 브랜치로 병합할 수 있다. git merge cats는 “cats” 브랜치에서 만든 모든 변경사항을 master로 추가한다.

-git push: 로컬 컴퓨터에서 작업하고 당신의 커밋을 깃허브에서 온라인으로도 볼 수 있기를 원한다면, 이 명령어로 깃허브에 변경사항을 “push”한다.

-git pull: 로컬 컴퓨터에서 작업할 때, 작업하고 있는 저장소의 최신 버전을 원하면, 이 명령어로 깃허브로부터 변경사항을 다운로드한다(“pull”).

▶︎▶︎▶︎GitHub - Git 사용법 2 (branch, tag, checkout, reset 등)




posted by 여성게
: