Jenkins介紹
Jenkins是一個開源軟件項目,是基於Java開發的一種持續集成工具,用於監控持續重複的工做,旨在提供一個開放易用的軟件平臺,使軟件的持續集成變成可能。
html
安裝部署Jenkins
https://jenkins.io/download/
我這裏下載war包安裝,版本:1.642.3 LTS .warjava
環境信息
主機名 | 操做系統版本 | IP地址 | 安裝軟件 |
---|---|---|---|
osb30 | Redhat 6.5 | 172.16.206.30 | jenkins |
新建Jenkins用戶
[root@osb30 ~]# groupadd jenkins [root@osb30 ~]# useradd -g jenkins jenkins [root@osb30 ~]# id jenkins uid=501(jenkins) gid=501(jenkins) groups=501(jenkins) [root@osb30 ~]# echo "wisedu" | passwd --stdin jenkins &> /dev/null
Jenkins安裝方式
安裝jenkins有兩種方式,tomcat方式部署和java部署啓動。本次實驗我以tomcat下部署啓動爲例。mysql
tomcat方式部署
1.首先安裝tomcat和JAVA,配置環境變量(此步驟再也不講述,java配置不可缺乏)
我這裏安裝的是jdk 1.8.0_65。linux
2.將從官網下載下來的jenkins.war文件放入tomcat下的webapps目錄下,進入tomcat的/bin目錄下,啓動tomcat即啓動jenkins。
我這裏用的是tomcat8。git
3.啓動jenkins時,會自動在webapps目錄下創建jenkins目錄,訪問地址爲:http://localhost:8080/jenkinsgithub
[jenkins@osb30 ~]$ tar zxf apache-tomcat-8.0.30.tar.gz [jenkins@osb30 ~]$ mv jenkins.war apache-tomcat-8.0.30/webapps/ [jenkins@osb30 ~]$ cd apache-tomcat-8.0.30 [jenkins@osb30 apache-tomcat-8.0.30]$ bin/startup.sh Jenkins home directory: /home/jenkins/.jenkins found at: $user.home/.jenkins
若是啓動時報錯:web
Caused by:java.awt.AWTError: Can't connect to X11 window server using ':0' as the value of the DISPLAY varible...
解決:sql
[jenkins@osb30 ~]$ cd apache-tomcat-8.0.30/bin/ [jenkins@osb30 bin]$ vim catalina.sh JAVA_OPTS="-Xms1024m -Xmx1024m -Djava.awt.headless=true"
4.訪問jenkins
http://172.16.206.30:8080/jenkinschrome
java部署啓動jenkins
切換到jenkins.war存放的目錄,輸入以下命令:docker
$ java -jar jenkins.war
能夠修改啓動端口
$ java -jar jenkins.war --httpPort=8000
而後在瀏覽器中(推薦用火狐、chrome)輸入http://localhost:8080,localhost能夠是本機的ip,也能夠是計算機名。就能夠打開jenkins;修改端口後,訪問地址的端口需同步變動。
Jenkins受權和訪問控制
默認地Jenkins不包含任何的安全檢查,任何人能夠修改Jenkins設置,job和啓動build等。顯然地在大規模的公司須要多個部門一塊兒協調工做的時候,沒有任何安全檢查會帶來不少的問題。 咱們能夠經過下面的方式來加強Jenkins的安全:
訪問jenkins:http://172.16.206.30:8080/jenkins,
點擊系統管理—> Configure Global Security,點擊」啓用安全」,能夠看到可使用多種方式來加強Jenkins的受權和訪問控制:
如上圖所示,默認是」任何用戶能夠作任何事情(沒有任何限制)」。
咱們在」安全域」選擇」Jenkins專有用戶數據庫」,」容許用戶註冊」;並先在「受權策略」點擊「任何用戶能夠作任何事情(沒有任何限制)」, 防止註冊以後沒法再管理jenkins。此時就能夠刷新一下jenkins的頁面看到右上角有登陸、註冊的按鈕。
註冊管理員帳號
2.點擊系統管理—> Configure Global Security,在「受權策略」選擇」安全矩陣」,添加用戶/組——添加admin帳戶——爲admin帳戶添加全部權限,爲匿名用戶勾選你但願對方瞭解的功能。
【注意】:匿名用戶必定要開啓此處的可讀權限,若不開啓,後面github或者bitbucket的webhook自動構建會沒有權限。
而且勾選上該項,點擊保存。
作完此部操做以後,便可用admin賬號登陸,取消登陸用戶能夠作任何事的權限。
以上操做,便可完成jenkins的受權和訪問控制。
Jenkins系統配置
登陸jenkins——系統管理——系統設置,爲jenkins添加上須要的功能配置,有以下幾個方面:
jdk版本
在jdk的選項,點擊」新增JDK」,取消自動安裝,輸入jdk別名(名稱隨意),JAVA_HOME你們應該都很瞭解,在此處填寫jenkins所在服務器安裝的java程序的HOME位置便可,根據不一樣操做系統填寫不一樣路徑,如win7 D:\Java\jdk1.8 linux /usr/lib/jvm/jdk1.7.0_51。
設置完了請記得保存。
git/svn版本控制添加
根據使用的版本選擇控制版本的應用程序的路徑,如jdk配置便可。
【注意】:若是使用Git做爲版本控制庫,Jenkins默認狀況下是沒有安裝Git的。咱們須要到插件管理界面中選中Git,而後點擊直接安裝。
點擊系統管理—>管理插件—>可選插件,在右上角」過濾」處輸入git進行搜索:
找到Git client plugin和Git plugin,在前面打上√,點擊直接安裝。
安裝成功後,重啓jenkins。
[jenkins@osb30 ~]$ cd apache-tomcat-8.0.30 [jenkins@osb30 apache-tomcat-8.0.30]$ bin/shutdown.sh [jenkins@osb30 apache-tomcat-8.0.30]$ bin/startup.sh ;tail -f logs/catalina.out
Jenkins添加maven配置
先判斷jenkins所在主機是否安裝了maven:
# mvn –version -bash: mvn: command not found
若是沒有安裝,請先安裝maven。
CentOS 安裝maven
[root@osb30 ~]# cd /usr/local/ [root@osb30 local]# wget http://apache.opencas.org/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz [root@osb30 local]# tar zxf apache-maven-3.3.9-bin.tar.gz [root@osb30 local]# ln -s apache-maven-3.3.9 maven [root@osb30 local]# vim /etc/profile # 添加以下配置: # Maven configuration. MAVEN_HOME=/usr/local/maven export PATH=$MAVEN_HOME/bin:$PATH [root@osb30 local]# source /etc/profile [root@osb30 local]# mvn -version Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T00:41:47+08:00) Maven home: /usr/local/maven Java version: 1.8.0_65, vendor: Oracle Corporation Java home: /usr/java/jdk1.8.0_65/jre Default locale: en_US, platform encoding: UTF-8 OS name: "linux", version: "2.6.32-431.el6.x86_64", arch: "amd64", family: "unix"
Jenkins配置maven
Jenkins構建maven風格的job
新建maven任務
登陸jenkins,點擊新建。輸入Item名稱,選擇「構建一個maven項目」,點擊OK。
構建任務配置
源碼管理配置
進入配置頁面,找到」源碼管理」。我這裏是svn,輸入項目所在版本庫的地址。
構建觸發器配置
在」源碼管理」下面是」構建觸發器」。
」構建觸發器」是一個持續集成的觸發器插件,能夠根據已經完成構建的結果,觸發新Job或者傳遞參數。默認的選項是Build whenever a SNAPSHOT dependency is built,意思是依賴於快照的構建,意思是依賴於快照的構建,當代碼有更新時就構建項目。
Build periodically和Poll SCM能夠設置定時自動構建。二者區別以下:
- Poll SCM:定時檢查源碼變動(根據SCM軟件的版本號),若是有更新就checkout最新code下來,而後執行構建動做。
- Build periodically:定時進行項目構建(它不care源碼是否發生變化)。
Maven構建設置
Pre Step
Pre Steps選項用來配置構建前的工做,這裏不做更改。
配置Root POM和Goals and options
由於是Maven項目,因此Build選項有Root POM和Goals and options的設置。Root POM:填寫你項目的pom.xml文件的位置,注意:是相對位置,若是該文件不存在,會有紅色字提示。
好比我這裏是:
Post Steps
在maven項目建立完成後,咱們還須要實現每次構建完成,將war發佈到阿里雲主機上,以實現自動發佈。咱們經過添加shell實現自動發佈。
找到Post steps下有個Execute shell:
【注意】:Jenkins在執行該shell腳本的時候是以jenkins這個用戶身份去執行。某些場景下請注意環境變量PATH。
將構建完成後,所要採起的動做,shell腳本腳本內容以下:
#!/bin/bash # Stop tomcat. ssh root@114.55.29.246 '/usr/local/apache-tomcat-7.0.65/bin/shutdown.sh' &>/dev/null sleep 10 # Check the stop is successful or not. if ssh root@114.55.29.246 'ps -ef|grep tomcat |grep -v "grep"' &>/dev/null; then echo "Tomcat stop failed.Please check the problem." exit 5 fi # Backup previous version and delete the war in the path /usr/local/apache-tomcat-7.0.65/webapps/. ssh root@114.55.29.246 '/usr/bin/cp -f /usr/local/apache-tomcat-7.0.65/webapps/*.war /backups/*war' ssh root@114.55.29.246 'rm -rf /usr/local/apache-tomcat-7.0.65/webapps/*' # Copy the newest war to aliyun ECS. scp /home/jenkins/.jenkins/workspace/godseye/godseye-parent/godseye-container/target/godseye-container-aliyun.war root@114.55.29.246:/usr/local/apache-tomcat-7.0.65/webapps/godseye.war &>/dev/null # Start the tomcat. ssh root@114.55.29.246 '/usr/local/apache-tomcat-7.0.65/bin/startup.sh' &>/dev/null
配置阿里雲主機信任內網的這臺jenkins主機:
因爲是war包在內網服務器上,發佈的環境是在阿里雲主機上,因此要配置主機互信,防止scp war包時還須要輸入密碼。我這裏內網服務器ip是172.16.206.30,外網是114.55.29.246。
[jenkins@osb30 ~]$ ssh-keygen -t rsa -f .ssh/id_rsa [jenkins@osb30 ~]$ ssh-copy-id -i .ssh/id_rsa.pub root@114.55.29.246
Jenkins郵件通知設置
配置jenkins自帶的郵件功能
3.找到郵件通知,輸入SMTP服務器地址,點擊高級,輸入發件人賬號和密碼
4.勾選上」經過發送測試郵件測試配置」,而後輸入收件人賬號
此時咱們已經能夠發送郵件了。在具體job配置處,找到」構建設置」,輸入收件人信箱,可是你會發現只能在構建失敗時發郵件。能夠安裝插件Email Extension Plugin來自定義。
安裝使用插件Email Extension Plugin
1.安裝插件Email Extension Plugin
該插件支持jenkins 1.5以上的版本。
在系統管理-插件管理-安裝Email Extension Plugin。它可根據構建的結果,發送構建報告。該插件支持jenkins 1.5以上的版本。
【注意】:安裝完若是使用Email Extension Plugin,就能夠棄用自帶的那個郵件功能了。
2.配置使用插件Email Extension Plugin
點擊」系統配置」—>」系統設置」。
找到Extended E-mail Notification處,輸入以下的配置:
構建通知:$PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS! <hr/> (本郵件是程序自動下發的,請勿回覆!)<br/><hr/> 項目名稱:$PROJECT_NAME<br/><hr/> 構建編號:$BUILD_NUMBER<br/><hr/> svn版本號:${SVN_REVISION}<br/><hr/> 構建狀態:$BUILD_STATUS<br/><hr/> 觸發緣由:${CAUSE}<br/><hr/> 構建日誌地址:<a href="${BUILD_URL}console">${BUILD_URL}console</a><br/><hr/> 構建地址:<a href="$BUILD_URL">$BUILD_URL</a><br/><hr/> 變動集:${JELLY_SCRIPT,template="html"}<br/><hr/>
點擊下面的保存。
而後去job配置頁面激活這個插件。找到須要發郵件的項目,點擊進去。
點擊配置,點擊」增長構建後操做步驟」,選擇Editable Email Notification。
附上構建日誌,點擊高級設置。
配置Triggers:
更詳細的介紹:http://www.cnblogs.com/zz0412/p/jenkins_jj_01.html
sonar
官方文檔:http://docs.sonarqube.org/display/SONARQUBE45/Documentation
sonar簡介
Sonar是一個用於代碼質量管理的開源平臺,用於管理Java源代碼的質量。經過插件機制,Sonar 能夠集成不一樣的測試工具,代碼分析工具,以及持續集成工具,好比pmd-cpd、checkstyle、findbugs、Jenkins。經過不一樣的插件對這些結果進行再加工處理,經過量化的方式度量代碼質量的變化,從而能夠方便地對不一樣規模和種類的工程進行代碼質量管理。
與持續集成工具(例如 Hudson/Jenkins 等)不一樣,Sonar 並非簡單地把不一樣的代碼檢查工具結果(例如 FindBugs,PMD 等)直接顯示在 Web 頁面上,而是經過不一樣的插件對這些結果進行再加工處理,經過量化的方式度量代碼質量的變化,從而能夠方便地對不一樣規模和種類的工程進行代碼質量管理。
在對其餘工具的支持方面,Sonar 不只提供了對 IDE 的支持,能夠在 Eclipse 和 IntelliJ IDEA 這些工具裏聯機查看結果;同時 Sonar 還對大量的持續集成工具提供了接口支持,能夠很方便地在持續集成中使用 Sonar。
此外,Sonar 的插件還能夠對 Java 之外的其餘編程語言提供支持,對國際化以及報告文檔化也有良好的支持。
環境要求
http://docs.sonarqube.org/display/SONAR/Requirements
新建用戶
[root@osb30 ~]# groupadd sonar [root@osb30 ~]# useradd -g sonar sonar [root@osb30 ~]# id sonar uid=502(sonar) gid=502(sonar) groups=502(sonar) [root@osb30 ~]# echo "wisedu" | passwd --stdin sonar &> /dev/null
安裝jdk
[sonar@osb30 ~]$ java -version java version "1.8.0_65" Java(TM) SE Runtime Environment (build 1.8.0_65-b17) Java HotSpot(TM) 64-Bit Server VM (build 25.65-b01, mixed mode)
安裝配置數據庫
[root@osb30 ~]# mysql -uroot –p mysql> CREATE DATABASE sonar CHARACTER SET utf8 COLLATE utf8_general_ci; mysql> CREATE USER 'sonar' IDENTIFIED BY 'sonar'; mysql> GRANT ALL ON sonar.* TO 'sonar'@'%' IDENTIFIED BY 'wisedu'; mysql> GRANT ALL ON sonar.* TO 'sonar'@'localhost' IDENTIFIED BY 'wisedu'; mysql> FLUSH PRIVILEGES;
安裝sonar
我這裏用的版本是SonarQube 4.5.7 (LTS *),上傳該軟件到sonar用戶的家目錄下。
[sonar@osb30 ~]$ unzip -oq sonarqube-4.5.7.zip [sonar@osb30 ~]$ vim sonarqube-4.5.7/conf/sonar.properties
修改以下字段(就是配置數據庫信息,其餘不用動):
sonar.jdbc.username: sonar sonar.jdbc.password: wisedu sonar.jdbc.url: jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true # Optional properties sonar.jdbc.driverClassName: com.mysql.jdbc.Driver
啓動sonar
Sonar默認集成了jetty容器,能夠直接啓動提供服務,也能夠經過腳本構建爲war包,部署在tomcat容器中。
Sonar默認的端口是」9000」、默認的上下文路徑是」/」、默認的網絡接口是」0.0.0.0」,默認的管理員賬號和密碼爲:admin/admin,這些參數均可以在配置文件sonar.properties中修改。我這裏修改下port,由於本機的9000端口被其餘程序佔用了。
[sonar@osb30 ~]$ vim sonarqube-4.5.7/conf/sonar.properties sonar.web.port=9003 [sonar@osb30 ~]$ sonarqube-4.5.7/bin/linux-x86-64/sonar.sh start
查看日誌:
[sonar@osb30 ~]$ tail -f sonarqube-4.5.7/logs/sonar.log
關閉sonar
[sonar@osb30 ~]$ sonarqube-4.5.7/bin/linux-x86-64/sonar.sh stop
訪問sonar
瀏覽器輸入http://172.16.206.30:9003/
默認的管理員賬號和密碼爲:admin/admin。
sonar插件
Sonar支持多種插件,插件的下載地址爲:http://docs.codehaus.org/display/SONAR/Plugin+Library
將下載後的插件上傳到${SONAR_HOME}extensions\plugins目錄下,從新啓動sonar。
sonar默認集成了Java Ecosystem插件,該插件是一組插件的合集:
- Java [sonar-java-plugin]:java源代碼解析,計算指標等
- Squid [sonar-squid-java-plugin]:檢查違反Sonar定義規則的代碼
- Checkstyle [sonar-checkstyle-plugin]:使用CheckStyle檢查違反統一代碼編寫風格的代碼
- FindBugs [sonar-findbugs-plugin]:使用FindBugs檢查違反規則的缺陷代碼
- PMD [sonar-pmd-plugin]:使用pmd檢查違反規則的代碼
- Surefire [sonar-surefire-plugin]:使用Surefire執行單元測試
- Cobertura [sonar-cobertura-plugin]:使用Cobertura獲取代碼覆蓋率
- JaCoCo [sonar-jacoco-plugin]:使用JaCOCO獲取代碼覆蓋率
與jenkins集成
能夠經過maven集成,也能夠直接與jenkins集成。我這裏選擇直接與jenkins集成。
經過maven集成
修改maven的主配置文件(${MAVEN_HOME}/conf/settings.xml文件或者 ~/.m2/settings.xml文件),在其中增長訪問Sonar數據庫及Sonar服務地址,添加以下配置:
<profile> <id>sonar</id> <properties> <sonar.jdbc.url>jdbc:mysql://localhost:3306/sonar</sonar.jdbc.url> <sonar.jdbc.driver>com.mysql.jdbc.Driver</sonar.jdbc.driver> <sonar.jdbc.username>sonar</sonar.jdbc.username> <sonar.jdbc.password>sonar</sonar.jdbc.password> <sonar.host.url>http://localhost:9003</sonar.host.url> <!-- Sonar服務器訪問地址 --> </properties> </profile> <activeProfiles> <activeProfile>sonar</activeProfile> </activeProfiles> ...
這部份內容具體可參照網上http://www.cnblogs.com/gao241/p/3190701.html
直接與Jenkins集成
在jenkins的插件管理中選擇安裝sonar jenkins plugin,該插件可使項目每次構建都調用sonar進行代碼度量。
2.系統配置添加sonar的配置
進入系統配置頁面對sonar插件進行配置,以下圖:
而後點擊下面的保存。
3.配置構建項目,增長Post Build Action
點擊要構建的項目,在點擊左側的配置。
在頁面的最下面找到」構建後操做」,選擇SonarQube。
It is no longer recommended to use SonarQube maven builder. It is preferable to set up SonarQube in the build environment and use a standard Jenkins maven target.
【解決】:
http://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner+for+Jenkins
修改Build處:
常見問題
Jenkins構建完成後,sonar掃描代碼報錯:
解決:
卸載sonar的JavaScript插件。
Jenkins與Docker結合
我這裏沒有使用Docker Pipeline,直接在構建完成後,執行shell腳本,這樣更靈活。
部署流程
1.研發push到svn代碼庫
2.Jenkins 構建,pull svn代碼 使用maven進行編譯打包
3.打包生成的代碼,生成一個新版本的鏡像,push到本地docker倉庫harbor
4.發佈,測試機器 pull 新版本的鏡像,並刪除原來的容器,從新運行新版本鏡像。
環境說明
主機名 | 操做系統版本 | IP地址 | 用途 | 安裝軟件 |
---|---|---|---|---|
osb30 | Redhat 6.5 | 172.16.206.30 | svn代碼庫、Jenkins、Docker | jenkins、svn、Docker 1.7.1 |
spark32 | CentOS 7.0 | 172.16.206.32 | 本地docker倉庫、業務部署測試環境 | harbor、Docker 17.06.1-ce |
配置
因爲在Jenkins機器上docker是使用root用戶運行的,而Jenkins是使用普通用戶jenkins運行的,因此要先配置下jenkins用戶可使用docker命令。
[root@osb30 ~]# visudo jenkins ALL=(root) NOPASSWD: /usr/bin/docker
另外在Jenkins機器上配置:
# Disable "ssh hostname sudo <cmd>", because it will show the password in clear. # You have to run "ssh -t hostname sudo <cmd>". # #Defaults requiretty Defaults:jenkins !requiretty
若是不配置這個,在執行下面腳本時,會報錯誤:
+ cp -f /home/jenkins/.jenkins/workspace/godseyeBranchForNov/godseye-container/target/godseye-container-wisedu.war /home/jenkins/docker-file/godseye_war/godseye.war + sudo docker login -u jkzhao -p Wisedu123 -e 01115004@wisedu.com 172.16.206.32 sudo: sorry, you must have a tty to run sudo
在172.16.206.32機器上配置:
# visudo # #Defaults requiretty Defaults:root !requiretty
不然在機器172.16.206.32機器上執行腳本時會報錯:
[SSH] executing... sudo: sorry, you must have a tty to run sudo docker: invalid reference format.
安裝插件
登陸Jenkins,點擊「系統管理」,點擊「管理插件」,搜索插件「SSH plugin」,進行安裝。
登陸Jenkins,點擊「Credentials」,點擊「Add domain」。
點擊「系統管理」,「系統配置」,找到「SSH remote hosts」。
配置Post Steps
項目其餘的配置不變,見上面的章節。
【注意】:腳本中用到的倉庫和認證的帳號須要先在harbor新建好。
# Jenkins機器:編譯完成後,build生成一個新版本的鏡像,push到遠程docker倉庫 # Variables JENKINS_WAR_HOME='/home/jenkins/.jenkins/workspace/godseyeBranchForNov/godseye-container/target' DOCKERFILE_HOME='/home/jenkins/docker-file/godseye_war' HARBOR_IP='172.16.206.32' REPOSITORIES='godseye_war/godseye' HARBOR_USER='jkzhao' HARBOR_USER_PASSWD='Wisedu123' HARBOR_USER_EMAIL='01115004@wisedu.com' # Copy the newest war to docker-file directory. \cp -f ${JENKINS_WAR_HOME}/godseye-container-wisedu.war ${DOCKERFILE_HOME}/godseye.war # Delete image early version. sudo docker login -u ${HARBOR_USER} -p ${HARBOR_USER_PASSWD} -e ${HARBOR_USER_EMAIL} ${HARBOR_IP} IMAGE_ID=`sudo docker images | grep ${REPOSITORIES} | awk '{print $3}'` if [ -n "${IMAGE_ID}" ];then sudo docker rmi ${IMAGE_ID} fi # Build image. cd ${DOCKERFILE_HOME} TAG=`date +%Y%m%d-%H%M%S` sudo docker build -t ${HARBOR_IP}/${REPOSITORIES}:${TAG} . &>/dev/null # Push to the harbor registry. sudo docker push ${HARBOR_IP}/${REPOSITORIES}:${TAG} &>/dev/null
# 拉取鏡像,發佈 HARBOR_IP='172.16.206.32' REPOSITORIES='godseye_war/godseye' HARBOR_USER='jkzhao' HARBOR_USER_PASSWD='Wisedu123' # 登陸harbor #docker login -u ${HARBOR_USER} -p ${HARBOR_USER_PASSWD} ${HARBOR_IP} # Stop container, and delete the container. CONTAINER_ID=`docker ps | grep "godseye_web" | awk '{print $1}'` if [ -n "$CONTAINER_ID" ]; then docker stop $CONTAINER_ID docker rm $CONTAINER_ID else #若是容器啓動時失敗了,就須要docker ps -a才能找到那個容器 CONTAINER_ID=`docker ps -a | grep "godseye_web" | awk '{print $1}'` if [ -n "$CONTAINER_ID" ]; then # 若是是第一次在這臺機器上拉取運行容器,那麼docker ps -a也是找不到這個容器的 docker rm $CONTAINER_ID fi fi # Delete godseye_web image early version. IMAGE_ID=`sudo docker images | grep ${REPOSITORIES} | awk '{print $3}'` if [ -n "${IMAGE_ID}" ];then docker rmi ${IMAGE_ID} fi # Pull image. TAG=`curl -s http://${HARBOR_IP}/api/repositories/${REPOSITORIES}/tags | jq '.[-1]' | sed 's/\"//g'` #最後的sed是爲了去掉tag先後的雙引號 docker pull ${HARBOR_IP}/${REPOSITORIES}:${TAG} &>/dev/null # Run. docker run -d --name godseye_web -p 8080:8080 ${HARBOR_IP}/${REPOSITORIES}:${TAG}