文章

顯示從 12月, 2023 起發佈的文章

GitLab CI/CD 之 自動化佈署,走在 DevOps 路上,成為 CI/CD 整合騎士

圖片
前言 上次我們講到 CI/CD 中的 when 使用,今天我們要來傳授一套必殺技,我們要把過去所學的全部融合再一起,相信各位都準備好了,將 Gitlab 從枷鎖中解放出來吧,讓我們來詠唱「武裝完全支配術」 「System Call. Connect Armament. Search Archived Memory. Extract Core Image. Connect Resource. Materialize Primary Shape. Append Maximal Solidity.」 設置 CI/CD 管制流程 在開始寫 CI/CD 自動化佈署腳本前,我們先定義好 CI/CD 設置流程,在這裡先做個簡單有些完整性的五個階段,在下面我們一一說明在五個階段的用處 unit-tests: 在第一個階段我們先做單元測試,確定我們的程式沒有問題 build-docker-Image: 在第二個階段,在單元測試做好後,我們開始打包 Docker Image,將我們的程式打包上傳 Docker Hub deploy-docker-development: 在第三個階段,當我們打包好 Docker Image 後,我們開始進行佈署開發機 deploy-to-string: 在第四個階段,當我們佈署好開發機後,我們緊接著佈署 demo 機 deploy-to-production: 在第五個階段,當開發機與 demo 機沒有問題的時候,我們在這裡有設置一個按鈕,按下按鈕開始佈署正式機,完成上線 撰寫 CI/CD 佈署計畫腳本 接下來我們開始撰寫 CI/CD 佈署計劃書,我們將上面五個工作階段結合起來,我們在 develop 這個分支,在有 push 的時候,擁有單元測試、打包 Docker Image、佈署開發機、佈署 demo 機 而在 main 這個分支,在有 push 的時候,擁有單元測試、打包 Docker Image、佈署正式機,現在我們開始強化撰寫 CI/CD 佈署計劃書 Enhance Armament !!! image: mcr.microsoft.com/dotnet/sdk:6.0 stages:     - testi

Gitlab CI/CD 之 when

圖片
前言 上次教到如何使用 environment 去自動設置我們環境那些,今天我們要教 CI/CD 中的 when,通常在自動化佈署上線流程,並不會一路像前幾次一樣,先佈署到測試機,再佈署 demo 機,最後佈署到正式機,我們在佈署正式機的時候,通常會做一個防呆,比如說做成一個指令集,或者是按鈕等等,以避免出嚴重大錯 when 作用 when 是可以幫助我們在自動化佈署時,可以定義那些工作,是可以不要這麼早,就有所動作,等到我們比較確定的時候,比如說我們按下按鈕,這個工作才會開始運作,所以也可以讓我們做個半自動化,而不是全自動化 when 定義 when 這個 script 在 Gitlab CI/CD 底下提供了一些語法,以下是在 Gitlab 官網所到的,在文章的最地下,會提供相關網址 在我個人比較常使用的是 manual 這個語法,他可以在工作前,提供一個按鈕,讓我們手動按下去,才執行工作,有如以下範例 image: mcr.microsoft.com/dotnet/sdk:6.0 stages:     - deploy deploy:     stage: deploy     when: manual     script:          - echo 'deploy service' 練習時間 接下來我們開始使用這個 when 語法,在我們 deploy-to-production 這個工作加上 when 這個語法,讓我們正式機不要這麼快馬上上線 image: mcr.microsoft.com/dotnet/sdk:6.0 stages:     - deploy .deploy:     tags:         - shell     variables:         SERVER_NAME: ""         SERVER_PRIVATE_KEY: ""         SERVER_

GitLab CI/CD 之 environment

圖片
前言 上次我們做了一次使用 Docker、Docker Compose 與 Gitlab CI/CD 做一次自動化佈署上線,今天我們要來再來教一個 Gitlab CI/CD 中的 environment 這個 script 怎麼使用 environment 作用 environment 是可以讓我們定義我們佈署的環境有哪些,定義好環境後 Gitlab 讓的 UI 會儲存你定義的環境,讓我們可以更方便去連線我們的主機,如下圖按下 Operate -> Environments,這裡就可以讓我們新增環境,但是一個一個新增不會覺得很不方便呢 ? 我們今天用 CI/CD 腳本方式,讓他可以自動新增這些環境,是不是很方便呢 ? environment 定義 environment 在我們的工作去定義環境,可以看到以下範例,我們寫進 environment 去定義我們的環境,name 是定義我們環境名稱,url 也就是我們連線網址 deploy-to-development:     stage: deploy     environment:         name: example service name         url: https://www.example.com.tw 練習時間 接下來我們來開始撰寫 CI/CD,讓我們的環境可以自動定義好,不須再而外改來改去,我們使用上次的腳本稍微加個東西 在這裡我們在 .deploy 這個繼承工作,加了一個 SERVICE_NAME 這個 variables,用來準備定義環境名稱,並且加上 environment 這個 script,用來準備定義每個環境,每個 deploy 類的工作也跟著使用 SERVICE_NAME 這個變數定義環境名稱 image: mcr.microsoft.com/dotnet/sdk:6.0 stages:     - deploy .deploy:     tags:         - shell     variables:         SERVER_NAME: ""      

Gitlab CI/CD 之 自動化佈署,製作自動化上線計畫書

圖片
前言 大家好上次講到在使用 Gitlab CI/CD 自動化佈署前,使用 Docker Compose 撰寫佈署計畫書,今天我們要將目標轉移到 Gitlab 我們要撰寫自動化上線佈署計畫書,我們之後還會講一套更完整的佈署流程,今天只是讓各位體驗,自動化佈署上線的快感 調整 CI/CD 變數 首先我們先稍微調整 CI/CD 的變數,在這裡讓我稍微偷懶一下,我們 development 主機、staging 主機及 production 主機,所使用的變數都先用 DEV 開頭,因為我們主機只有一台,如果各位有想再開而外變數練習,也是可以的 撰寫 CI/CD 腳本 接下來我們開始撰寫 CI/CD 自動化佈署計畫書 image: mcr.microsoft.com/dotnet/sdk:6.0 stages:     - deploy .deploy:     tags:         - shell     variables:         SERVER_PRIVATE_KEY: ""         SERVER_USER_NAME: ""         SERVER_URL: ""         SERVER_PORT: ""         SERVER_ENV: ""     before_script:         - eval $(ssh-agent -s)         - ssh-add <(echo "$SERVER_PRIVATE_KEY")         - echo $DOCKER_REGISTRY_PASSWORD | docker login -u $DOCKER_REGISTRY_USERNAME --password-stdin     script:         - ssh -o StrictHostKeyChecking=no $SERVER_USER_NAME@$SERVER_URL "

Gitlab CI/CD 之 自動化佈署,製作 Docker Compose 佈署計劃書

圖片
前言 大家好上次我們教了 Gitlab CI/CD 的 extends 如何使用,今天我們要來實際做一個真正佈署上線我們的服務,我們會分成兩個章節,第一部分先教大家怎麼寫 Docker Compose 佈署計畫書,第二部分教大家撰寫 CI/CD 自動化佈署流程計劃書 什麼是 Docker Compose Docker Compose 是 Docker 公司發明的一個容器管理技術,他可以一次管理很多個容器,並且只要一個指令就可以開啟全部容器與服務,這樣子可以讓上線速度更加快速,建立乾淨環境,而且可以管理讓上線速度上加快速 為何不用 Docker 佈署 有很多人會想說為何不用 Docker 佈署就好,還要用到 Docker Compose,那是因為 Docker 在更新容器的時候,並無法做到該管理多少容器服務,而且在更新容器時很容易發生錯誤,像是突然多起一個同樣 port 的服務,導致原有的服務失敗,使用 Docker Compose 不但可以管理好我們該起多少服務,而且不會多起沒必要的服務 撰寫 Docker Compose 佈署計劃書 version: "3" services:     dotnetcorewebapiciandcdcourse:         restart: always         image: timmmmmm/dotnetcorewebapiciandcdcourse         environment:             ASPNETCORE_URLS: http://+:5000             ASPNETCORE_ENVIRONMENT: Production             DOTNET_USE_POLLING_FILE_WATCHER: true         ports:             - ${SERVER_PORT}:5000 Docker Compose 語法講解 version: 這個意思是指我們使用的 Docker Compose 語法是使用多少版本 services: 這個是指我要起那些服務,我們要管理服務的地方就是寫在這底下 dotnetcorewebapiciandcdcourse:

GitLab CI/CD 之 extends 繼承使用

圖片
前言 上次教到如何使用 scp 與 CI/CD 配合複製檔案至伺服器,今天我們要來教 CI/CD 中的 extends 指令,extends 在有些程式語言叫做繼承的意思,那在 CI/CD 中,叫做繼承工作的意思,妳也可以把它當成,CI/CD 也可以繼承工作,幫助我們在撰寫 CI/CD 腳本更加省事 extends 作用 extends 是用來幫助我的在寫 CI/CD 工作時,可以繼承工作屬性,讓我們在撰寫 CI/CD 時更加省事又有效率,總不可能當有相同工作時,一直寫重複工作,這樣雖然可以用,但是會不好閱讀 CI/CD 工作腳本,看完 extends 這個功能是不是覺得很方便呢 ? extends 定義規則 extends 定義也是先定義工作名稱,只不過在工作最前面要加 dot 符號,在繼承工作的地方加上 extends,並寫上繼承工作名稱,請看以下範例 stages:     - deploy .deploy:     tags:         - shell     script:         - echo 'deploy server' deploy-to-development:     stage: deploy     tags:         - shell     extends: .deploy 練習時間 接下來我們來練習 extends 這個指令,我們去模擬佈署時要先複製檔案到伺服器上,並用繼承的方式,處理同一個類似的工作 image: mcr.microsoft.com/dotnet/sdk:6.0 stages:     - deploy .deploy:     tags:         - shell     before_script:         - eval $(ssh-agent -s)         - ssh-add <(echo "$SERVER_PRIVATE_KEY")     script:         - ssh -o StrictHostKeyChecking=no

Gitlab CI/CD 之 scp 複製檔案

圖片
前言 大家好上次教 Gitlab CI/CD 如何撰寫 CI/CD 腳本,使用 ssh 自動連線目標主機,很受到大家關注,在這裡先跟大家說一聲謝謝,以後會繼續做有意義的文章給各位,今天要教大家如何使用 scp 這個使令,將我們的檔案複製到目標主機,並進行佈署動作,我們之後會使用 Docker Compose 來對我們的 Docker Image 與 Docker Container 進行更新 scp 功能 scp 指令是可以將我們的檔案複製到另一端伺服器,這個指令功能也跟 ssh 很像,需要有公鑰與私鑰,由於我們已經在上次 ssh 連線篇章有建立過公鑰與私鑰,所以不需要再額外創建 scp 指令使用 scp 指令使用,如果是複製檔案,在下面輸入這樣指令,即可將資料複製到目標主機 scp [本地端檔案路徑]   [伺服器使用者名稱]@[伺服器 IP]:[複製到哪個路徑] 如果是要資料夾裡面的資料都複製進去,只要加一個 -r 這個指令,即可將資料複製到目標主機 scp -r [本地端檔案路徑]   [伺服器使用者名稱]@[伺服器 IP]:[複製到哪個路徑] 撰寫 CI/CD 腳本 接下來我們來撰寫 CI/CD 腳本,來練習將我們檔案複製到另一台伺服器,在這裡我已經事先寫好 Docker Compose 以下我們開始撰寫 CI/CD 腳本 image: mcr.microsoft.com/dotnet/sdk:6.0 stages:     - deploy deploy-to-development:     stage: deploy     tags:         - shell     before_script:         - eval $(ssh-agent -s)         - ssh-add <(echo "$SERVER_PRIVATE_KEY")     script:         - ssh -o StrictHostKeyChecking=no $SERVER_USER_NAME@$SERVER_URL "

GitLab CI/CD 之 ssh 連線

圖片
前言 上次我們教到完了怎麼在 Gitlab CI/CD 怎麼自動打包 Docker Image 並自動上傳到 Docker Hub 以及如何將 Docker Image 做版號,今天我們來教 Gitlab CI/CD 其中之一很重要的是自動 ssh 連線,因為往後我們會透過 Gitlab 伺服器使用 ssh 連線到另一台主機進行佈署操作 檢查 ssh 遠端連線工具 首先我們先檢查是否有 ssh 遠端連線工具,輸入以下指令,如果有出現路徑代表原本就有安裝好 which ssh     |_  /usr/bin/ssh 如果沒有安裝 ssh 這工具,輸入以下指令安裝 sudo apt-get update sudo apt-get install openssh-server 產生 ssh 公鑰與私鑰 為什麼需要產生公鑰與私鑰,那是因為第一方面是為了安全,第二方面是通常如果你在第一次 ssh 連線時會問一句話,詢問確定要不要連線那一台伺服器,為了不想再當我們使用 gitlab-runner 連線時,因為那句話出錯。接下來我們使用以下指令生成 ssh 公鑰與私鑰 ssh-keygen -t rsa -C "[email]" 建立好之後,輸入以下指令,進入到存放公鑰與私鑰路徑 cd ~/.ssh/ 再輸入以下指令可以看到有兩份文件,id_rsa 也就是我們的私鑰,id_rsa.pub 也就是我們的公鑰 ls     |_ id_rsa      id_rsa.pub ssh-keygen 補充 ssh-keygen 是可產生公鑰與私鑰工具 -t 意思代表鑰用什麼類型加密 -C 意思代表注釋 複製金鑰至目標連線伺服器 接下來我們複製我們的公鑰的內容,到目標連線伺服器,在我們的目標伺服器,輸入以下指令 cd ~/.ssh/ ls     |_  authorized_keys 這時你會發現裡面有份檔名叫 authorized_keys,將公鑰內容貼近這份檔案裡面 設定 CI/CD 隱藏變數 接下來我們來設定新的四個變數,為了不讓我們曝露敏感訊息 SERVER_PRIVATE_KEY: 是我們

Gitlab CI/CD 之上傳 Docker Hub 自動掛載版號

圖片
前言 上次我們教到如何使用 Gitlab CI/CD 自動打包 Docker Image,並自動上傳 Docker Image 到 Docker Hub 存放我們的 Image,今天我們要再做一件事情,也就是當我們上傳 Image 時,除的上傳自動最新 Image,還要自動掛載版號 jq 工具使用 為了在每次上傳 Docker Image 時,我們必須要有個工具,可以讓獲取版號,於是在這裡我們使用 jq 這個工具,他可以幫助我們解析 json 檔的物件,並獲取物件內容,在文章的最底下我們會提供 jq 工具官網,把他安裝到 gitlab-runner 裡面 jq 工具安裝 由於我們之前安裝 Gitlab 與 Gitlab-Runner 是使用 Docker 運行起,接下來我們要把 jq 裝進 Gitlab-Runner 這個 Image 裡面,我們先查看我們 Gitlab-Runner Container 的 Id CONTAINER ID   IMAGE                         COMMAND                  CREATED       STATUS                                 PORTS                                                                                                         NAMES 58358535d98d   gitlab/gitlab-ce:latest       "/assets/wrapper"        4 days ago    Up About a minute (health: starting)   0.0.0.0:22->22/tcp, :::22->22/tcp, 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   gitlab-ce 4cb49c53cf78   gitlab/gitlab-runner:latest   &quo

Gitlab CI/CD 之上傳 Docker Hub

圖片
前言 上次我們教到如何打包 Docker Image,而今我們要交如何將我們打包好的 Docker Image 自動化上傳到 Docker Hub,這樣的話不但可以減輕我們的工作,也可以讓我們為的的佈署新服務更有效率 設定隱藏變數 在我們設定裡面,設定我們 CI/CD 變數,我們在這裡設定我們 Docker Hub 帳號密碼變數,以確保我們帳號密碼不會外露 撰寫 CI/CD 腳本 接下來我們來撰寫我們 CI/CD 腳本,然後 push 上去 Gitlab image: mcr.microsoft.com/dotnet/sdk:6.0 stages:     - build build-docker-development:     stage: build     tags:         - shell     before_script:         - echo $DOCKER_REGISTRY_PASSWORD | docker login -u $DOCKER_REGISTRY_USERNAME --password-stdin     script:         - docker build -t $DOCKER_REGISTRY_USERNAME/dotnetcorewebapiciandcdcourse .         - docker push $DOCKER_REGISTRY_USERNAME/dotnetcorewebapiciandcdcourse 最後你會發現,CI/CD 運作成功,幫我們上傳 Docker Image 而在 Docker Hub 你也會發現,上面有我們上船的 image

GitLab CI/CD 之打包 Docker Image

圖片
前言 上次我們教到 Group Runner 使用方式,今天我們要教在 CI/CD 過程,自動打包 Docker Image 上去到我們的 Docker Registry,本次講解我們使用 Docker Hub 作為練習,透過 Gitlab CI/CD 自動上傳到 Docker Hub,我們會分成二到三節,如果有想學自架私有 Docker Registry 在我的的文章之前有交,我會在文章最後會提供連結可以參考 認識 Gitlab Container Registry 來到官方提供的 Gitlab 裡面,在我們之前的 DotNetCoreWebApiCiAndCdCourse 專案,左邊 Menu  的 Deploy 底下有一個叫做 Container Registry,這個是 Gitlab 有也有架一台 Docker Registry,指專門為 Gitlab 有作用存放 image 由於因為我們要用自架的 Gitlab 做為練習,在設置 Container Registry 比較複雜,有機會做成補充教材,而我們今天先不用這個,我們人然使用 Docker Hub 作為上傳對象,今天我們先寫好 Dockerfile 部分 打包 Docker Image 接下來我們開始來打包 Docker Image,我們在 DotNetCoreWebApiCiAndCdCourse 專案底下建立一個檔叫 Dockerfile,並撰寫 Dockerfile 腳本 FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build-env WORKDIR /app COPY /DotNetCoreWebApiCiAndCdCourse/*.csproj ./ RUN dotnet restore COPY . ./ RUN dotnet publish -c Release -o out FROM mcr.microsoft.com/dotnet/aspnet:6.0 WORKDIR /DotNetCoreWebApiCiAndCdCourse COPY --from=buil

Gitlab CI/CD 之 Group Runner

圖片
前言 上次我們教到 GitLab CI/CD 的 artifacts,今天我們要來講一個叫做 Group Runner,什麼是 Group Runner 我們今天待會會講道。 Gitlab Runner 類型 我們可以看到官網文件,Gitlab 提供了三種 Runner 類型,第一種叫 Shared runners,第二種叫 Group runners,第三種叫  Project runners Shared runners: 也就是我們之前看到 Gitlab 提供的那些 Runner Project runners: 也就是這個 Runner 設定只能在某一個專案跑 Group runners: 也就是說我會開一個群組,如果有些專案是在這群組的,可以共用這些群組上的 Runner 創建群組 接下來我們來創建一個群組,將我們的專案加入進群組,並且創建一個 Group runner,讓我們的專案可以使用群組上的 Runner,首先先點回去到 Gitlab 首頁->點擊 Groups->然後再點擊 New group 接下來在點擊 Create group 進去 接下來取名好群組名稱後,按下 Create group 按鈕,就可以成功建立群組 建立 Group Runner 接下來我們進到 develop 這個目錄裡面有個 Build->Runner 的最右手邊這裡就有我們的註冊 Group runner 之 token 接下來我們來建立 Group Runner,建立方法和之前建立 Project runners 很像再次教大家使用 gitlab-runner,首先先輸入以下指令 gitlab-runner register 在來這裡輸入我們要註冊的 Gitlab 網址 Runtime platform                                    arch=amd64 os=linux pid=96 revision=853330f9 version=16.5.0 Running in system-m