Ubuntu GitLab CI Docker ASP.NET Core 2.0 自動化發布和部署(1)

相關博文:

  • Ubuntu 簡單安裝和配置 GitLab
  • Ubuntu 簡單安裝 Docker
  • Ubuntu Docker 簡單安裝 GitLab
  • Ubuntu Docker 安裝和配置 GitLab CI 持續集成

服務器版本 Ubuntu 16.04 LTS。

經過上面四篇博文中的相關安裝和配置,我們主要完成了兩個容器的創建和運行:gitlabgitlab-runner(GitLab 站點和 GitLab CI 服務):

$ docker ps
CONTAINER ID        IMAGE                         COMMAND                  CREATED             STATUS                PORTS                                                            NAMES
696d559ce382        gitlab/gitlab-runner:latest   "/usr/bin/dumb-ini..."   5 days ago          Up 25 minutes                                                                          gitlab-runner
ff95f354200d        gitlab/gitlab-ce:latest       "/assets/wrapper"        7 days ago          Up 6 days (healthy)   0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:8888->22/tcp   gitlab

本篇博文目的:使用 GitLab CI 腳本編譯 ASP.NET Core 2.0 程序,然后將編譯后的文件傳輸到服務器上,最后使用 SSH 連接服務器,并運行程序,完成發布和部署。

簡單來說,就是我們每次使用git push提交完代碼,自動完成發布和部署。

我們再理一下實現上面目的關鍵點:

  1. 創建一個 ASP.NET Core 2.0 示例程序
  2. 完善并正確的.gitlab-ci.yml文件配置
  3. GitLab CI 服務器使用ssh連接到測試服務器(在 Docker 中)
  4. 使用scp進行服務器之間的文件傳輸
  5. 使用supervisor進行站點程序的進程管理

我花了很長時間配置第三步,其實最后解決也很簡單,當然都是馬后炮的結論?,下面我們分別來進行操作。

1. 創建 ASP.NET Core 2.0 示例程序

我自己創建示例程序:http://40.125.206.47/team/hwapp

注:服務器快過期了,大家可以隨便搞?。

自己創建的話,也很簡單,官方教程:https://www.microsoft.com/net/core#linuxubuntu

我再搬運下命令(安裝 .NET Core 2.0,并創建 ASP.NET Core 2.0 示例程序):

$ curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
$ sudo mv microsoft.gpg /etc/apt/trusted.gpg.d/microsoft.gpg
$ sudo sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-xenial-prod xenial main" > /etc/apt/sources.list.d/dotnetdev.list'$ sudo apt-get update
$ sudo apt-get install dotnet-sdk-2.0.0$ dotnet new webapi -o hwapp
$ cd hwapp

最后,綁定下 ASP.NET Core 2.0 程序端口:

public class Program
{public static void Main(string[] args){BuildWebHost(args).Run();}public static IWebHost BuildWebHost(string[] args) =>WebHost.CreateDefaultBuilder(args).UseKestrel() //add code.UseUrls($"http://*:8088") //add code.UseStartup<hwapp.Startup>().Build();
}

2. .gitlab-ci.yml 文件配置

我的.gitlab-ci.yml文件配置(http://40.125.206.47/team/hwapp/blob/master/.gitlab-ci.yml):

image: microsoft/aspnetcore-build
stages:- build- deploy_dev
before_script:# Install ssh-agent if not already installed, it is required by Docker.# (change apt-get to yum if you use a CentOS-based image)- 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'# Run ssh-agent (inside the build environment)- eval $(ssh-agent -s)# Add the SSH key stored in SSH_PRIVATE_KEY variable to the agent store# error: https://gitlab.com/gitlab-examples/ssh-private-key/issues/1# - echo "$SSH_PRIVATE_KEY_DEV"- ssh-add <(echo "$SSH_PRIVATE_KEY_DEV")# For Docker builds disable host key checking. Be aware that by adding that# you are suspectible to man-in-the-middle attacks.# WARNING: Use this only with the Docker executor, if you use it with shell# you will overwrite your user's SSH config.- mkdir -p ~/.ssh- '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
build_job:stage: buildonly:- masterscript:- dotnet restore- dotnet build
deploy_dev_job:stage: deploy_devenvironment:name: developmentonly:- masterscript:# 發布程序并部署運行- dotnet publish -c Release --output bin/publish- scp -r bin/publish root@$DEPLOY_SERVER_DEV:/home/xishuai/wwwroot/hwapp- ssh root@$DEPLOY_SERVER_DEV "supervisorctl restart hwapp && curl http://localhost:8088/api/values"

上面是我最終調試成功后的.gitlab-ci.yml文件配置,其實整個的構建和發布流程,從上面的配置中都可以看出。

這里記錄下一些東西:

配置一開始的image,設置的是我們用于構建的鏡像(也就是說后面所有的腳本執行,都是在基于這個鏡像創建的容器中),如果不設置的話,默認使用的是我們一開始配置 GitLab CI 填寫的 Docker Image,也可以手動編輯vim /srv/gitlab-runner/config/config.toml進行修改,我這里使用的是microsoft/aspnetcore-build鏡像,只用于 ASP.NET Core 應用程序的編譯和構建。

stage可以理解為臺階,每走一步相當于job,當然,這里的臺階可以走很多步,需要注意的是,每上一個臺階或者每走一步,都必須基于上一個臺階或上一步執行成功,before_script執行在這些步驟之前,可以理解為準備工作。

environment將執行的job歸納為哪一種執行環境,你可以設置開發環境和正式環境,我們可以通過通過后臺進行查看:

435188-20170831172757577-1215640944.png

3. GitLab CI 服務器使用 SSH 連接到測試服務器

什么意思呢?就是我們需要在 GitLab CI 構建環境中,使用 SSH 連接到測試服務器,這樣我們才可以做接下來的一些操作。

官方配置:SSH keys when using the Docker executor

.gitlab-ci.yml示例配置:

before_script:# Install ssh-agent if not already installed, it is required by Docker.# (change apt-get to yum if you use a CentOS-based image)- 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'# Run ssh-agent (inside the build environment)- eval $(ssh-agent -s)# Add the SSH key stored in SSH_PRIVATE_KEY_DEV variable to the agent store- ssh-add <(echo "$SSH_PRIVATE_KEY_DEV")# For Docker builds disable host key checking. Be aware that by adding that# you are suspectible to man-in-the-middle attacks.# WARNING: Use this only with the Docker executor, if you use it with shell# you will overwrite your user's SSH config.- mkdir -p ~/.ssh- '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'# In order to properly check the server's host key, assuming you created the# SSH_SERVER_HOSTKEYS variable previously, uncomment the following two lines# instead.# - mkdir -p ~/.ssh# - '[[ -f /.dockerenv ]] && echo "$SSH_SERVER_HOSTKEYS" > ~/.ssh/known_hosts'

在進行配置之前,我們需要理一下這個步驟,要不然思路容易混亂,會造成一些問題,可以參考這篇文章:Fixing 'Enter passphrase for /dev/fd/63' in a Gitlab CI job

需要強調一點:別在 GitLab CI 容器中進行 SSH 配置,因為 CI 構建腳本執行在另外的容器中,并且這個容器是動態進行創建的,也沒辦法在這個動態容器中進行配置(指的是手動生成 RSA 密鑰)。

所以,我們只能手動生成 RSA 密鑰,然后強制添加到容器中的 SSH 配置中(通過 RSA 密鑰內容)。

配置步驟:

首先,在任何一臺服務器上,創建 RSA 無密碼的密鑰:

$ ssh-keygen -t rsa -P ''
$ cat /root/.ssh/id_rsa

然后復制 RSA 密鑰內容,添加到/Project/Settings/PipelinesSecret variables配置中(命名為SSH_PRIVATE_KEY_DEV):

435188-20170831172823671-1736641179.png

這里需要特別注意,復制內容為(包含開頭和結尾的注釋信息):

-----BEGIN RSA PRIVATE KEY----- 
xxxxxxx 
-----END RSA PRIVATE KEY-----

我一開始復制沒有包含注釋信息,然后就一直報下面的錯誤:

435188-20170831172848249-350300683.png

錯誤代碼:

$ ssh-add <(echo "$SSH_PRIVATE_KEY_DEV")
Enter passphrase for /dev/fd/63: ERROR: Job failed: exit code 1

這里的$SSH_PRIVATE_KEY_DEV,就是上面我們在Secret variables中,添加的 RSA 密鑰內容。

錯誤信息就是說需要輸入 RSA 密鑰的密碼,但我創建的確實是無密碼的 RSA 密鑰,也就是說這個密鑰是無效的,我被這個問題折磨了好幾天?,其他人的記錄:

  • "Enter passphrase for /dev/fd/63" error(有我的回復?)
  • "Enter passphrase for /dev/fd/63" error
  • https://gitlab.com/gitlab-examples/ssh-private-key/-/jobs/376082(受這個兄弟的啟發)

配置好這一步之后,然后重新測試下,我們就可以看到下面的執行信息了:

$ ssh-add <(echo "$SSH_PRIVATE_KEY_DEV")
Identity added: /dev/fd/63 (/dev/fd/63)

接著我們需要將這個 RSA 密鑰對應的公鑰,上傳到需要連接到的服務器(也就是我們的測試服務器),命令如下:

$ ssh-copy-id root@40.125.201.75

到此,GitLab CI 中 SSH 的配置基本上完成了,你可以在.gitlab-ci.yml中添加連接腳本,進行測試:

- ssh root@$DEPLOY_SERVER_DEV "ls && cd /"

一開始,我們說到使用scp進行服務器之間的文件傳輸,因為scp可以基于 SSH 連接進行傳輸文件,所以我們直接進行文件傳輸了,示例代碼:

- scp -r bin/publish root@$DEPLOY_SERVER_DEV:/home/xishuai/wwwroot/hwapp

scp命令參考:http://www.runoob.com/linux/linux-comm-scp.html

4. 使用 Supervisor 進行站點程序的進程管理

可以參考之前的文章:Ubuntu 安裝和使用 Supervisor(進程管理)

這里貼一下,supervisorctl的常用命令:

命令說明
supervisorctl stop program_name停止某個進程
supervisorctl start program_name啟動某個進程
supervisorctl restart program_name重啟某個進程
supervisorctl stop all停止全部進程
supervisorctl reload載入最新的配置文件,停止原有進程并按新的配置啟動、管理所有進程
supervisorctl update根據最新的配置文件,啟動新配置或有改動的進程,配置沒有改動的進程不會受影響而重啟

5. 最終效果

Pipelines 管道(地址:http://40.125.206.47/team/hwapp/pipelines)

435188-20170831172901765-262319739.png

Build_Job 構建任務(地址:http://40.125.206.47/team/hwapp/-/jobs/113)

435188-20170831172927405-20901709.png

Deploy_Dev_Job 發布和部署任務(地址:http://40.125.206.47/team/hwapp/-/jobs/115)

435188-20170831172939062-198096621.png


寫在最后:

  • GitLab CI & ASP.NET Core 2.0 發布和部署(完成):使用 CI 腳本編譯程序,然后將編譯后的文件傳輸到服務器上,最后運行程序,完成發布和部署。
  • GitLab CI & ASP.NET Core 2.0 & Docker 發布和部署(下篇):項目中添加Dockerfile文件,使用 CI 腳本構建自定義鏡像,然后在服務器上拉取并創建相應容器,最后啟動容器,完成發布和部署。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/455216.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/455216.shtml
英文地址,請注明出處:http://en.pswp.cn/news/455216.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

X264學習筆記(1)

X264學習筆記&#xff08;1&#xff09; X264編碼流程 參數的初始化 1.opt&#xff0c;param根據輸入的參數和標準的規定&#xff0c;進行初始化設置。 Opt的說明如下&#xff1a; Opt->hin用于給出讀入的yuv文件的指針地址 Opt->hout給出了輸出的文件的指針地址 Opt->…

python 數字轉化excel行列_Python實現excel的列名稱轉數字、26進制(A-Z)與10進制互相轉換...

Python實現excel的列名稱轉數字、26進制(A-Z)與10進制互相轉換sequence list( map( lambda x: chr( x ), range( ord( A ), ord( Z ) 1 ) ) )##-----字母轉數字(python實現 1-26A-Z, then AA-AZ)def ten2TwentySix(num):L []numnum-1; #實現從1對應Aif num > 25:while Tr…

錯誤提示:'……' is not assignable to Android.app.Activity Manifest XML

1 問題描述&#xff1a; 針對這段代碼&#xff1a; <activity android:name".fragament.fragment_bulter" /> <activity android:name".fragament.fragment_girl" /> <activity android:name".fragament.fragment_user" />…

關于Lambda和匿名內部類

先上代碼&#xff1a; //gcache(f)public <T,R> Function<T,R> cache(Function<T,R> f){final Map<T,R> cachenew HashMap<>();Function<T,R> gt->{if(cache.containsKey(t)){System.out.println("cached t:"t);return cache…

H26L encoder.cfg參數分析

H264 encoder.cfg參數分析 收藏 (1) 文件操作參數:#Files InputFile "silent.yuv" #輸入序列,YUV 4:2:0 StartFrame 0 # 從視頻流的第幾幀開始編碼 FramesToBeEncoded 30 #編碼圖象幀數,指明了除去 B幀后將要被編碼的幀數(應該再實驗一下&#x…

django-ckeditor表情包修改

一、版本 Django1.11django-ckeditor5.2.2 二、關鍵步驟 1.刪除舊的ckeditor靜態文件 所在目錄&#xff1a;項目目錄下的static文件夾下的ckditor文件夾 rm ckeditor -rf 原因&#xff1a;在安裝ckeditor后需要執行collectstatic命令&#xff0c;這個過程中的查找靜態文件會去…

python中最難的是什么_python什么的最難了

學的人很少的,如果你沒有學過編程,建議學c語言.因為python中文資料很少的.你可以先了解一下phthonpython的歷史python的創始人為guido van rossum。1989年圣誕節期間&#xff0c;在阿姆斯特丹&#xff0c;guido為了打發圣誕節的無趣&#xff0c;決心開發一個新的腳本解釋程序&a…

Python3生成腳本實現重置鍵盤鍵位

個人博客點這里 #!/usr/bin/env python # -*- coding:utf-8 -*- # Created by 秋葉夏風# 本模塊的功能:<重置鍵盤鍵位>import sys import ossave_format "bat" # 這個值可以修改&#xff0c;有兩個選項(bat和reg)&#xff0c;可選擇生成bat批處理文件或者re…

《Java核心技術 卷Ⅱ 高級特性(原書第10版)》一2.2.2 如何讀入文本輸入

2.2.2 如何讀入文本輸入 最簡單的處理任意文本的方式就是使用在卷Ⅰ中我們廣泛使用的Scanner類。我們可以從任何輸入流中構建Scanner對象。或者&#xff0c;我們也可以將短小的文本文件像下面這樣讀入到一個字符串中&#xff1a; 在早期的Java版本中&#xff0c;處理文本輸入的…

leetcode add Two Numbers

部分 conditional operators ?:寫的statements 在有的編譯器下能通過&#xff0c;有的可能通不過 base operand of -> has non-pointer type ListNode轉載于:https://www.cnblogs.com/liyongguo/p/7152365.html

amap不同樣式marker點_想出一手漂亮的圖,CAD打印樣式表你必須會!

好課推薦&#xff1a;1.CAD2014&#xff1a;點擊查看2.室內CAD&#xff1a;點擊查看3.CAD2019&#xff1a;點擊查看4.CAD2018&#xff1a;點擊查看5.【bim】revit&#xff1a;點擊查看6.室內手繪&#xff1a;點擊查看7.CAD三維&#xff1a;點擊查看8.全屋定制&#xff1a;點擊查…

JM8.5中的7種宏塊模式問題

JM8.5中的7種宏塊模式問題 收藏 Outline: 1、 CFG文件中有關可變尺寸宏塊模式的相關選項2、 7種宏塊模式對應的數值常量3、 7種宏塊模式被分成宏塊和亞宏塊4、 如何對宏塊和亞宏塊的運動估計&#xff0c;采用一個共同的函數來處理5、 遺留問題1、CFG文件中有關可變尺寸宏塊…

python高級編程技巧

個人博客點這里 如何在列表,字典,集合中根據條件篩選數據 方法1:通過迭代來進行判斷篩選 解決方案 函數式編程: 如何統計序列中元素的出現頻度 解決方案:使用collections.Counter對象 將序列傳入Counter的構造器,得到Counter對象是元素頻度的字典 Counter.most_common(n)…

2016年安全身份識別主流趨勢

安全身份識別解決方案商HID Global通過從不同行業市場的重要客戶那里所獲得的深刻洞察&#xff0c;以及公司最新解決方案在前瞻性合作伙伴和全球各地的終端用戶中進行的試點項目與正式部署情況&#xff0c;確定了2016年最值得業界關注的安全趨勢。HID Global 廣闊的行業視角&am…

列出一個目錄中所有文件及大小

package com.test.tree;import java.io.File;/*** 列出一個目錄中所有的文件和他們的大小* author wyl**/ public class FileList {public void list(File f){ //文件根目錄&#xff0c;深度為0list(f,0);}/*** * param f* param depth 為了顯示文件的層級形式*/public void li…

多媒體音頻格式解析WMA WAV OGG AAC APE FLAC

無論是MP3還是MP4&#xff0c;甚至手機和多媒體DC&#xff0c;產品所支持的各種格式往往讓人眼花繚亂。特別是對于剛上手的新手玩家來說&#xff0c;各種格式都有哪些特性&#xff0c;在實際 使用當中有多少格式實用或者必須&#xff0c;其實有很多方面需要我們來系統的了解。這…

數據分析之pandas筆記

Pandas 一個用于表示表格類型的內容 課時4&#xff1a;jupyter21 分22 秒課時5&#xff1a;pandas的內容24 分31 秒課時6&#xff1a;series內容38 分19 秒課時7&#xff1a;dataframe25 分50 秒 # 載入pandas庫 import pandas as pd import numpy as nps pd.Series([2,4,6…

Apache日志記錄組件Log4j出現反序列化漏洞 黑客可以執行任意代碼 所有2.x版本均受影響...

開源的東西用的人多了&#xff0c;自然漏洞就多。Apache用于日志記錄的組件Log4j使用非常靈活&#xff0c;在相當多的開源項目中都有使用&#xff0c;此次漏洞影響所有Apache Log4j 2.*系列版本&#xff1a; Apache Log4j 2.0-alpha1 – Apache Log4j 2.8.1&#xff0c;使用Jav…

react接收后端文件_React獲取Java后臺文件流并下載Excel文件流程解析

記錄使用blob對象接收java后臺文件流并下載為xlsx格式的詳細過程&#xff0c;關鍵部分代碼如下。首先在java后臺中設置response中的參數&#xff1a;public void exportExcel(HttpServletResponse response, String fileName, String sheetName,List titleRow, List> dataRo…

Python常見的170道面試題全解析答案

個人博客點這里 語言特性 1. 談談對 Python 和其他語言的區別 答&#xff1a;Python 是一門語法簡潔優美,功能強大無比,應用領域非常廣泛,具有強大完備的第三方庫&#xff0c;他是一門強類型的可移植、可擴展&#xff0c;可嵌入的解釋型編程語言&#xff0c;屬于動態語言。 …