jenkins publish .net core application to linux server in docker

上一個Demo進行了單獨的Jenkins遠程部署, 本Demo將使用流行的Jenkins+Git+Docker進行持續部署.html

準備Linux服務器

和上一篇Demo同樣, 在Azure建立一臺CentOS7服務器, 開放22端口供SSH使用, 而且開放了5000和5001端口.linux

安裝DotNet Core

基於微軟官方文檔, 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進行持續部署, 根據官方文件: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

配置Jenkins

有了上一篇Demo的基礎, 這一次, 咱們輕車熟路, 去配置添加一個Server便可.json

構建項目

  1. 新建一個Freestyle Project, 名字隨便起, 而後肯定進入配置頁.
  2. 在Source Code Management選擇git, 而且在Repository URL填入以下地址:
https://gitee.com/jerryqi/JenkinsTest.git

和上次不同的一點是, 上次是在本地構建, 而後上傳編譯後的代碼到服務器運行, 而此次是直接把源代碼上傳到服務器交給Docker來構建, 實際上這裏繞了一個圈, 由於個人Jenkins在本地, 因此是本地下載了Gitee的代碼而後上傳到服務器, 實際上, 若是把Jenkins安裝到服務器就能夠在服務器直接拉取Gitee代碼而後執行Docker腳本構建.centos

  1. 在Build Environment進行以下操做:
    • 勾選Delete workspace before build starts
    • 勾選Send files or execute commands over SSH after the build runs, 填寫信息以下:
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服務器

編寫Dockerfile

由於這裏在服務器上實現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, 簡單暴力.
  • 還有第二種方法就給他添加權限, 我這裏使用第二種:
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便可訪問成功, 大功告成!大功告成!大功告成!

相關文章
相關標籤/搜索