1. 程式人生 > >CentOS下安裝Jenkins(Docker/war/tomcat/java -jar)

CentOS下安裝Jenkins(Docker/war/tomcat/java -jar)

參考官方提供的安裝教程:https://jenkins.io/doc/book/installing/,可以發現官方推薦使用Docker進行安裝。雖然用Docker有很多好處,但也有缺點。

下面是各種安裝方法:

無論怎麼的安裝方法,jenkins在啟動時,都會在執行使用者的目錄下生成.jenkins資料夾,此資料夾用於存放配置和專案檔案,因此,想要備份和遷移jenkins的可以在此資料夾入手。

一、Docker

Docker執行簡單,無需關心Java環境,但弊端是不能使用Docker版的Jenkins來打包Docker,但可以使用子節點的形式來實現。還有就是Docker啟東市引數的配置其實是比較少的,沒那麼靈活。其實研究到最後你會發現它的執行也就是java -var jenkins.war的形式,那麼可以通過改寫容器裡面的程序啟動引數來增加可配置引數的靈活性。

# 下載映象
# 最新版
docker pull jenkinsci/blueocean
# 指定版
# docker pull jenkinsci/blueocean:1.3.6

# 執行
docker run \
  -u root \
  --rm \
  -d \
  -p 8080:8080 \
  -p 50000:50000 \
  -v jenkins-data:/var/jenkins_home \
  -v /var/run/docker.sock:/var/run/docker.sock \
  jenkinsci/blueocean

說明:

可選jenkinsci/blueocean關閉時自動刪除Docker容器(下圖中的例項化)。如果您需要退出Jenkins,這可以保持整潔。
2 可選jenkinsci/blueocean在後臺執行容器(即“分離”模式)並輸出容器ID。如果未指定此選項,則會在終端視窗中輸出正在執行的此容器的Docker日誌。
3 對映(即“釋出”)jenkinsci/blueocean容器的埠8080到主機上的埠8080。第一個數字表示主機上的埠,而最後一個表示容器的埠。因此,如果您-p 49000:8080為此選項指定,則將通過埠49000訪問主機上的Jenkins。
可選)將jenkinsci/blueocean容器的埠50000 對映到主機上的埠50000。只有在其他計算機上設定了一個或多個基於JNLP的Jenkins代理時才需要這樣做,而這些代理又與jenkinsci/blueocean容器互動(充當“主”Jenkins伺服器,或簡稱為“Jenkins master”)。基於JNLP的Jenkins代理預設通過TCP埠50000與Jenkins主機通訊。您可以通過“配置全域性安全性” 頁面更改Jenkins主伺服器上的此埠號如果您要將JNSLP代理的 Jenkins主伺服器TCP埠 值更改為51000(例如),那麼您需要重新執行Jenkins(通過此 docker run …​命令)並指定此“釋出”選項,例如 -p 52000:51000,其中最後一個值與Jenkins主伺服器上的此更改值匹配,第一個值是Jenkins主伺服器上的埠號,基於JNLP的Jenkins代理通過該埠號與Jenkins主伺服器進行通訊 - 即52000。
可選但強烈建議使用名稱 /var/jenkins_home將容器中目錄對映到Docker jenkins-data如果此卷不存在,則此docker run命令將自動為您建立卷。如果您希望每次重新啟動Jenkins時都保持Jenkins狀態(通過此docker run …​命令),則需要此選項 如果未指定此選項,則Jenkins將在每次重新啟動後有效地重置為新例項。
注意: 所述的jenkins-data體積也可以獨立地使用所建立的 docker volume create:命令
docker volume create jenkins-data
代替對映/var/jenkins_home在Docker卷的目錄中,您還可以將此目錄對映到計算機本地檔案系統上的目錄。例如,指定該選項
-v $HOME/jenkins:/var/jenkins_home會將容器的/var/jenkins_home目錄對映  本地計算機上目錄中的jenkins子目錄,該子目錄$HOME通常為 /Users/<your-username>/jenkins/home/<your-username>/jenkins
6 可選/var/run/docker.sock表示Docker守護程式通過其偵聽的基於Unix的套接字。此對映允許jenkinsci/blueocean容器與Docker守護程式通訊,如果jenkinsci/blueocean容器需要例項化其他Docker容器,則需要該守護程式如果執行語法包含agentdocker引數部分的宣告性管道,則此選項是必需的 - 即
agent { docker { …​ } }Pipeline Syntax頁面上閱讀更多相關資訊 
7 jenkinsci/blueocean Docker映象如果尚未下載此映象,則此docker run命令將自動為您下載映象。此外,如果自上次執行此命令後釋出了對此映像的任何更新,則再次執行此命令將自動為您下載這些已釋出的映像更新。
注意:也可以使用以下docker pull 命令單獨下載(或更新)此Docker映象 
docker pull jenkinsci/blueocean

檔案主目錄:

上面安裝指定了-v jenkins-data:/var/jenkins_home,那麼此時在Docker容器目錄已經變了,不再是使用者目錄下的.jenkins資料夾,變成/var/jenkins_home資料夾;當這個選項沒有填寫時才是預設的.jenkins資料夾。如果想要變成宿主機也有這個資料夾對映,需要這樣寫-v /var/jenkins_home:/var/jenkins_home。

檢視日誌:

此時的日誌沒有在容器裡沒有指定的位置,所以只能通過docker logs <name>進行日誌的檢視。

二、Tomcat部署war包

這個方法最簡單,直接交給tomcat容器,並且jvm引數這些也同樣由tomcat進行配置;那麼此時可以配置的選項已經有所折扣,主目錄預設放在使用者目錄下的.jenkins資料夾;而進入系統設定後會提示“代理伺服器設定錯誤”等資訊,且無法修復。

# 在此地址下載war包http://mirrors.jenkins.io/war-stable/
wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war -O jenkins.war
# 移動到tomcat目錄
mv jenkins.war $TOMAT_HOME/webapps/
# 最後訪問地址
http://$TOMCAT_IP:$TOMCAT_PORT/jenkins

主目錄:

可以修改,不過需要結合Tomcat的啟動指令碼,把這些引數加上去:

日誌:

變成這個:/data/service/tomcat/logs/catalina.out

官方參考:

https://wiki.jenkins.io/display/JENKINS/Tomcat

三、yum源安裝

這個應該是網上最多人用的方式,其執行原理也就是java -jar jenkins.war,同時你只能通過這種方式安裝最新版本,某些指定版本不一定可以安裝的到,當然這都是可以解決的,比如在這裡https://pkg.jenkins.io/redhat-stable/下載特定的RPM包進行安裝即可,同樣RPM包沒有那麼多指定版本可以選擇,但可以下載war包替換即可實現指定版本的安裝;並且需要JDK的路徑必須為如下所示:

/usr/lib/jvm/java-1.8.0/bin/java
/usr/lib/jvm/jre-1.8.0/bin/java/usr/bin/java

安裝好後的檔案如下:

/etc/init.d/jenkins
/etc/logrotate.d/jenkins
/etc/sysconfig/jenkins
/usr/lib/jenkins
/usr/lib/jenkins/jenkins.war
/usr/sbin/rcjenkins
/var/cache/jenkins
/var/lib/jenkins
/var/log/jenkins

安裝指令碼:

# 安裝依賴
yum install -y epel-release
wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key

# 安裝jenkins
yum install jenkins

主目錄:

在配置檔案/etc/sysconfig/jenkins下進行配置,預設為:/var/lib/jenkins,同時這個檔案也是可以配置jenkins的啟動引數等。

日誌:

在目錄/var/log/jenkins下

官方參考:

https://wiki.jenkins.io/display/JENKINS/Installing+Jenkins+on+Red+Hat+distributions

四、war包的java -jar執行

目前這種方式應該是最好的,採用java -jar的執行,引數可以隨意指定,此執行時基於jetty的容器。

# 下載war包
# 在此地址下載war包http://mirrors.jenkins.io/war-stable/
wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war -O jenkins.war

使用nohup進行執行,此方法可以指定控制檯的日誌輸出位置,其實上面幾種方式都是這樣的方式輸出日誌的:

nohup java -jar jenkins.war > /tmp/jenkins.log 2>&1

命令引數如下:

命令列引數

Jenkins通常使用埠8080啟動。但是,如果啟動了其他Web服務,您可能會發現此埠已被佔用。您可以使用希望Jenkins執行的埠--httpPort=$HTTP_PORT在哪裡指定其他埠$HTTP_PORT其他命令列引數包括:

命令列引數

描述

-help 顯示所有可用選項及其用法

--httpPort=$HTTP_PORT

使用標準http協議在埠$HTTP_PORT上執行Jenkins偵聽器預設埠為8080.要禁用(因為您使用的是https),請使用埠-1此選項不會影響在Jenkins邏輯(UI,JNLP檔案等)中生成的根URL; 它由全域性配置中指定的Jenkins URL定義。

--httpListenAddress=$HTTP_HOST

將Jenkins繫結到$HTTP_HOST表示的IP地址。預設值為0.0.0.0 - 即偵聽所有可用介面。
例如,要僅偵聽來自localhost的請求,您可以使用: - httpListenAddress=127.0.0.1

--httpsPort=$HTTP_PORT

在埠$HTTP_PORT上使用HTTPS協議。此選項不會影響在Jenkins邏輯(UI,JNLP檔案等)中生成的根URL; 它由全域性配置中指定的Jenkins URL定義。

--httpsListenAddress=$HTTPS_HOST

繫結Jenkins以偵聽$HTTPS_HOST表示的IP地址上的HTTPS請求。

--http2Port=$HTTP_PORT 在埠$HTTP_PORT上使用HTTP/2協議。此選項不會影響在Jenkins邏輯(UI,JNLP檔案等)中生成的根URL; 它由全域性配置中指定的Jenkins URL定義。
--http2ListenAddress=$HTTPS_HOST 繫結Jenkins以偵聽$HTTPS_HOST表示的IP地址上的HTTP/2請求。

--prefix=$PREFIX

執行Jenkins以在URL末尾包含$PREFIX。
例如,要使Jenkins可以訪問,請設定--prefix=/jenkins

http://myServer:8080/jenkins

--ajp13Port=$AJP_PORT

使用標準AJP13協議在埠$AJP_PORT上執行Jenkins監聽器預設值為埠8009.要禁用(因為您使用的是https),請使用埠-1

--ajp13ListenAddress=$AJP_HOST

將Jenkins繫結到$AJP_HOST表示的IP地址。預設值為0.0.0.0 - 即偵聽所有可用介面。

--argumentsRealm.passwd.$ADMIN_USER

設定使用者$ADMIN_USER的密碼。如果啟用了Jenkins安全性,則必須以$ADMIN_USER身份登入才能配置Jenkins或Jenkins專案。注意:您還必須指定此使用者具有管理員角色。(見下面的下一個論點)。

--argumentsRealm.roles.$ADMIN_USER=admin

設定$ADMIN_USER是管理使用者,如果啟用了Jenkins的安全性,則可以配置Jenkins。有關更多資訊,請參閱保護Jenkins

--sessionTimeout=$SESSION_TIMEOUT

將http會話超時值設定為$SESSION_TIMEOUT分鐘。預設為webapp指定的內容,然後是60分鐘

--useJmx 啟用Jetty JMX(參見文件

-Xdebug -Xrunjdwp:transport=dt_socket,address=$DEBUG_PORT,server=y,suspend=n

設定除錯開啟,您可以訪問$DEBUG_PORT上的除錯。

-logfile=$LOG_PATH/winstone_`date +“%Y%m-%d_%H-%M”`.log

記錄到所需的檔案

-XX:PermSize=512M -XX:MaxPermSize=2048M -Xmn128M -Xms1024M -Xmx2048M

參考Oracle Java的這些選項

官方參考:

https://wiki.jenkins.io/display/JENKINS/Starting+and+Accessing+Jenkins

五、反向代理設定

其實無需在Jenkins的jetty容器配置SSL,只需在Nginx配置即可。

# 普通方向代理
server {
    listen 80;
    server_name  www.jenkins.com;

    client_max_body_size    200m;

    location / {
      sendfile off;
      proxy_pass         http://127.0.0.1:8080;
      proxy_redirect     default;
      proxy_http_version 1.1;

      proxy_set_header   Host              $host;
      proxy_set_header   X-Real-IP         $remote_addr;
      proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;
      proxy_set_header   X-Forwarded-Proto $scheme;
      proxy_max_temp_file_size 0;

      #this is the maximum upload size
      client_max_body_size       10m;
      client_body_buffer_size    128k;

      proxy_connect_timeout      90;
      proxy_send_timeout         90;
      proxy_read_timeout         90;
      proxy_buffering            off;
      proxy_request_buffering    off; # Required for HTTP CLI commands in Jenkins > 2.54
      proxy_set_header Connection ""; # Clear for keepalive
    }
}
SSL反向代理
server {
    listen 443;
    server_name www.jenkins.com;
    ssl on;
    root html;
    index index.html index.htm;
    ssl_certificate   /data/service/nginx_vhost/cert/215082065120461.pem;
    ssl_certificate_key  /data/service/nginx_vhost/cert/215082065120461.key;
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    location / {
        sendfile off;
        proxy_pass http://127.0.0.1:8080;
        proxy_redirect default;
        proxy_http_version 1.1;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_max_temp_file_size 0;

        #this is the maximum upload size
        client_max_body_size 10m;
        client_body_buffer_size 128k;

        proxy_connect_timeout 90;
        proxy_send_timeout 90;
        proxy_read_timeout 90;
        proxy_buffering off;
        proxy_request_buffering off; # Required for HTTP CLI commands in Jenkins > 2.54
        proxy_set_header Connection ""; # Clear for keepalive
    }
}

官方參考:

https://wiki.jenkins.io/display/JENKINS/Jenkins+behind+an+NGinX+reverse+proxy

六、總結

1、war包使用java -jar執行其實是個趨勢,Docker雖然快,但也有弊端。

2、yum其實配置最好,什麼項都非常清晰,只是目錄規劃不能自定義,需要後期維護。

3、war包直接執行最靈活,要什麼引數都可以自行配置。

4、tomcat部署最弱,依託於tomcat容器後續配置可能要兼顧考慮。

5、每個版本的安裝各有千秋,適合自己的才是最好的。我個人覺得yum安裝還是不錯的,至少配置是標準的。

七、一鍵安裝指令碼

https://github.com/easonjim/centos-shell/tree/master/jenkins 

 

參考:

https://www.blazemeter.com/blog/how-to-install-jenkins-on-the-apache-tomcat-server(tomcat)

https://www.vultr.com/docs/how-to-install-jenkins-on-centos-7(yum)

https://jenkins.io/doc/book/installing/ (官方教程)

https://blog.whsir.com/post-2505.html

https://ken.io/note/centos7-jenkins-install-tutorial

https://www.cnblogs.com/stulzq/p/9291237.html