1. 개요
macOS에 CI툴인 Jenkins를 설치한다.
2. 설치
$ brew install jenkins Updating Homebrew... ==> Auto-updated Homebrew! Updated 1 tap (homebrew/core). ==> New Formulae base91 now-cli octant pokerstove kubebuilder nushell pdftk-java ==> Updated Formulae ack h2o pdnsrec activemq haproxy pev activemq-cpp hbase pgroonga afflib heimdal php afl-fuzz helmfile php@7.1 aircrack-ng hive php@7.2 aliyun-cli hledger pijul alpine htpdate pjproject amap http_load pkcs11-helper amazon-ecs-cli httping plantuml amqp-cpp httrack platformio angular-cli hugo poco ansible hyperfine podofo ansible@1.9 hyperscan ponyc ansible@2.0 i2p poppler apache-flink i2pd postgresql apache-geode icecast pre-commit apache-spark ike-scan presto apib imapfilter profanity appscale-tools intercal proj arangodb iperf3 protobuf aravis ipython protobuf@3.6 asio ircd-hybrid protobuf@3.7 ask-cli ircii psqlodbc astrometry-net irssi pulledpork autorest istioctl pulumi avfs jenkins pure-ftpd avro-c jenkins-lts pwntools avro-cpp jfrog-cli-go pwsafe avro-tools joplin pyenv aws-okta jose pygobject3 aws-sdk-cpp jpeg-turbo pypy awscli juise pypy3 axel juju pyqt azure-cli kafka pyside azure-storage-cpp kore python@2 bacula-fd krb5 pyvim badtouch kube-aws qca bareos-client kubecfg qmmp bash kubectx qpdf bat kubeseal qpid-proton bazel lablgtk qscintilla2 bbftp-client lazydocker qsoas bcftools ldapvi rabbitmq-c bedtools ldid rclone benthos ldns rdesktop bibtexconv ledger re2 bigloo lftp readline blueutil lgogdownloader rename boost libarchive repo boost-bcp libbitcoin riff boost-build libbitcoin-blockchain rmlint boost-mpi libbitcoin-client rom-tools boost-python libbitcoin-consensus root boost-python3 libbitcoin-database rtags botan libbitcoin-explorer ruby breezy libbitcoin-network ruby-build bro libbitcoin-node ruby@2.4 btfs libbitcoin-protocol ruby@2.5 btpd libbitcoin-server s-nail buku libdap s2geometry burp libdvbpsi s3-backer cabal-install libexosip sagittarius-scheme cadaver libfaketime sane-backends caf libfreefare sbcl camlp4 libgcrypt sblim-sfcc camlp5 libheif sbt cfn-lint libjwt scamper cgrep libmowgli sccache charm-tools libmypaint scdoc checkstyle libphonenumber scrypt chronograf libpqxx sdhash cimg libpulsar sdl2 citus libre serverless clamav librsvg shairport clingo libsecret shairport-sync cmake libsignal-protocol-c ship collectd libslax siege collector-sidecar libtins sile conan libtrace sip consul libu2f-server sipsak consul-template libvirt siril convox links skaffold cpprestsdk lmod skopeo cryptol logrotate slrn csound logtalk smali cubelib lolcat sn0int cucumber-cpp luvit sngrep davix lxc socat dcmtk lynx sofia-sip dcos-cli mackup softhsm ddgr makensis sonobuoy deno makepkg source-highlight dhall-bash mariadb sourcery dieharder mariadb-connector-c sphinx diff-pdf mariadb-connector-odbc spiped diffoscope mariadb@10.0 sqlcipher django-completion mariadb@10.1 sqlmap dnsviz mariadb@10.2 srt docfx mariadb@10.3 ssh-audit docker maven ssh-permit-a38 docker-completion md5sha1sum ssldump docker-machine memcached starship doctl mesa step dovecot mfterm storm duo_unix micronaut stress-ng duplicity miller strongswan dylibbundler minio stunnel dynare minio-mc stuntman efl miniserve subnetcalc ejabberd mit-scheme svtplay-dl ekg2 mkl-dnn swiftlint emacs mktorrent sylpheed embree mkvtoolnix sync_gateway emscripten mmark syncthing encfs molecule sysdig epic5 monero tarantool erlang@20 monetdb tarsnap erlang@21 mongoose taskell eslint monit tcl-tk etcd monitoring-plugins tcpdump ethereum mono tcpflow exim mpg123 tdlib exploitdb mupdf tectonic fauna-shell mysql telegraf fdroidserver mysql@5.7 teleport feedgnuplot nagios-plugins terraform ffsend nano terragrunt fibjs ncmpcpp terrahub findutils nco tile38 firebase-cli ncrack tinc flow neo4j tiny-fugue flowgrind neofetch tomcat-native fluxctl neon trafficserver flyway net-snmp triton fn netlify-cli ttyd folly nginx tunnel fossil ngircd typescript fpp nmap u-boot-tools fq nmh unbound freeradius-server node unrar freetds nomad unshield frpc nopoll uptimed frps nordugrid-arc uwsgi frugal nrpe vala gambit-scheme nsq valabind gammu nss varnish gdal ntp vault-cli gdcm nzbget verilator geoipupdate ocaml vgmstream gerbil-scheme ocaml-findlib vim getdns ocaml-num vips getxbook ocamlbuild visp git-crypt ocamlsdl vtk gkrellm ocrmypdf vulkan-headers glances ooniprobe wdc glib opa webpack glib-openssl opencolorio webtorrent-cli globus-toolkit opencv weechat glooctl opencv@3 whois gloox openfortivpn widelands gmic openimageio wine gnupg-pkcs11-scd openrct2 wireguard-tools gnuradio opensc wla-dx go openssh wskdeploy gocryptfs openvpn wtf godep operator-sdk wtfutil goreleaser ophcrack xcodegen gpac orc-tools xmake gradle osc yosys grafana oscats youtube-dl groonga osquery zabbix gsl paket zbackup gsoap pango zim gst-plugins-good parallel znc gtk+3 passenger zsxd gtmess pdftoipe gwyddion pdns ==> Deleted Formulae cclive libopkele pincaster cherokee mongodb thc-pptp-bruter csup mongodb@3.0 tlsdate ctunnel mongodb@3.2 tn5250 frag_find mongodb@3.4 voms freetds@0.91 mongodb@3.6 xar-mackyle ftimes packetbeat liblacewing percona-server-mongodb ==> Downloading http://mirrors.jenkins.io/war/2.193/jenkins.war ==> Downloading from http://mirror.serverion.com/jenkins/war/2.193/jenkins.war ######################################################################## 100.0% ==> jar xvf jenkins.war ==> Caveats Note: When using launchctl the port will be 8080. To have launchd start jenkins now and restart at login: brew services start jenkins Or, if you don't want/need a background service you can just run: jenkins ==> Summary 🍺 /usr/local/Cellar/jenkins/2.193: 7 files, 78MB, built in 26 seconds
3. 최초 실행
$ jenkins Running from: /usr/local/Cellar/jenkins/2.193/libexec/jenkins.war webroot: $user.home/.jenkins 2019-09-07 02:17:46.581+0000 [id=1] INFO org.eclipse.jetty.util.log.Log#initialized: Logging initialized @693ms to org.eclipse.jetty.util.log.JavaUtilLog 2019-09-07 02:17:46.749+0000 [id=1] INFO winstone.Logger#logInternal: Beginning extraction from war file 2019-09-07 02:17:52.775+0000 [id=1] WARNING o.e.j.s.handler.ContextHandler#setContextPath: Empty contextPath 2019-09-07 02:17:52.886+0000 [id=1] INFO org.eclipse.jetty.server.Server#doStart: jetty-9.4.z-SNAPSHOT; built: 2019-05-02T00:04:53.875Z; git: e1bc35120a6617ee3df052294e433f3a25ce7097; jvm 1.8.0_161-b12 2019-09-07 02:17:53.433+0000 [id=1] INFO o.e.j.w.StandardDescriptorProcessor#visitServlet: NO JSP Support for /, did not find org.eclipse.jetty.jsp.JettyJspServlet 2019-09-07 02:17:53.561+0000 [id=1] INFO o.e.j.s.s.DefaultSessionIdManager#doStart: DefaultSessionIdManager workerName=node0 2019-09-07 02:17:53.566+0000 [id=1] INFO o.e.j.s.s.DefaultSessionIdManager#doStart: No SessionScavenger set, using defaults 2019-09-07 02:17:53.571+0000 [id=1] INFO o.e.j.server.session.HouseKeeper#startScavenging: node0 Scavenging every 600000ms Jenkins home directory: /Users/intersection3/.jenkins found at: $user.home/.jenkins 2019-09-07 02:18:01.488+0000 [id=1] INFO o.e.j.s.handler.ContextHandler#doStart: Started w.@1eef9aef{Jenkins v2.193,/,file:///Users/intersection3/.jenkins/war/,AVAILABLE}{/Users/intersection3/.jenkins/war} 2019-09-07 02:18:01.581+0000 [id=1] INFO o.e.j.server.AbstractConnector#doStart: Started ServerConnector@7fd50002{HTTP/1.1,[http/1.1]}{0.0.0.0:8080} 2019-09-07 02:18:01.581+0000 [id=1] INFO org.eclipse.jetty.server.Server#doStart: Started @15694ms 2019-09-07 02:18:01.582+0000 [id=22] INFO winstone.Logger#logInternal: Winstone Servlet Engine v4.0 running: controlPort=disabled 2019-09-07 02:18:03.172+0000 [id=29] INFO jenkins.InitReactorRunner$1#onAttained: Started initialization 2019-09-07 02:18:03.245+0000 [id=28] INFO jenkins.InitReactorRunner$1#onAttained: Listed all plugins 2019-09-07 02:18:05.421+0000 [id=28] INFO jenkins.InitReactorRunner$1#onAttained: Prepared all plugins 2019-09-07 02:18:05.432+0000 [id=33] INFO jenkins.InitReactorRunner$1#onAttained: Started all plugins 2019-09-07 02:18:05.465+0000 [id=34] INFO jenkins.InitReactorRunner$1#onAttained: Augmented all extensions 2019-09-07 02:18:06.305+0000 [id=27] INFO jenkins.InitReactorRunner$1#onAttained: Loaded all jobs 2019-09-07 02:18:06.320+0000 [id=47] INFO hudson.model.AsyncPeriodicWork$1#run: Started Download metadata 2019-09-07 02:18:06.375+0000 [id=47] INFO hudson.util.Retrier#start: Attempt #1 to do the action check updates server 2019-09-07 02:18:07.908+0000 [id=32] INFO o.s.c.s.AbstractApplicationContext#prepareRefresh: Refreshing org.springframework.web.context.support.StaticWebApplicationContext@3f2775db: display name [Root WebApplicationContext]; startup date [Sat Sep 07 11:18:07 KST 2019]; root of context hierarchy 2019-09-07 02:18:07.908+0000 [id=32] INFO o.s.c.s.AbstractApplicationContext#obtainFreshBeanFactory: Bean factory for application context [org.springframework.web.context.support.StaticWebApplicationContext@3f2775db]: org.springframework.beans.factory.support.DefaultListableBeanFactory@22d7f2f0 2019-09-07 02:18:07.951+0000 [id=32] INFO o.s.b.f.s.DefaultListableBeanFactory#preInstantiateSingletons: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@22d7f2f0: defining beans [authenticationManager]; root of factory hierarchy 2019-09-07 02:18:08.333+0000 [id=32] INFO o.s.c.s.AbstractApplicationContext#prepareRefresh: Refreshing org.springframework.web.context.support.StaticWebApplicationContext@7d147f82: display name [Root WebApplicationContext]; startup date [Sat Sep 07 11:18:08 KST 2019]; root of context hierarchy 2019-09-07 02:18:08.333+0000 [id=32] INFO o.s.c.s.AbstractApplicationContext#obtainFreshBeanFactory: Bean factory for application context [org.springframework.web.context.support.StaticWebApplicationContext@7d147f82]: org.springframework.beans.factory.support.DefaultListableBeanFactory@5019b6af 2019-09-07 02:18:08.334+0000 [id=32] INFO o.s.b.f.s.DefaultListableBeanFactory#preInstantiateSingletons: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@5019b6af: defining beans [filter,legacy]; root of factory hierarchy 2019-09-07 02:18:08.733+0000 [id=32] INFO jenkins.install.SetupWizard#init: ************************************************************* ************************************************************* ************************************************************* Jenkins initial setup is required. An admin user has been created and a password generated. Please use the following password to proceed to installation: 21d8ee7f3fea4cefa34673fc39496237 This may also be found at: /Users/intersection3/.jenkins/secrets/initialAdminPassword ************************************************************* ************************************************************* ************************************************************* 2019-09-07 02:18:18.663+0000 [id=47] INFO hudson.model.UpdateSite#updateData: Obtained the latest update center data file for UpdateSource default 2019-09-07 02:18:20.416+0000 [id=32] INFO hudson.model.UpdateSite#updateData: Obtained the latest update center data file for UpdateSource default 2019-09-07 02:18:20.808+0000 [id=29] INFO jenkins.InitReactorRunner$1#onAttained: Completed initialization 2019-09-07 02:18:20.827+0000 [id=54] INFO hudson.UDPBroadcastThread#run: Cannot listen to UDP port 33,848, skipping: java.net.SocketException: Can't assign requested address 2019-09-07 02:18:20.840+0000 [id=21] INFO hudson.WebAppMain$3#run: Jenkins is fully up and running 2019-09-07 02:18:20.989+0000 [id=47] INFO h.m.DownloadService$Downloadable#load: Obtained the updated data file for hudson.tasks.Maven.MavenInstaller 2019-09-07 02:18:20.990+0000 [id=47] INFO hudson.util.Retrier#start: Performed the action check updates server successfully at the attempt #1 2019-09-07 02:18:20.998+0000 [id=47] INFO hudson.model.AsyncPeriodicWork$1#run: Finished Download metadata. 14,665 ms
brew를 통해 실행하는 방법은 다음과 같다.
$ brew services start jenkins ==> Successfully started `jenkins` (label: homebrew.mxcl.jenkins)
4. 접속 (최초 로그인)
http://localhost:8080
에 접속하면 다음과 같은 문구가 나오면서 Administrator 패스워드를 넣으라고 한다.
Unlock Jenkins
To ensure Jenkins is securely set up by the administrator, a password has been written to the log (not sure where to find it?) and this file on the server:
패스워드는 최초 실행 시 나온대로 /Users/intersection3/.jenkins/secrets/initialAdminPassword 파일에 기록되어 있다. 패스워드를 입력하고 나면 Customize 화면으로 넘어간다. 대략 기본적인 설치는 됐다고 보면 된다.
이후 플러그인 설치, 사용자 생성 등이 이어진다.
5. Maven 설정
Jenkins 접속 후 -> [Jenkins 관리] -> [Global Tool Configuration]에 들어간다.
5.1. Maven Configuration
5.2. Maven
5.3. JDK, Git
동일하게 JDK와 Git에 대한 설정을 이어간다.