上一個Demo進行了單獨的Jenkins遠程部署, 本Demo將使用流行的Jenkins+Git+Docker進行持續部署.html
和上一篇Demo同樣, 在Azure建立一臺CentOS7服務器, 開放22端口供SSH使用, 而且開放了5000和5001端口.linux
基於微軟官方文檔, SSH到服務器使用以下命令安裝:git
sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm sudo yum install dotnet-sdk-3.0
這一步是比以前多出來的, 由於此次咱們要基於Docker進行持續部署, 根據官方文件:docker
# 卸載舊版本, 由於我是一臺新的服務器, 這一步能夠不作 sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine # 安裝須要用到的包 sudo yum install -y yum-utils \ device-mapper-persistent-data \ lvm2 # 設置docker安裝倉庫地址 sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo # 安裝Docker社區版引擎 sudo yum install docker-ce docker-ce-cli containerd.io
有了上一篇Demo的基礎, 這一次, 咱們輕車熟路, 去配置添加一個Server便可.json
https://gitee.com/jerryqi/JenkinsTest.git
和上次不同的一點是, 上次是在本地構建, 而後上傳編譯後的代碼到服務器運行, 而此次是直接把源代碼上傳到服務器交給Docker來構建, 實際上這裏繞了一個圈, 由於個人Jenkins在本地, 因此是本地下載了Gitee的代碼而後上傳到服務器, 實際上, 若是把Jenkins安裝到服務器就能夠在服務器直接拉取Gitee代碼而後執行Docker腳本構建.centos
Key | Value |
---|---|
Name | 默認選擇了你以前配置的Server |
Source files | ** |
Exec command | docker build -t jenkinstest . docker run -d -p 80:5000 --name jenkinstestapp jenkinstest |
由於在服務器上構建, 所以這裏不寫build選項卡, 固然也能夠在本地構建, 那麼相應的把Dockerfile改一改就行了.bash
在服務器上的docker構建能夠參考個人另一篇文章: 使用Docker-Compose編排發佈.Net Core+Redis應用兩個鏡像到Docker服務器
由於這裏在服務器上實現Docker來構建項目, 咱們在項目根目錄添加Dockerfile內容以下:併發
# 第一部分是編譯併發布項目 # 以微軟.Net Core SDK做爲基礎鏡像, 而且以build做爲別名 FROM mcr.microsoft.com/dotnet/core/sdk:3.0 AS build # 切換build鏡像工做目錄到/app WORKDIR /app # 拷貝sln和csproj項目文件 COPY *.sln . COPY JenkinsTest/*.csproj ./JenkinsTest/ # Restore項目用到的包 RUN dotnet restore # 拷貝項目文件到鏡像裏面相應到目錄 COPY JenkinsTest/. ./JenkinsTest/ # 切換build鏡像工做目錄到/app/AliPay WORKDIR /app/JenkinsTest # 以Release模式發佈應用到out文件夾 RUN dotnet publish -c Release -o out # 第二部分是啓動項目 # 以微軟.Net Core運行環境做爲基礎鏡像, 而且以runtime做爲別名 FROM mcr.microsoft.com/dotnet/core/aspnet:3.0 AS runtime # 切換runtime鏡像工做目錄到/app WORKDIR /app # 把build鏡像裏面編譯出來的文件拷貝到runtime鏡像 COPY --from=build /app/JenkinsTest/out ./ # 暴漏端口 EXPOSE 5000 # 啓動應用 ENTRYPOINT ["dotnet", "JenkinsTest.dll"]
這裏跑第一遍的時候提示以下錯誤:app
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
經過以下命令查看Docker daemon狀態:
sudo service docker status # ● docker.service - Docker Application Container Engine # Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled) # Active: inactive (dead) # Docs: https://docs.docker.com
發現他的狀態是inactive, 經過以下命令重啓Docker:
sudo service docker restart
再次檢查Docker daemon發現它變成了active. 可是再次構建是依然報上述錯誤.
這個時候我直接在服務器上運行docker images, 發現以下錯誤:
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.40/images/json: dial unix /var/run/docker.sock: connect: permission denied
這個很明顯是沒有權限的問題, 這裏有兩種解決方法:
sudo groupadd docker #添加docker用戶組 sudo gpasswd -a $USER docker #將登錄用戶加入到docker用戶組中 newgrp docker #更新用戶組 docker imges #測試docker命令, OK
最後就是, 必定要勾選Abort the build if it's stuck, 而後把超時時間改長一點, 由於第一次要拉取鏡像, 默認的三分鐘是不夠用的.
而後Build now, 由於我把docker的5000端口映射到了服務器的80端口, 因此直接訪問服務器IP便可訪問成功, 大功告成!大功告成!大功告成!