Bitbucket 저장소와 Jenkins Webhook 연동하기

Jenkins의 소스코드 관리에서 Bitbucket 저장소와 연동하여 사용할 수가 있다. 그런데, Webhook을 걸면 브랜치를 가리지 않고 항상 실행된다.

필자는 저장소에서 Webhook을 걸 때마다 개발용 앱과 상용 앱을 모두 빌드하게 하고 싶지 않았다. pull request가 개발 브랜치로 머지될 때에는 테스트 서버에 붙는 테스트용 앱을 빌드하고, 상용 브랜치로 머지될 때에는 실 서버에 붙는 상용 앱을 빌드하고 싶었다. 하지만 기본으로 제공되는 Webhook을 사용하면, 둘을 나누어 실행할 수 없었다.

Jenkins Plugin 중에 Generic Webhook Trigger를 사용하면 이러한 문제를 해결할 수 있다.

우선은 Jenkins Plugin에 Generic Webhook Trigger를 설치한다. 설치 후 설정을 희망하는 프로젝트의 환경설정으로 간 후 Build trigger에 있는 Generic Webhook Trigger를 찾는다. 체크박스를 클릭하면 파라미터 설정 창이 열린다.

Post content parameters에 다음과 같이 적었다.

Variable Name: MERGED_BRANCH
Expression: $.pullrequest.destination.branch.name
Filter: 비워놓음

Variable Name은 Shell에서 사용할 변수명을 의미한다. Expression은 해당하는 변수에 어떤 값을 저장할 것인지 결정한다. Value filter는 Expression으로 얻은 값 중에 필터하고 싶은 것을 정규식으로 표현해 주면 된다.

Bitbucket에서 Webhook을 걸 때 POST로 보내는 메시지는 세팅 후 Webhook이 걸렸을 때 나가는 내용을 확인할 수 있다.

그리고, 젠킨스 설정의 Build 메뉴로 가서 Execute shell에서 $MERGED_BRANCH 변수를 사용하여 처리하면 된다. 필자는 다음과 같이 원하는 브랜치인 경우에만 앱을 빌드하도록 설정해 놓았다.

if [ “$MERGED_BRANCH” = “release”]
  then
    bash ./gradlew clean
    bash ./gradlew assembleProd
  else
    echo “release branch is not updated!”
fi

이제 릴리즈 브랜치가 병합되었을 때에만 릴리즈 앱이 빌드된다.

이를 토대로 하면 개발 브랜치가 병합되었을 때에만 빌드되게 하는 것도 가능하다.

오늘은 요기까지.

똑부 상사에 대한 오해

사람들이 상사와 부하의 조합에 대해, 혹은 어떤 상사가 좋은 상사라고 생각하는가에 대한 질문에 똑똑함/멍청함, 게으름/부지런함의 네 가지 형용사를 조합하여 4가지로 표현하곤 한다.

사람들은 대체로 똑똑하고 게으른 상사를 원하는 경우가 많았다. 일에 대한 전략과 전술에는 똑똑하기를 바라고 있으며, 부하 직원에 대한 감시나 일에 대한 간섭 등 부하직원의 자율성을 침해하는 행동의 측면에서 게으른 상사를 원하고 있었다.

똑부를 싫어하는 이유 중 하나는 너무 부지런하고 일을 벌리기 쉬워서 부하직원들의 업무가 과중해질 수 있다는 것이었다. 사실 너무 부지런해서 일을 벌리는 스타일은 사실 똑부가 아니고 멍부로 보는 게 더 적합할 것이다. 똑똑하다면 자신이 하고 싶은 일과 할 수 있는 일 사이에서 명확한 경계를 세우고 일을 계획하므로 과도하게 일을 추진하지 않을 것이다.

뭐 개인적으로는 똑부가 제일 낫다고 생각한다. 때때로 적확한 지적은 개인의 역량을 보완하는데에는 최소한 보탬이 되기 때문이다.

똑부든 똑게든 간에 사람들이 싫어하는 지점은 “자율성”이 침해되는 지점에 대한 지적이었다. 우리 말에 “평양감사도 제 싫으면 그만”이라는 말이 있다. 아무리 연봉을 많이 줘도 자율성이 침해당한다면 조직몰입도와 직무몰입의 수준이 낮아진 결과 이직율 증가나 조직 생산성의 저하로 이어지는 것은 필연적인 결과이다.

부하 직원의 자율성을 존중하고, 믿고 기다려주는 것은 사실 쉬운 일이 아니지만 쉬울 수도 있다. 조직의 상황에 따라 일에 치여서 빨리 일을 처리해야 하는 상황이라면 쉽지 않을 것이다. 하지만 심사숙고한다면, 지금 재촉하는 것이 장기적으로도 일을 빨리하는 길이 아닐 수도 있다는 지점은 고려할 필요가 있다. 현명한 선택은 항상 쉽지 않다. 자신이 감내해야 할 분량이 분명이 있기 때문이다. 어떤 선택을 할 것인지는 자신의 몫으로 남아있다.

데이터베이스 구현을 뒤로 미루는 일

엉클 밥은 소프트웨어 개발의 지혜 3절의 “급여 관리 사례 연구”에서 데이터베이스 구현을 뒤로 미루겠다고 하였다. 이를 통해, 요구사항을 더 분명히 알게 되며, 필요이상의 기반구조를 막음으로써 필요한 것만 데이터베이스로 구현할 수 있다고 하였다.

그래서 오늘부터 시작한 프로젝트는 데이터베이스로 구현하는 것을 미루고, 코드로 필수적인 부분들을 먼저 구현해 보았다.

그러다보니 자연스레 데이터베이스 설계에 공을 들이는 것보다도 사용자가 어떤 프로그램을 사용하게 될지를 생각하는데 더 많은 시간을 쓰게 되었다. 재미있는 건 저자의 이야기처럼 무엇이 필요한지, 고객의 요구가 무엇인지 더 분명해지고 있다는 것이다.

아직까지는 흥미로운 도전이다. 이후 결과도 본 글에 업데이트 하겠다.

파이썬으로 웹 크롤링 시작하기

HTML과 XML 파싱에 사용되는 python 패키지로 BeautifulSoup이 있다. 현재 버전은 4.4.0이다.

BeautifulSoup의 문서는 다음 한 페이지에 모두 설명되어 있다. 한 페이지의 양이 좀 길기는 하다. 한글문서가 있었던 것 같은데 지금은 링크가 깨져있다.

문서: https://www.crummy.com/software/BeautifulSoup/bs4/doc/

코드:

from bs4 import BeautifulSoup
html_string = '''
<html>
<head>
<title>나루의 HTML parsing</title>
</head>
<body>
</body>
</html>
'''
soup = BeautifulSoup(html_string, 'lxml')
title = soup.select("title")[0].get_text()
print(title)

결과:

나루의 HTML parsing

HTML 태그 중 title 태그의 값을 가져오는 코드를 간단히 구현하였다.

select method는 결과를 list type으로 가져온다. 그리고 get_text method는 태그 사이에 있는 텍스트 값을 문자열로 가져온다.

다음에는 실제로 웹 페이지의 정보를 가져오는 코드를 작성해 보자.

무엇이 필요한 지 아는 것

열심히 한다고 다 잘되는 게 아니다.

전략과 전술이 있어야 조금 더 발전하는 자리로 갈 수 있다.

때로는 도구를 사용할 줄 몰라서 더디게 갈 때도 있다. 그 때엔 도구의 사용을 장려하고 숙달되게 할 필요가 있다.

지금은 건강을 챙겨야 할 때, 집으로 칼같이 달려간다~*

DRY~*

오늘은
“Do not Repeat Yourself.”
이 말을 강렬하게 느끼는 하루…

이게 코드 얘기면 차라리 낫겠다.

답답해 죽갔다.

IntelliJ IDEA Competitive Discount

IntelliJ IDEA 경쟁적 할인 프로그램을 활용하면 구매가의 25%를 할인받을 수 있다.

미리 핵심부터 이야기하자면, 타 개발 도구 구매 내역을 증빙할 수 있는 자료를 제출하면, Jetbrains 담당자가 해당 제품 정가의 25% 할인된 가격으로 주문을 만들어준다. 국산 Software인  Editplus로도 할인 받을 수 있었다. 그 결과 저렴하게 intelliJ IDEA 개인 라이센스를 구매할 수 있었다.

저렴하게 할인 받을 수 있는 기회를 준 Jetbrains에 고맙게 생각하며, 구매과정을 친절하게 안내해준 Jetbrains 직원 Dominica에게 고마움을 표한다.

아래에는 과정과 절차를 기록해 두었다.

더 보기 “IntelliJ IDEA Competitive Discount”

블로깅 시작~*

워드프레스 설치해 보았다.

오랜만의 블로깅인데,

예전에 어딘가에 써 두었던 글들은 어딘가에 있겠지만 가져오긴 어렵공ㅠ

개발하면서 드는 고민들, 그리고 떠오르는 생각들 이것저것 함 써보려 한다.

기록하지 않으면 잊혀질 것이고 사라질 것이니까.

일단 오늘은 여기까지~*