젠킨스 CI에서 레일즈+Postgres 테스트하기


젠킨스는 오픈소스 지속적 통합관리(Continuous Integration) 도구로 자바기반이다.

소스를 git이나 svn 같은 형상관리(CM : configuration management) 서버에 올리면, 그때마다 자동으로 테스트도 하고, 빌드도하고, 작업이 잘 끝났다고 알림도 주는 도구다.

자바기반이기 때문에 다른 언어로 개발된 애플리케이션을 젠킨스에서 테스트 하려면 따로 환경 설정이 필요하다. 이번엔 루비 온 레일즈로 만들어진 애플리케이션 테스트를위해 환경을 설정해 보았다.

레일즈 테스트용 젠킨스 도커 설정은 https://github.com/dorajistyle/jenkins-rails-postgres-docker 에서 볼 수 있다.

우선 아래 명령어로 소스를 다운 받는다.

git clone https://github.com/dorajistyle/jenkins-rails-postgres-docker.git


그리고 아래 명렁어로 도커 컨테이너를 빌드하면 젠킨스가 실행된다. docker-compose.yml에 나와있듯이 docker compose를 이용해서 postgres와 redis를 jenkins와 함께 실행하도록 하였다.

docker-compose up


젠킨스에서 레일즈를 테스트하기 위한 순서는 다음과 같다.

  1. 터미널에서 admin암호를 복사해서 젠킨스에 붙여 넣는다.
  2. 유저 정보를 입력해서 젠킨스를 시작한다.
  3. Multi-configuration 프로젝트를 만든다.
  4. Source Code Management 에서 git를 선택한다.
  5. 아래 url을 Repository URL 필드에 붙여넣는다.
    https://github.com/dorajistyle/rails-postgres-sample-for-jenkins

    만약 오픈소스가 아닌 프로젝트를 테스트 하려면, Credential을 추가해 줘야 한다.
    Add를 눌러 Username and password방식을 선택하고, username에는 github ID를 넣고 password에는 https://github.com/settings/tokens에서 생성한 토큰을 넣으면 된다.
  6. Build Environment에서 rbenv build wrapper체크박스를 선택한다.
    The Ruby version에는 2.3.1을 넣고,
    Preinstall gem list에는 bundler,rake,execjs를 넣는다.
  7. Add build step 샐랙트박스에서 Execute shell를 선택한다.
    Command필드에 아래 명령어를 붙여 넣는다.
    bash jenkins-test.sh
  8. 만약 빌드가 될 때 마다 슬랙으로 알림을 주고 싶다면, 플러그인을 설정해줘야 한다.
    우선 github 프로젝트의 설정에 젠킨스 플러그인을 추가해준다.
    Settings--> Webhooks&Services-->Service--> Add Services--> Choose "Jenkins (GitHub plugin)"
    에서 추가하고 아래 주소를 넣어준다.
    http:///github-webhook/
    https://.slack.com/apps/A0F7VRFKN-jenkins-ci 에서 Jenkins CI 앱 설정을 해준다.
    Post-build Actions의 Add post-build action 선택상자에서 Slack Notifications를 선택하고 환경 정보를 넣어준다.
    토큰은 슬랙 앱 설정에 나온 토큰을 넣어주면 된다.
  9. 설정을 저장하고 프로젝트의 사이드메뉴에서 Build Now를 클릭하여 테스트한다.

Docker compose로 띄운 
젠킨스에서 레일즈 테스트가 잘 돈다.

* rails 설정의 database.yml에는 docker-compose로 설정한 컨테이너 이름(예제 : dorajistyle-postgres)을 쓰고,
config.yml의 redis설정에도 마찬가지로 컨테이너 이름(예제 : dorajistyle-redis)를 써야 한다.


* git fetch 타임아웃 발생시 해결
Source Code Management > Git > Additional Behaviors > Advanced checkout behaviors / Advanced clone behaviors > Timeout (in minutes)



by


Tags : , , , , , , , ,

  • 재미있게 읽으셨나요?
    광고를 클릭해주시면,
    블로그 운영에 큰 도움이 됩니다!

Multi-container 도커 애플리케이션 쉽게 쓰기. Docker Compose


Docker는 참으로 편리한 도구다. Dockerfile만 한번 잘 작성해 두면, 두고두고 잘 쓸 수 있다. 그러나 한 가지 아쉬운 점이 있다면, 복잡한 서비스는 Dockerfile이 지나치게 길어진다는 것이다. 데이터베이스와 캐시, 애플리케이션 설정을 한데 모아두면 오류가 났을 때 무엇이 문제인지 찾기도 어렵다.
그래서 각각의 설정을 따로 만들어서 실행 시에 --link 옵션으로 연결하기도 하지만, 귀찮은 일이다.
Docker compose는 그런 귀찮음을 줄여준다. 아래 docker compose 설정 파일을 보자.


docker-compose.yml
version: '2'
services:
postgres:
container_name: mypostgres
image: postgres
ports:
- "5432:5432"
redis:
container_name: myredis
image: redis
ports:
- "6379:6379"
webapp:
build: .
container_name: myapp
restart: always
ports:
- "80:8080"
depends_on:
- postgres
- redis


이렇게 설정 파일을 만들고,
docker-compose up
명령어만 실행하면 애플리케이션을 실행하기 전에 postgres와 redis를 띄우고 나서, webapp 컨테이너를 띄워준다.
webapp에서 해당 컨테이너에 접속하려면 host에 container_name을 넣어주면 된다.
예를 들어 postgres에 접속하려면 host에 mypostgres를 넣어주면 된다.
docker compose 덕분에 도커 컨테이너 관리의 신세계가 열렸다.

아마존 AWS의 EC2 Container service 에서도 docker compose 파일을 지원하기 때문에, 쉽게 배포할 수 있다.
다만 로컬 이미지를 지원하지 않으므로 Amazon EC2 Container Registry(ECR)에 이미지를 올려 사용해야 한다.
만약 배포해야하는 multi-container docker가 많다면 ECS를 고려해볼 만 하다.
하지만 ECS task를 실행하기 위해서는 인스턴스를 하나 올려야 하므로, 올려야 할 서비스가 많지 않다면 그냥 EC2 인스턴스 하나에서 docker-compose up 명령어를 사용해 띄우는 것이 경제적이다.
꼭 ECS를 사용하지 않더라도 오픈소스가 아닌 이미지 저장용으로 ECR은 쓸만하다.
따로 Docker registry를 위한 인스턴스를 띄우지 않아도 되고, 스토리지 요금과 데이터 전송 요금만 사용한 만큼 내면 되기 때문에 간편하다.


참고자료

https://docs.docker.com/compose/rails/
https://docs.docker.com/compose/compose-file/
https://docs.docker.com/compose/startup-order/

AWS ECS 관련

http://docs.aws.amazon.com/AmazonECS/latest/developerguide/launch_container_instance.html
https://aws.amazon.com/ko/ecr/
http://docs.aws.amazon.com/AmazonECS/latest/developerguide/ECS_CLI_installation.html
http://docs.aws.amazon.com/AmazonECS/latest/developerguide/ECS_CLI_Configuration.html
https://github.com/aws/amazon-ecs-cli
https://aws.amazon.com/ko/ecr/pricing/?nc1=h_ls



by


Tags : , , , , , , , , ,

  • 재미있게 읽으셨나요?
    광고를 클릭해주시면,
    블로그 운영에 큰 도움이 됩니다!

이제는 재무자본뿐 아니라 지적자본이 필요하다. 지적자본론


원래 책을 많이 읽는 편은 아니지만, 근일 년간은 책을 거의 들여다보지 않았다.
대신 드라마나 영화, 게임 등 다른 콘텐츠의 소비가 늘었다. 이런 텍스트가 전부인 책보다 소비하기가 쉽다.
대신에 콘텐츠를 소비하면서 사유하는 시간은 줄어들었다. 책은 읽으면서 이미지를 떠올리고 어떤 질문에 자문하고 생각하는 시간이 많지만, 다른 콘텐츠는 책에 반해 그런 시간이 상대적으로 덜하다.
지적자본론이란 이 책은 도서관에 갔다가 새로 들어온 코너에서 우연히 집어 들었다.
책이 작고 얇아서 유난히도 읽기 싫었던 요즘 가벼운 마음으로 읽기 좋을 것 같아서다.
에어컨 시원하게 나오는 도서관 열람실에서 책을 읽는 것은 무더위를 피하는 좋은 방법이기도 하니 말이다.
지적자본론을 읽는 것은 컬쳐 컨비니언스 클럽(Culture Convenience Club)이라는 회사가 해온 고민과 결과를 들어볼 즐거운 기회였다. 나도 스타트업에서 서비스를 만들어가며 '이게 과연 고객에게 어떤 의미인가?'에 대해 많은 고민을 하므로 몰입이 더 잘 되었다.

마스다 무네아키 개인의 생각을 듣는 것도 재미있었다.
약속, 감사, 자유, 부산물, 효율, 행복 등에 대한 생각을 풀어놓는데 다른 사람과 이런 이야기를 깊이 있게 나눌 기회가 평소에 많지 않다.
심지어 얼마 전 지인들과 만난 자리에서 마신 술 이름이 '나 별일 없이 산다'였다. '요즘 어떻게 지내?' 등의 안부로 시작해서 이런저런 사는 이야기를 나누다 헤어지는 게 보통이다. 물론 그 속에는 각자 삶의 철학이나 방향이 담겨있긴 하지만 말이다.

행복이 목적이라고 하지만 그 행복이 무엇인지에 관해 지속해서 자문하고 고민하는 것이 매우 어렵다는 저자의 말에 동의한다.
꼭 행복이 아니라 자신의 인생에 끊임없이 물음을 던져야 답을 얻는다.


지적자본론 책갈피 - 책갈피


일을 하는 근본적인 이유는 행복해지기 위해서일 것이다. 행복해지려면 어느 정도 경제적 기반이 필요하다고 생각하기 때문에 일을 해서 돈을 벌려고 노력한다. 이 경우, 행복이 목적이고 금전은 수단이다. 하지만 시간이 지나면서 적잖은 사람들이 돈을 버는 것을 목적으로 착각해 버린다. 그리고 그 목적에 사로잡혀 피폐해지고 행복에서 점차 멀어진다.

사람들이 수단과 목적을 착각하는 이유는 그쪽이 편하기 때문이다. 행복이 목적이라고 하지만 그 행복이 무엇인지에 관해 지속적으로 자문하고 고민하는 것은 매우 어렵고 힘든 일이다. 그래서 무의식중에 간단히 그 크기를 측정할 수 있는 금전 쪽으로 목적을 바꾸어 버리는 것이다.

상품은 두 가지 요소로 구성되어 있다. 하나는 기능, 또 하나는 디자인이다. 어떤 상품이든 마찬가지다. 시험 삼아 유리잔을 예로 들어 보자. 액체를 담는 것이 기능이고, 손잡이가 없는 유리 제품이라는 것이 디자인이다. 약간 철학적인 이야기이지만 아리스토텔레스도 이와 비슷한 말을 했다. 고대 그리스 철학자 아리스토텔레스는 어떤 물건에 성질을 부여하는 것이 '형상'이고 그 물건의 소재는 '질료'인데 이 둘은 분리될 수 없다고 말했다. 실제로, 현대 사회의 상품도 그 성질을 결정하는 기능과 외관을 구축하는 디자인은 불가분의 관계에 놓여 있으며 그중 어느 한쪽이 결여되어도 상품으로서 존재할 수 없다. 그런데도 '디자인은 부가가치'라고 주장한다면, 물건의 이런 성립 관계에 관해 진지하게 생각해본 적이 없는 사람이다.

아무리 세련된 디자인을 지닌 유리잔이라고 해도 결국 '액체를 담든ㄴ다.'라는 매우 단순한 기능을 지닌 물건이듯, 기획에 관한 이런 질문과 해답 역시 본질적으로는 매우 단순하다. 기획의 가치란 '그 기획이 고객 가치를 높일 수 있는가?'에 달려 있기 때문이다.

지금까지 기업을 성립시키는 기반은 재무자본이었다. 퍼스트 스테이지나 세컨드스테이지에서는 '자본'이 당연히 중요하다. 충분한 상품과 플랫폼을 만들려면 '자본'이 필요하기 때문이다. 그런데 소비 사회가 변하면 기업의 기반도 바뀌지 않을 수 없다. 아무리 돈이 많아도 그것만으로는 '제안'을 창출해 낼 수 없기 때문이다. 그렇다. 앞으로 필요한 것은 '지적자본'이다. 지적자본이 얼마나 축적되어 있는가, 하는 것이 그 회사의 사활을 결정한다.

'만남'은 로맨틱한 말이다. 우연에 의해 좌우되는 것이기 때문이다. 단, 그런 우연이나 행운에 따라 이루어지는 것이라는 전제하에 한 가지 덧붙일 수 있는 것이 있다면, 그런 사람들(고도의 접객 담당자들)은 보수나 대우리는 외적 조건만으로는 움직이지 않는다는 사실이다.
물론, 외적 조건은 당연히 제대로 갖춰져 있어야 하지만 그것은 전제에 지나지 않는다. 그 전제 위에 그들이 '재미있을것 같다.'라고 느낄 수 있는, 구심력을 갖춘 이념이 존재해야 한다는 점이 열쇠다.

마침내 현실 세계가 인터넷에 대해 우위에 설 수 있는 여지를 아직 확실히 지니고 있다는 사실을 발견할 수 있었다. 예를 들면, 즉시성이다. 현재 주문한 상품을 당일 배송하는 서비스가 확대되고 있기는 하지만 인터넷의 경우, 클릭한 상품을 그 자리에서 바로 입수할 수는 없기 때문에 아무래도 대기 시간이 발생한다. 가전제품을 인터넷을 통해 구입하는 사람은 다수 있지만, 지금 당장 조리하고 싶은 신선한 식품을 그때마다 주문하는 사람은 많지 않다. 즉시 입수하지 못할 경우 가치가 줄어드는 상품은 인터넷에는 적합하지 않은 것이다.
또 하나는 직접성이다.
이것을 설명하기 위해 다시 도서관을 예로 들어 보겠다.
우리는 다케오 시립 도서관의 지정 관리자가 되었을 때, 장서의 진열 방법을 이전과는 완전히 다르게 변경하였다. 18만 권에 이르는 서적을 거의 모두 개가식으로 만든 것이다.
도서관의 장서 관리 방식에는 개가식과 폐가식 두 종류가 있다. 폐가식인 경우, 장서는 일반 이용객이 들어갈 수 없는 서고 않에 진열되어 있어 대출 희망자가 의뢰를 하면 사서가 해당 서적을 서고에서 꺼내 온다. 거기에 비해 개가식은 일반 이용객도 자유롭게 서적을 꺼낼 수 있도록 공개 서가에 장서를 진열한다. 리뉴얼 이전까지 다케오 시립 도서관의 장서중 약 절반 정도가 폐까식이었는데, 이제 개가식으로는 바뀌었다.
그 이유는 막대한 서적을 직접 마주했을 때에 느껴지는 순수한 감동을 소중하게 전하고 싶었기 때문이다. 진짜로 새로운 다케오 시립 도서관을 처음 방문한 사람들은 예외 없이 "우와!"라거나 "세상에!" 하고 감탄사를 내뱉는다. 정면의 드넓은 벽면을 가득 메운 막대한 양의 서적에 압도당하기 때문이다. 즉, 서적의 양이 직접, 방문객의 피부 감각에 호소하는 것이다.
폐가식 도서관에서는 이용객이 검색을 통해 해당 도서를 찾아 요청하면, 관리자가 일반인은 드나들 수 없는 서가로 가서 꺼내 온다. 인터넷상의 가상 매장과 비슷하지 않은가. 한편 개가식은 이용객이 직접 서적을 만져 볼 수 있는 공간에 장서가 진열되어 있기 때문에 그곳에서 해당 서적을 찾거나, 원하는 책은 아니지만 흥미를끄는 비슷한 서적을 발견할 수 있다. 이쪽은 물론 현실 세계의 매장에 대응한다. 이렇게 생각해 보면 직접성만큼은 현실 세계가 인터넷에 대해 우위를 점한다고 이해할 수 있을 것이다.

사실은 '꿈만이 실현되기 때문'이다. 누군가가 꿈꾸었던 것이 현실 세계에 나타나는 것, 그것이 이노베이션이다. 어느 누구의 꿈에도 나타난 적이 없는 것은 절대로 실현될 수 없다.

단순히, 하고 싶지 않은 일을 하지 않는 것은 자유가 아니다. 해야 할 일을 한다는 것이 자유다. 하지 않으면 안 된다는 이성의 목소리를 따르는 자유는 인간에게만 주어진 것이다. 그리고 비지니스 역시 인간만이 할 수 있는 것이다.

효율과 행복은 다르다.
효율은 확실히 편리하고, 편리는 대부분의 경우 쾌적함을 이끌어 낸다. 단, 쾌적함과 행복은 등가가 아니다. 자동차가 다닐 수 없는 숲 속의 산책로를 지나가야 한다면 효율성은 떨어질 수밖에 없다. 그러나 그곳을 걸을 때 느낄 수 있는 행복감은 결코 효율성으로 환원되지 않는다. 그렇다, 어쩌면 효율과 행복은 서로 반대 방향을 향하고 있는 것이 아닐까.

지적자본이 대차대조표에 실릴 수 없는 것과 마찬가지로 이런 상쾌함과 고양감은 숫자로 측정할 수 없다. 수량화할 수 없는 감각이야말로 행복과 가까운 것이 아닐까.

약속을 하는 것은 간단하지만 그것을 지키기는 어렵다. 그 어려운 일을 해내기 위해서는 감사하는 마음이 필요하다. 그것 없이 약속을 지킬 수 있을 정도로 의지가 강한 사람은 드물다.
어딘가 '자유'와 '사명'의 관계와 비슷하지 않은가. 자유를 입에 담기는 간단하지만 지속적으로 자유를 유지하기란 매우 어려운 일이다. 그것을 관철하려면 사명감이 필요하다.
자유. 좋아하는 사람과 함께 좋아하는 일을 할 수 있는 자유. 그것을 얻으려면 신용이 필요하다. 약속을 지키고 감사를 잊지 않는 인간으로서 신용을 얻어야, 그런 사람이 되기 위해 지속적으로 노력을 기울여야, 인간은 비로서 자유를 손에 넣을 수 있는 자격을 얻는다.



by


Tags : , , , , , ,

  • 재미있게 읽으셨나요?
    광고를 클릭해주시면,
    블로그 운영에 큰 도움이 됩니다!

홍쌍리 매실마을 매화 축제


지금은 아주 무더운 여름이라 가만히 앉아있어도 땀이 주룩주룩 흐르고 푹푹 찌지만,
올봄에는 날씨가 참 좋았다.

이 글은 올봄에 다녀온 홍쌍리 매실 마을에 대한 이야기다.
작년 봄에 자전거를 타고 섬진강 종주를 하면서 이곳에 언젠가 다시 한 번 와보고 싶다는 생각을 했었다.
'차가 쌩쌩 달리는 도로가 이리 아름다울진대 네 바퀴 짐승은 오르지 못하는 곳은 얼마나 멋들어지겠는가?'

홍쌍리 매실마을 매화축제 apricot blossom festival-'풍경'

홍쌍리 매실마을 매화축제 apricot blossom festival-'백매화'

홍쌍리 매실마을 매화축제 apricot blossom festival-'홍매화'

과연 그랬다.
홍쌍리 매실 마을엔 매화가 만발했다.
흐드러지게 피어있는 백매화들 사이에 홍매화가 군데군데 모습을 비춘다.

홍쌍리 매실마을 매화축제 apricot blossom festival-'매실막걸리와 파전'

천천히 걸으며 매화를 구경하고, 장터에 들러 파전에 매실 막걸리를 한 잔 걸친다.

홍쌍리 매실마을 매화축제 apricot blossom festival-'풍경'

홍쌍리 매실마을 매화축제 apricot blossom festival-'보호색'

금강산도 식후경이라는데, 이 매화는 밥을 먹기 전이나 후나 항상 아름답다.
도시에서 무디게 살아서 그런지 가끔 이렇게 나들이를 다녀오면 자연의 경이로움에 쉬이 감동하게 된다.

홍쌍리 매실 마을.
거리가 멀어서 자주는 못 가겠지만, 오 년이나 십 년에 한 번쯤은 이 마을에 들러 매화길을 거닐고 싶다.



by


Tags : , , , , , , ,

  • 재미있게 읽으셨나요?
    광고를 클릭해주시면,
    블로그 운영에 큰 도움이 됩니다!

국회의사당 근처 브런치 식당. 카페 마마스 여의도점


카페 마마스 여의도점(cafe mamas)-'입구'

국회 의사당역에서 내려 국회의사당을 가운데 끼고 천천히 걷는다.
버드나무 군락지도 보이고, 봄에는 윤중로 벚꽃길에 꽃이 만발한다.
적당히 걸었으면 배가 고픈데, 이날 따라 빵이 당겼다.
햄버거는 싫고, 파니니가 먹고 싶은데 주변에 마땅한 곳이 안 보인다.
지도엔 브런치 카페가 몇 곳 나오지만, 국밥집만큼 장사가 안되었는지 죄다 문을 닫았다.
아마도 카페 마마스가 국회의사당 블록에서 유일하게 살아남은 브런치 카페인가 보다.
이날 따라 빵을 먹고 싶은 사람이 많았는지 자리가 가득 찼다.

카페 마마스 여의도점(cafe mamas)-'메뉴'

그래도 다행히 빈 테이블 하나는 남아있어서 자리를 잡고 메뉴를 골랐다.

카페 마마스 여의도점(cafe mamas)-'모짜렐라 토마토 파니니'

카페 마마스 여의도점(cafe mamas)-'리코타 치즈 샐러드'

모짜렐라 토마토 파니니와 리코타 치즈 샐러드 그리고 감자 수프
맛이 괜찮다.
국회의사당 근처에서 갑자기 브런치가 먹고 싶다면 카페 마마스는 옳다.
여긴 이런저런 브런치 맛집이 널려있는 동네가 아니기 때문이다.
카페 마마스 여의도점.
파니니에 굶주린 영혼의 배를 채워준다.

카페 마마스 여의도점 위치



by


Tags : , , , , , , ,

  • 재미있게 읽으셨나요?
    광고를 클릭해주시면,
    블로그 운영에 큰 도움이 됩니다!