Print
카테고리: [ macOS & Macintosh ]
조회수: 30587

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

installation maven 20190907 1

5.2. Maven

installation maven 20190907 2

5.3. JDK, Git

동일하게 JDK와 Git에 대한 설정을 이어간다.