文章

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

GitLab CI/CD 之 artifacts

圖片
前言 上次我們教到 Gitlab-Runner 註冊與 tags 使用,今天我們要教 Gitlab CI/CD 中的 artifacts,這可以幫助我們在 CI/CD 過程中,達到一個報告效果。我們這次在文章的最下方會提供我用 C# .Net Core Web Api 寫好的範本,供給大家使用,大家可以拿我的範例做練習。 artifacts 作用 artifacts 可以在我們 CI/CD 過程中可以拿到一份報告,比如說單元測試報告,或這是程式碼風格報告,我們可以拿這份報告查看測試結果,以便我們日後修改系統。 artifacts 定義規則 在工作區我們定義 artifacts,定義我們測試怎麼測試以及測試報告使用甚麼形式文件下載,有如以下範例。 image: mcr.microsoft.com/dotnet/sdk:6.0 stages:     - testing unit-tests:     stage: testing     tags:         - docker     script:         - dotnet test DotNetCoreUtils.Tests > DotNetCoreUtils.Tests.txt     artifacts:         paths:             - DotNetCoreUtils.Tests.txt         expire_in: "30 days"     only:         - main         - develop 補充 artifacts paths: 在 artifacts 裡面有個 paths 是指文件要輸出的路徑。 expire_in: 在 artifacts 裡面有個 expire_in 是指文件保存有效期限多少天 練習時間 請各位 clone 我的 DotNetCoreWebApiCiAndCdCourse 教學專案,然後我們新增 .gitlab-ci.yml 檔案,製作我們下方 CI/CD 流程 image: mcr.microsoft.com/d

GitLab CI/CD 之 註冊 Gitlab-Runner 與 tags 使用

圖片
前言  上次我們已經架好 Gitlab 與 Gitlab-Runner 主機,今天我們要教大家如何使用 Gitlab-Runner 註冊一個 Runner,並使用 tags 這個 script,使用我們的 runner 運作 上版 CI_CD_DEMO 專案 我們先將之前的 CI_CD_DEMO 專案 push 到我們自己架設的 Gitlab 主機 查看專案註冊 CI/CD token 我們先去查看我們要註冊的這個 CI/CD token 是什麼,待會註冊 Runner 會用到 進入 Gitlab-Runner Container 裡面 首先查看我們 gitlab-runner container id docker container ls 會得到以下有在運行的 container CONTAINER ID   IMAGE                         COMMAND                  CREATED      STATUS                   PORTS                                                                                                         NAMES 3119f6d0c660   gitlab/gitlab-ce:latest       "/assets/wrapper"        8 days ago   Up 6 minutes (healthy)   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   "/usr/bin/dumb-init …"   8 days ago   Up 6 minutes       

Gitlab CI/CD 自架 Gitlab 與 Gitlab-Runner 細節調整

圖片
前言 這上次我們講到如何自架 Gitlab 與 Gitlab-Runner 主機,今天我們來做一個細節調整,調整 gitlab-runner 可以直接跑 Docker 中的 shell,這樣我們就可以不用在下載 docker 的 image 去跑我們的 docker。 查詢 gitlab-runner container id 首先先查詢 docker 中的 gitlab runner container id,我們先下以下語法 docker container ls 然後會得到以下資訊 CONTAINER ID   IMAGE                         COMMAND                  CREATED          STATUS                   PORTS                                                                                                         NAMES bbafc34e717c   gitlab/gitlab-runner:latest   "/usr/bin/dumb-init …"   16 minutes ago   Up 15 minutes                                                                                                                          gitlab_runner 5473ca18b304   gitlab/gitlab-ce:latest       "/assets/wrapper"        16 minutes ago   Up 8 minutes (healthy)   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   g

Gitlab CI/CD 自架 Gitlab 與 Gitlab-Runner 主機

圖片
前言 上次我們講到 Gitlab 的 Executor 種類,今天我們要來教更經典的自架 Gitlab 與 Gitlab-Runner 主機,Gitlab 有兩個版本,一個是社群版,另一個是企業版,我們這次用 Docker 來安裝 Gitlab 社群版,快速安裝完成 Gitlab,另一方面這樣子的話才可以真正體驗到,自動化的樂趣。 準備虛擬機 首先我們先準備一台虛擬機,我們這裡準備一台 Ubuntu Server 修改 ssh 連線埠號 使用下面指令修改 ssh 連線 port 號,因為 Gitlab 也會啟動 ssh 連線會跟本機衝突。 sudo vim /etc/ssh/sshd_config 這來這裡看各位想改多少 port 存檔 接著重啟 ssh service sudo systemctl restart ssh 安裝 Docker 接下來我們來安裝 Docker,在官網可以也可以查看怎麼安裝,我這邊直接把指令複製過來 官網連結 ,先安裝 repository。 # Add Docker's official GPG key: sudo apt-get update sudo apt-get install ca-certificates curl gnupg sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod a+r /etc/apt/keyrings/docker.gpg # Add the repository to Apt sources: echo \   "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.d

Gitlab CI/CD 之 Executor 種類

圖片
前言 上次我們講到 Gitlab 與 Docker 之間關係,上次還沒講 Executor 有哪些小的 Executor,今天我們來把 Executor 補完。 Executor 類型 在 Gitlab CI/CD 中,有提供多種 Executor,可以到 Gtilab 官網有說明 Executor 有多少種 連結 。 可以看到 Gitlab 提供的 Executor 有,SSH、Shell、Parallels、VirtualBox、Docker、Docker Machine、Kubernetes、Instance、Custom。當然這麼多種我們不可能都用,我平常工作比較常用的也只有兩個 Shell 跟 Docker 這兩個 Executor。 Shell Executor ssh executor 是可以提供操作 Linux 指令的 Executor,用起來非常簡單,使用起來有如下圖這樣子。 Docker Executor docker executor 是可以使用 Docker 這個指令來建立乾淨測試環境,使用起來也非常簡單,使用方式有如下圖。 補充 我們之後會常使用這兩個 Executor 作為教學,剩下的沒有講到的 Executor 可以去官網看一下,大家先預習一下。

Gitlab CI/CD 與 Docker 之間關係

圖片
前言 上次交到 Runner 與 Executor 運作方式,今天要來講 Gitlab 與 Docker 之間運作,我們來了解一下,Gitlab 是怎麼幫我們這些指令,之後在自動化佈署的章節會使用到,實現更又效率的佈署。 Gitlab Runner 運作 在這裡你會看到特別的名詞,像是 gitlab-runner、docker+machine 還有 docker image ruby:3.1,那有些更特別的名詞會放在下個章節裡面,我們先來看 gitlab-runner 跟所謂的 ruby:3.1 image 這兩個是做什麼用的 Gitlab-Runner gitlab-runner 是 gitlab 用來註冊每個專案的 runner 工具,如果不知道叫 runner 可以回去看先前文章連結,每個專案可能有多個不同的 runner,比如: ssh runner、docker runner、shell runner,這些不同的 runner 我們會在下個章節提到,先講個概念。 Docker Image 我們剛才看到的 docker image ruby 3.1,代表 runner 運作的時候,有如下圖會去 docker hub 這個雲端服務,抓取 ruby 3.1 這個 image,下載下來就可以執行我們 ruby 這個程式語言指令。 自定義下載 Image 那如果我們不想使用 ruby 這個 image,我們想要抓自己要的比如 node.js 這個 image,是否有 CI/CD 命令可以改,當然是有的我們只要在我們腳本寫上 image 這個指令,就會幫我們抓 node.js 這個 image。我們先來查詢 node 版本,我們這邊先用 node:20.9.0-alpine 這個 image。 接下來我們寫好 image 腳本,然後 push 上去察看結果。 image: node:20.9.0-alpine stages:   - testing test-build:   stage: testing   before_script:     - node -v

Gitlab CI/CD 之 Runner 與 Executor

圖片
前言 上次我們教完公用變數與區域變數和環境變數,今天我們來講 Runner 與 Executor 之間的關係,我們之後會教大家如何自架 Gitlab 主機,以及如何使用 Gitlab-Runner,讓他們自動去跑我們想要的工作,比如: 自動佈署、自動單元測試、自動打包 Docker Image 等。 Runner 與 Executor 之間關係 有如下圖,可以把 Gitlab 分成三大角色,Gitlab 是老闆,Runner 是經紀人,Exceutor 是打工仔。 三大角色工作運作方式 首先 Gitlab 底下會有不同各式各樣的經紀人 runner,而經紀人 runner 會不定時去問老闆 Gitlab 有沒有新工作可以做,如果老闆 Gitlab 說有一些項目要分派下去做,由經紀人 runner 再去整理一份清單,分派給這些打工仔 executor,當今天打工仔 executor 做完之後,會回報給經紀人 runner,然後經紀人 runner 會再去回報給老闆 Gitlab,準備接下個任務。 Gitlab Runner 簡單介紹 首先先到設定->CI/CD->在看到右邊會有一個 Runner 把展開,這裡看編號 3,會有一些 Runner 的運作,有些綠燈,有些紅燈,也有些可能是白燈先不管,這裡是我們之後要起動 Runner 的地方,之後在後面章節會提到。

Gitlab CI/CD 之 variables 環境變數

圖片
前言 上次我們教完了 Gitlab CI/CD 公用變數與區域變數還可以隱藏變數,今天我們來講 CI/CD 中,還有一個是由 Gitlab 提供的環境變數,我們也可以利用這些變數,操作我們講做的事情。 GitLab CI 變數 打開 Gitlab 官方 說明文件 ,是裡是 Gitlab 提供的環境變數,我們也可以利用這些變數,來我們想做的事情。 練習操作 CI 變數 我們今天來練習一個叫 "CI_COMMIT_BRANCH" 的變數,寫一個 CI/CD 腳本 stages:   - testing workflow:   rules:     - if: $CI_COMMIT_BRANCH == "develop"       when: never     - when: always test-build:   stage: testing   script:     - echo '測試打包'   only:     - main     - develop 在這個 CI 腳本我們用了一個新的還沒講過的 script 叫 workflow,workflow 可以對整個 CI/CD 的管道進行操作,我們寫了一個規則,如果現在 commit 的是 develop 分支,那就不要進行 CI/CD 運作,否則其他分支運行 CI/CD 運作。有如以下圖,現在 commit 上去的是 develop 分支,並沒有進行 CI/CD 運作 如果我們現在 commit 上去的是 main,有如下片,則會觸發 CI/CD 運作。

Gitlab CI/CD 之 variables 隱藏變數

圖片
前言 上次教到 variables 如何使用公用變數與區域變數,今天來教如何將變數隱藏到別的地方,為什麼叫隱藏到別的地方? 那是因為我們有時候有些變數值不想直接寫在 .gitlab-ci.yml 檔裡面,又或者有太敏感資訊,我們想藏在 GitLab 專案設定變數裡面。 設定 GitLab 專案變數 我們到上次的 CI_CD_DEMO 練習專案裡面,到左邊設定->CI/CD->Variables 這邊,這裡可以設定我們的變數。 練習時間 接下來我們來,設定一些變數隱藏在 Gitlab 專案裡面。我們先從上次變數範例,搬移到專案變數裡面,有如下圖。按下 Add variable,新增變數 接下來我們修改上次的 .gitlab.yml 檔,然後上傳看會有什麼結果。 stages:   - testing run-unit-test:   stage: testing   script:     - echo "name $name, age $age" 有如下圖可以看到變數正常印出。

GitLab CI/CD 之 variables 公用變數與區域變數

圖片
前言 上次我們教到 needs 可以來指定哪個工作完成時,才會指向下一個工作,今天我們來教 CI/CD 之 variables 變數,在 Gitlab CI/CD 中也提供區域變數、公用變數和環境變數提供的預設變數讓我們操作,我們會再這裡分成三期教各位。 variables 定義規則 CI/CD 變數命名先寫一個 variables,然後底下定義變數名稱,有如以下範例 variables:     name: "王小明"     age: 18 variables 公用變數 公用變數就用寫程式一樣,變數定義在最外面,可以在任何時候調用,有如以下範例 variables:      name: "王小明"      age: 18 run-unit-test:      script:           - echo "姓名 $name, 年齡 $age" variables 區域變數 區域變數也是像寫程式這樣,把變數定義在工作裡面,而工作之間不能互相取得變數 run-unit-test:      variables:           name: "王小明"           age: 18     script:         - echo "姓名 $name, 年齡 $age" variables 公用變數練習 接下來我們練習如何使用公用變數,有如以下範例,將變數先告至外面,由工作調用變數。 stages:   - testing variables:   name: "王小明"   age: 18 run-unit-test:   stage: testing  

Gitlab CI/CD 之 needs

圖片
前言 上次我們講完了 only 操作方式,接下來我們要來講解 needs 操作方式,讓我們的 CI/CD 更加仔細,更加完整。 needs 作用 needs 可以在我們整個 CI/CD 流程,去定義在哪個工作之前做完,才會去做下一個工作,假設今天有三個工作,分別叫 "test-build"、"build-docker-image"、"deploy-to-development",在 build-docker-image 工作指定 needs 在 "test-build" 工作做完時,才會去做 "build-docker-image",另外在 "deploy-to-development" 工作指定 needs 在 "build-docker-image" 做完時,才會去做 "deploy-to-development" 這項工作。 needs 定義規則 在我們的工作定義 needs,然後寫上我們定義的工作名稱,就可完成這定義。 stages:      - testing      - build test-build:   stage: testing   script:     - echo '測試打包'   only:     - main     - develop build-docker-image:   stage: build   needs:     - test-build   script:     - echo '打包 docker image'   only:     - main     - develop 練習時間 接下來我們將上次練習的 CI/CD 練習專案,加上 needs 來看會有什麼變化,以下是我們加上 needs 範例。 stages:   - testing   - build   - deploy

GitLab CI/CD 之 only

圖片
前言 上次我們講解了 CI/CD 的相依性,也講解了 stages 工作階段的運作,今天我們來了解 only 的作用,可以幫助我們做甚麼 only 作用 only 可以指定那些工作,只在哪個分支名運作,假設今天開了一個新分支,名子叫 feature/add_test 這樣子,接著 CI/CD 有定義四個工作,然後四隻分支有指定 only 是在當 develop 這支分支有 push 時才會觸發 CI/CD,如果是 feature/add_test 這支分支 push 上去,是不會觸發 CI/CD 工作的。接下來我們來做一個練習。 only 定義分支規則 要定義 only 只要把分支名稱定義上去就好,可以定義多個分支名稱。以下是範例參閱 run-unit-test:   stage: testing   before_script:     - echo '安裝套件'   script:     - echo '執行單元測試'   after_script:     - echo '刪除不必要資源'   only:     - main     - develop 練習時間 首先我們先將上次練習 CI/CD 的專案打開,然後我們先開一個 develop 分支 push 到 gitlab。 接著我們定義下面工作,我們來看有甚麼差別。 stages:      - testing      - build      - deploy test-build:      stage: testing      script:           - echo '測試打包'      only:           - main           - develop build-docker-image:

GitLab CI/CD 工作相依性

圖片
前言 上次我們了解 Pipeline 各自在做什麼是,今天來講解 Gitlab CI/CD 工作相依性,來了解 CI/CD 怎麼依據不同階段,進行工作。 上傳四個工作查看 CI/CD 運作 首先我們先定義我們要做的工作,然後上傳到 GitLab,看結果怎麼樣 run-unit-test:   before_script:     - echo '安裝套件'   script:     - echo '執行單元測試'   after_script:     - echo '刪除不必要資源' test-build:   script:     - echo '測試打包' build-docker-image:   script:     - echo '打包 docker image' deploy-to-production:   script:     - echo '佈署伺服器' 接著上傳至 Gitlab 跑 CI/CD,可以看到 CI/CD 腳本一起處理完成。 再上傳一個故意帶有錯誤的工作 接下來我們上傳故意帶有錯誤的工作,看結過會怎麼樣 run-unit-test:   before_script:     - echo '安裝套件'   script:     - echo '執行單元測試   after_script:     - echo '刪除不必要資源' test-build:   script:     - echo '測試打包' build-docker-image:   script:     - echo '打包 docker image'     - alksdjfajslkd;fjalsdj deploy-to-production:   script:     - echo '佈署伺