Jenkins是開源 CI(Continuous Integration:持續集成)&CD(Continuous Delivery:持續交付) 軟件領導者, 提供超過1000個插件來支持構建、部署、自動化, 知足任何項目的須要,支持各類運行方式,可經過系統包, Docker 或者經過一個獨立的 Java 程序。前端
原理: 看圖(畫圖工具) node
環境:ubuntu、docker、gitgit
$ cat /etc/issue
Ubuntu 16.04.6 LTS \n \l
複製代碼
基於docker,不熟悉的能夠先看看個人上一篇前端之路:緊跟潮流,docker簡單應用github
拉去鏡像docker
$ docker pull jenkinsci/blueocean
根據拉取的Jenkins鏡像啓動一個容器shell
$ docker run \
-d \
--name jenkins \
-u root \
-p 49001:8080 \
-v /var/jenkins_home:/var/jenkins_home \
-v /var/jenkins_ssh:/root/.ssh \
-v /var/run/docker.sock:/var/run/docker.sock \
jenkinsci/blueocean
複製代碼
解釋:ubuntu
-d
:守護模式,在後臺運行。-p
:端口映射,49001是服務器端口(可根據本身狀況更改,別忘記安全組開放端口),8080是容器端口(jenkins程序默認端口)。-v
:掛載數據卷,/var/jenkins_home:/var/jenkins_home
:將Jenkins目錄掛載到宿主機;/var/jenkins_ssh:/root/.ssh
:將Jenkins的ssh掛載到宿主機,備份用,防止重啓後丟失找不到。查看容器運行狀況:瀏覽器
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
08a54d4a804a jenkinsci/blueocean "/sbin/tini -- /usr/…" 7 days ago Up 7 days 50000/tcp, 0.0.0.0:49001->8080/tcp jenkins
複製代碼
附圖:安全
以上說明已成功,若容器意外退出,去掉-d 參數執行,查看log來排錯。bash
如今開始設置Jenkins,在瀏覽器訪問 你的服務器ip:49001
,會出現如下界面:
想進入要先解鎖,密碼就在 /var/jenkins_home/secrets/initialAdminPassword
文件裏,怎麼查看呢?兩種方案:
$ docker exec -it jenkins bash
,而後 $ cat /var/jenkins_home/secrets/initialAdminPassword
。$ sudo cat /var/jenkins_home/secrets/initialAdminPassword
。將上一步的密碼複製到瀏覽器,點擊continue按鈕進行下一步。 附圖:
安裝插件,選擇推薦安裝便可。
=================================================
上面是基本的安裝,我用的是時候官方文檔仍是英文的,目前支持中文,想了解更詳細內容,請去官網,下面開始教你們新建一個 自由構建的任務(鑑於目前網上大都是多機教程,即項目和jenkins不在一臺服務器上,又考慮到小夥伴們手中可能只有一臺本身的機器,因此我下面要講的是 單機運行項目和Jenkins)
=================================================
打開 ip:49001
進入首頁,點擊系統管理:
首先點擊插件管理,搜索並安裝一下插件(若已安裝列表已存在可忽略):
而後點擊系統設置:
找到 Build Timestamp
(上面的插件提供的),進行以下設置:
找到 Publish over SSH
,這個相對麻煩些,進行以下設置:
說明:
補充:因爲Jenkins是在docker容器中運行的,因此上面的配置應該是容器的ssh配置,而不是宿主機的。如上圖,我是經過ssh私鑰進行的登錄。
步驟:
$ docker exec -it jenkins sh
,進入容器。$ ssh-keygen -m PEM -t rsa -b 4096
,生成ssh私鑰及公鑰(默認在 ~/.ssh
即 /root/.ssh
目錄中),能夠一路回車,若設密碼的話,需在「Passphrase」中填寫。$ cat ~/.ssh/id_rsa
,查看私鑰,把私鑰copy到上圖的「key」設置中。$ cat ~/.ssh/id_rsa.pub
,查看公鑰,把公鑰copy到宿主機的 ~/.ssh/authorized_keys
中。至此,Jenkins的ssh配置就完成了,接下來要配置遠程機(我們是單機,因此宿主機就當成遠程機來配置)的SSH Servers了:
說明:
測試,點擊「Test Configuration」按鈕,如success,這配置成功,進行下一步,新建任務。
下面開始新建任務:
在首頁點擊「新建任務」,輸入名稱(建議和github的項目名稱保持一致),選擇第一個「構建一個自由風格的軟件項目」,而後點擊肯定:
返回首頁,能夠列表中看到剛剛新建的任務,點擊名稱,進入任務詳情:
在任務詳情頁,點擊配置,進行項目配置:
Exec command:
#!/usr/bin/env bash
echo '************************************** 發送至服務器成功 **********************************************'
# 項目名,取自環境變量
projectName="${JOB_NAME}"
dockerImageName=${projectName}-${BUILD_TIMESTAMP}
# step1 解壓源代碼
echo " ************************************* 解壓源代碼${dockerImageName}.tar.gz start *************************************"
projectPath='/var/nodejs/' # 須要單獨給用戶賦目錄/var/nodejs/的權限 sudo chown ubuntu /var/nodejs/
sudo mkdir -p ${projectPath}${projectName} || true \
&& cd ${projectPath}${projectName} \
&& sudo rm -rf * # 刪除裏面的數據
sudo tar -zxf ../${dockerImageName}.tar.gz -C ./ \
&& sudo rm ../${dockerImageName}.tar.gz # 刪除發佈過來的包
echo " ************************************* 解壓源代碼${dockerImageName}.tar.gz finish *************************************"
# step2 構建docker鏡像
echo " ************************************* 構建docker鏡像${dockerImageName} start *************************************"
sudo docker build -t ${dockerImageName} --force-rm .
echo ' ************************************* 構建docker鏡像 finish *************************************'
# step3 重啓容器
echo "************************************* 使用鏡像${dockerImageName}啓動容器${projectName} start *************************************"
# 錯誤日誌統一存放在/var/nodejs/logs/${projectName}
sudo mkdir -p /var/nodejs/logs/${projectName} || true \
&& sudo docker stop ${projectName} || true \
&& sudo docker rm ${projectName} || true \
&& sudo docker run -d --net=host --name ${projectName} -v /var/nodejs/logs/${projectName}:/var/nodejs/${projectName}/logs ${dockerImageName}
echo "************************************* 使用鏡像${dockerImageName}啓動容器${projectName} finish *************************************"
echo '************************************************ 查看docker容器狀況: ************************************************ '
sudo docker ps -a
echo '************************************************ 查看docker容器狀況: ************************************************ '
複製代碼
若是項目須要在容器裏構建,一般初次構建時間相對較長,因此能夠把高級設置中的「Exec timeout」設的稍微大一些。
構建-執行shell-命令:
#!/usr/bin/env sh
projectName="${JOB_NAME}"
dockerImageName=${projectName}-${BUILD_TIMESTAMP}
echo '*********************************** 準備打包從Github倉庫拉取的代碼...*********************************************'
echo "**********${WORKSPACE}**********"
tar --exclude=node_modules --exclude=.git --exclude='*.tar.gz' -vzcf /tmp/${dockerImageName}.tar.gz -C ${WORKSPACE} . \
&& mv /tmp/${dockerImageName}.tar.gz ${WORKSPACE} \
&& echo '*********************************** 打包成功 *********************************************' \
&& echo '************************************** 準備發送至服務器... **********************************************'
複製代碼
構建後操做,釘釘通知配置教程
完成項目的任務配置,點擊保存。
返回任務詳情也,點擊「Build with Parameters」,選擇分支,點擊「開始構建」:
在構建歷史列表中,點擊最新的一條構建記錄,再點「擊控制檯輸出」,可查看構建的log:
若是有問題,須要版本回滾怎麼辦呢?
咱們能夠新建一個任務用於版本回滾:
回到首頁,點擊新建,起個名字如:newblog-rollback。
在列表點擊newblog-rollback,進入任務詳情,點擊配置,進入配置頁:
Exec command:
#!/usr/bin/env sh
trim()
{
trimmed=$1
trimmed=${trimmed%% }
trimmed=${trimmed## }
echo "$trimmed"
}
# projectName=$(trim "${container_name}")
projectName="newblog"
dockerImageName=$(trim "${image_name}")
echo "******************************************* 回退到鏡像${image_name} ,並啓動容器${container_name} **************** *******************************"
sudo mkdir -p /var/nodejs/logs/${projectName} || true \
&& sudo docker stop ${projectName} || true \
&& sudo docker rm ${projectName} || true \
&& sudo docker run -d --net=host --name ${projectName} -v /var/nodejs/logs/${projectName}:/var/nodejs/${projectName}/logs ${dockerImageName}
echo "************************************* 使用鏡像${dockerImageName}啓動容器${projectName} finish *************************************"
複製代碼
測試版本回滾,首先,你要知道要回退到哪一個版本,在newblog任務列表中copy你要回退的鏡像名:
最終成果:http://140.143.0.171:8080
【參考】:
===🧐🧐 文中不足,歡迎指正 🤪🤪===
===內容有點多,自我感受寫的很差,但不知怎麼優化,有好的建議歡迎提===