jenkins에서 proxy 설정, update-center 작업을 수작업으로 일반적으로 작업한다. 

절차는 다음과 같다.


1. Use browser for metadata download 설정

Manage Jenkins -> Configure Global Security -> Plugin Manager -> Use browser for metadata download를  check on한다.


2. plugin 관리에서 Proxy 서버를 추가

http://jenkins장비:8080/pluginManager/advanced에서 proxy 설정 넣어야 한다.



이런 작업을 ansible로 자동화 할 수 있다. (1:1로 매핑하기 보다는 잘 동작하게)

- name: Configure Proxy
environment:
no_proxy: "localhost"
jenkins_script:
url: "http://localhost:8080"
script: "{{ lookup('template', 'proxy.groovy') }}"
validate_certs: False
timeout: 120

- name: Change Update-Center protocol
replace:
path: "{{ jenkins_home }}/hudson.model.UpdateCenter.xml"
regexp: 'https://updates.jenkins.io/update-center.json'
replace: 'http://updates.jenkins.io/update-center.json'



templates/proxy.groovy 파일

import jenkins.model.*

def instance = Jenkins.getInstance()

final String name = 'proxy.daumkakao.io'
final int port = 3128
final String noProxyHost = [
'localhost', '127.0.0.1', '127.0.0.0/8',
'...'
].join('\n')

final def proxyConfig = new hudson.ProxyConfiguration(
name, port, null, null, noProxyHost)

instance.proxy = proxyConfig
instance.save()


Posted by 김용환 '김용환'



Jenkins UI에서 플러그인 설치하려 할 때 다음 에러가 난다.

java.net.SocketTimeoutException: connect timed out


jenkins plugin 앤서블에서는 에러가 발생한다.

"details": "HTTP Error 403: Forbidden", 

"msg": "Cannot get CSRF"


이 이유는 바로 proxy 설정 때문에 발생하는 것이다.



Proxy 설정을 잘 주어 젠킨스 플러그인을 설치한다.  jenkins_plugin은 localhost:8080을 호출하기 때문에 no_proxy를 주어야 한다.


 - name: Install jenkins plugins.

  jenkins_plugin:

    owner: "{{default_user}}"

    group: "{{default_group}}"

    jenkins_home: "{{ jenkins_home }}"

    name: "{{ item }}"

    state: latest

  environment:

    no_proxy: "localhost"

    http_proxy: "{{proxy_env.http_proxy}}"

    https_proxy: "{{proxy_env.http_proxy}}"

  with_lines: cat "../../templates/jenkins/plugins/plugins.lst"



Posted by 김용환 '김용환'


맥에서 iterm2를 사용 중인데, 서버에 접근하면 한글 파일이 잘 보이지 않는다.


서버 설정은 잘 되어 있다.

$ env|grep LC

LC_ALL=ko_KR.utf8

$ env|grep LANG

LANG=ko_KR.utf8



한글 디렉토리와 파일은 ???로 나타난다.

jenkins를 실행하면 제대로 파일을 읽지 못한다.


SEVERE: Could not restore backup.

java.io.FileNotFoundException: /google/program/jenkins_backup/jobs/(?????????) ansible-common (No such file or directory)

at java.io.FileInputStream.open0(Native Method)

at java.io.FileInputStream.open(FileInputStream.java:195)


이유는 무척 단순했다.

최근 맥북을 받았는데. LC와 LANG을 설정이 안되어 있는데..


$ env | grep LC

$ env | grep LANG


iterm 기본 설정은 로컬 변수를 서버까지 가지고 가는 형태였다.(대박.)


따라서 맥북에 iterm2를 사용할 때는 반드시 Profiles/Terminal/Environment을 살펴보고.

Set locale variable automatically 설정은 check off해야 한다.





서버 설정이 아니라 내 기본 설정 이슈였다.

Posted by 김용환 '김용환'

scala cats 공부 자료.

scala 2019.06.18 20:53


스칼라의 Cats 라이브러리를 이해하는데 도움이 될만한 자료.


1. 엄익훈님의 Scala Night 발표 자료 

https://www.slideshare.net/ikhoon1/real-world-cats-93894867  


Real world cats from Ikhoon Eom


http://tech.kakao.com/2017/09/02/parallel-programming-and-applicative-in-scala/



2. 소프트웨어 미 자료

https://blog.softwaremill.com/9-tips-about-using-cats-in-scala-you-might-want-to-know-e1bafd365f88


3. medium 자료

https://medium.com/@abu_nadhr/scala-cats-library-for-dummies-part-1-8ec47af7a144

https://medium.com/@abu_nadhr/scala-cats-library-for-dummies-part-2-1f2fb31f804c

https://medium.com/@abu_nadhr/scala-cats-library-for-dummies-part-3-fd3b185088f0

https://medium.com/@abu_nadhr/scala-cats-library-for-dummies-part-4-b096f33cc153



4. scala with cats 자료

https://books.underscore.io/scala-with-cats/scala-with-cats.pdf



Posted by 김용환 '김용환'


git 프로젝트를 다운받을 때 github key를 사용해 다운로드 한다. 


앤서블을 사용하는 첫 번째 방법 - ~/.ssh/config 파일을 수정한다

Host github.com

  IdentityFile ~/.ssh/github_rsa


- name: Download config
git:
repo: git@github.com:uj/config.git
dest: "{{program_path}}/config"
force: yes
clone: yes



앤서블을 사용하는 두 번째 방법 - 직접 key 파일을 가르키게 한다.


- name: Download thin-backup source
git:
repo: git@github.com:uj/config.git
dest: "{{program_path}}/config"
force: yes
clone: yes
accept_hostkey: yes
key_file: /home/www/.ssh/github_rsa


Posted by 김용환 '김용환'


jenkins에서 아래와 같은 Exception이 발생했다.


sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

PKIX path building failed 




원인은 http 사이트에서 https 로 접속하려 할 때 자바에서 발생하는 에러이다. 이를 간단히 해결하려면


젠킨스 관리 -> Configure Global Security -> Plugin Manager -> Use browser for metadata download 를 체크 on한다.


앤서블을 사용해 자동화하는 경우라면 다음 코드를 실행한다. https가 아닌 http로 변경하는 것이다.


- name: Change Update-Center protocol - "{{ jenkins_home }}/hudson.model.UpdateCenter.xml"

  replace:

    path: "{{ jenkins_home }}/hudson.model.UpdateCenter.xml"

    regexp: 'https://updates.jenkins.io/update-center.json'

    replace: 'http://updates.jenkins.io/update-center.json'


Posted by 김용환 '김용환'


DNS는 하나 이상의 레코드를 호스트 이름과 연결해 동작한다. 가장 일반적으로 사용되는 DNS 레코드 타입은 A 레코드와 CNAME 레코드다. A 레코드는 호스트 이름을 IP 주소에 연결하는 것이고, CNAME 레코드는 호스트 이름을 다른 호스트 이름으로 앨리어스로 지정한 것을 말한다.

DNS 프로토콜은 TXT 레코드라는 호스트 이름과 연결할 수 있는 다른 타입의 레코드를 지원한다. TXT 레코드는 호스트 이름에 연결할 수 있는 임의의 문자열이다. TXT 레코드를 호스트 이름과 연결하면 누구나 DNS 클라이언트를 사용해 텍스트를 검색할 수 있다.


예를 들어 github.com 도메인을 소유하고 있기에 해당 도메인의 모든 호스트 이름과 관련된 TXT 레코드를 생성할 수 있다. TXT 레코드를 이 책의 ISBN 번호가 포함된 github.com 호스트 이름과 연결했다. 

dig 커맨드라인 툴을 사용해 TXT 레코드를 조회할 수 있다.

$ dig +short github.com TXT

"MS=ms44452932"

"docusign=087098e3-3d46-47b7-9b4e-8a23028154cd"

"v=spf1 ip4:192.30.252.0/22 ip4:208.74.204.0/22 ip4:46.19.168.0/23 include:_spf.google.com include:esp.github.com include:_spf.createsend.com include:servers.mcsv.net ~all"

"MS=6BF03E6AF5CB689E315FB6199603BABF2C88D805"

"MS=ms58704441"



dnstxt 조회는 DNS 서버에 호스트와 관련된 TXT 레코드를 쿼리한다. 플레이북에서 이와 같은 태스크를 생성한다.


- name: look up TXT record

debug: msg="{{ lookup('dnstxt', 'github.com') }}"






Posted by 김용환 '김용환'

jenkins 장비의 플러그인 목록을 형상관리 안하는 경우가 많다.. 플러그인 설정이 있어도 플러그인이 없으면 복구 할 수 없다. 


jenkins 장비의 플러그인 목록을 보려면 http://장비명:8080/script에 다음 커맨드를 실행한다.


Jenkins.instance.pluginManager.plugins.each{

  plugin -> 

    println ("${plugin.getShortName()}: ${plugin.getVersion()}")

}


결과는 다음과 같다.


Git plugin (git): 3.9.1
JavaScript GUI Lib: ACE Editor bundle plugin (ace-editor): 1.1
SCM Sync Configuration Plugin (scm-sync-configuration): 0.0.10
Pipeline: Job (workflow-job): 2.24

..


jenkins master를 제대로 복구할 때, 

플러그인 이름과 버전, jenkins 버전.. 이 매우 중요하다.

Posted by 김용환 '김용환'



centOS 리눅스에서 pip를 설치할 때 단순하게 다음과 같이 실행하면 된다고 하나..



$  yum update


$ yum install epel-release


$ sudo yum install python-pip 




내 환경에서는 계속 에러가 난다.


Cannot retrieve metalink for repository: epel/x86_64. Please verify its path and try again




그래서 epel과 관련된 인증 이슈인데.. 다음과 같이 실행하면 잘 동작한다.


$ yum clean all


$ yum --disablerepo=“epel” update nss


$ yum remove epel-release --disablerepo=epel


$ yum -y upgrade ca-certificates


$ yum -y upgrade ca-certificates --disablerepo=epel


이제 가상환경과 패키지 설치를 동시에 지원하는 pipenv를 설치한다.


$ sudo -H pip install pipenv --proxy="proxy.google.io:3128"





pip 중요 참고 내용..

sudo pip install pipenv 을 실행할 때 다음과 같은 에러가 발생할 수 있다.


Starting new HTTPS connection (1): pypi.python.org

Incremented Retry for (url='/simple/pip/'): Retry(total=4, connect=None, read=None, redirect=None)

Retrying (Retry(total=4, connect=None, read=None, redirect=None)) after connection broken by 'NewConnectionError('<pip._vendor.requests.packages.urllib3.connection.VerifiedHTTPSConnection object at 0x7fe8adb61310>: Failed to establish a new connection: [Errno 101] Network is unreachable',)': /simple/pip/


이럴 때는 환경변수와 proxy 환경 변수에 영향을 받을 수 있으니..아래와 같이 사용하길 바란다.


$ sudo -H pip install pipenv --proxy="proxy.google.io:3128"

Posted by 김용환 '김용환'

[hadoop] Exit Code 154

hadoop 2019.06.04 17:20

 

아래와 같은 클라이언트에서 hadoop에러가 발생했다.

org.apache.http.conn.HttpHostConnectException: Connection to http://google-hadoop-dn4.dakao.io:40060 refused

 

hadoop ui에 다음과 같이 154 에러가 발생했다. 

Application application_1544089295328_663490 failed 1 times due to AM Container for appattempt_1544089295328_663490_000001 exited with exitCode: 154

 

이 이유는 Job 실행 중간에 노드가 내려가면서 발생한 것이었다.

 

 

컨테이너 (프로세스 트리)가 아직 실행 중일 때 RecoveredContainerLaunch(https://hadoop.apache.org/docs/r2.9.2/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/apidocs/org/apache/hadoop/yarn/server/nodemanager/containermanager/launcher/RecoveredContainerLaunch.html)이 주기적으로 폴링하여 프로세스가 종료되었는지 확인하고 생성된 종료 코드 파일에서 종료 코드를 얻는다.

 

 

컨테이너에서 종료 코드가 없어서 다시 가져 오기를 하려고 하고. 

다시 실패하면 컨테이너는 LOST (Exit 154)로 알린다.

 

 

 

154번에 대한 에러 코드는 다음과 같다. 

 

https://github.com/apache/hadoop/blob/master/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/ContainerExecutor.java#L288

  public enum ExitCode {
    FORCE_KILLED(137),
    TERMINATED(143),
    LOST(154);
    private final int code;

    private ExitCode(int exitCode) {
      this.code = exitCode;
    }

    public int getExitCode() {
      return code;
    }

    @Override
    public String toString() {
      return String.valueOf(code);
    }
  }

 

RecoveryContainerLaunch 소스

 

https://zgrepcode.com/hadoop/apache/3.2.0-rc1/org/apache/hadoop/yarn/server/nodemanager/containermanager/launcher/recoveredcontainerlaunch.java

Posted by 김용환 '김용환'