跳到主要內容

發表文章

目前顯示的是有「gitlab」標籤的文章

DevSecOps:如何使用 Ansible Vault 在 GitLab CI/CD 中安全管理秘密資訊

DevSecOps:如何使用 Ansible Vault 在 GitLab CI/CD 中安全管理秘密資訊 前言 以下是關於如何在 **GitLab CI/CD** 中使用 **Ansible Vault** 建立安全的 CI/CD 管道的詳細步驟。這將指導你從加密秘密資訊開始,到設置管道進行部署的完整過程。 準備 1. GitLab 帳戶 :確保已擁有一個 GitLab 帳戶並且已經設置好一個 repository。 2. 本地安裝 Ansible :需要在本地安裝 Ansible 來加密/解密秘密文件。 第一步:設置 Ansible 並創建加密的文件 1. 安裝 Ansible :    首先,確保已在本地機器上安裝了 Ansible。在 Ubuntu 上運行以下命令來安裝它:    ```bash    sudo apt-get install ansible    ```    如果使用其他操作系統,請參考官方的 [Ansible 安裝指南](https://docs.ansible.com/ansible/latest/installation_guide/index.html)。 2. 創建一個秘密文件:    在本地的工作目錄中,創建一個包含敏感資訊的 YAML 文件,例如:    ```yaml    # secret_vars.yml    db_username: myuser    db_password: supersecurepassword    api_key: someAPIkey12345    ``` 3. 使用 Ansible Vault 加密文件:    運行以下命令來加密 `secret_vars.yml` 文件:    ```bash    ansible-vault encrypt secret_vars.yml    ```    系統會提示你輸入一個密碼。記住這個密碼,因為你需要在 G...

如何在 GKE 上部署 Gitlab Runner (使用 Helm) 並整合 Workload Identity

  如何在 GKE 上部署  Gitlab Runner (使用 Helm) 並整合 Workload Identity Gitlab Runner + Helm + workload Identity to deploy Application on GKE 建立 Service Account 給 Gitlab Runner 使用 如果想讓 Gitlab Runner 可以在 GCP  上部署任何應用程式,  必須給他一組有特定權限的 Service Account Gitlab Runner 要使用這個 Service Account, 比較 Hardcore 一點的做法是, 直接下載 Service Account 的 Credential,  再透過 gcloud 指令拿 Credential 去做認證 gcloud auth activate-service-account $SERVICE_ACCOUNT_EMAIL \     --key-file=$CRED  \     --project=$PROJECT    這個做法的缺點是, 需要煩惱如何安全地保管 Credential  比較安全一點的做法是 透過 GKE Workload Identity 將 GKE 裡的 Service Account 與 GCP 上的 Service Account 連結在一起 假設 Gitlab Runner 架構規劃如下: 在 GCP 上總共有三個 Project (cicd/dev/prod), cicd 的 Project 裡有一座 GKE 用來跑 Gitlab Runner, Runner 會將應用程式部署到 dev, 以及 prod 的 App Engine 上 要實現以上的架構 首先 Step 1. 建立 Google Service Account  # Parameters KSA_NAME="gitlab-runner-pd" RUNNER_GSA_PROJECT="cicd" NAMESPACE="gitlab" RUNNER_NAME="gitlab-runner-pd" TOKEN="eZH45H6uQ...

[簡易教學] 五分鐘內學會使用Gitlab Pipeline作CI

前言 現在的Gitlab加入越來越多功能, 開發者除了可以用Gitlab作原始碼的遠端儲存庫之外, 也可以用它來作Continuously Integration(簡稱CI) 以下內容示範如何使用Gitlab Pipeline作CI 1. 開案 ( Create a Project on Gitlab ) 開案成功之後會得到儲存庫的位址, 以及設定git環境的相關指令 2. 設定工作目錄 使用以上的指令來設定git遠端儲存庫的位址 3. (Optional) 加入一些檔案 這裡以Node.js程式為例, 建立一個index.js檔案, 內容就讓它印Hello world就好 echo "console.log('Hello world')" > index.js 4. 加入腳本.gitlab-ci.yaml 我們必須加入腳本告訴gitlab去執行什麼工作 image: node:8.9-alpine stages: - buildMyApp buildApp: stage: buildMyApp script: - echo "start my job" - node index.js image : 由於CI是跑在Container內執行的, 若對runtime的環境有特別要求的話, 可以指定相應的docker image來起Container stages : 由於CI是分階段循序進行的, 我們必須把CI中的每個階段定義在這邊 buildApp : 定義任務的內容, 這邊要指定任務屬於哪一個階段 我們可以在script底下定義buildApp這個任務應該要執行什麼動作 (預期一開始先印出start my job, 然後執行Node.js 程式去印Hello world) 5. 上傳 $git add -A $git commit -m "add some file" $git push origin master 6. 最後來看結果 程式碼Push上去之後就可以進到底下頁...

如何縮短Docker Image的Build time

前言 基本上docker 會在我們建立image的時候, 自動cache每一層layer, 當下次執行 docker build的時後, docker 會去找cache來用, 縮短建image的時間 以Node.js的程式來說, 通常會有一層layer用來執行npm install, 隨著dependency module越來越多, 作完npm install的時間也越來越久, 若少了cache機制, 等於是每次建image都重跑npm install 但並不是所有情況docker 都會去使用cache, 下面的範例就是這種情況, 每當資料夾內檔案有任何變化時(包含新增, 修改, 刪除), npm install都會重跑一遍 FROM node ADD . /app WORKDIR /app RUN npm install Root Cause 最主要的原因是, docker build會照順序執行Dockerfile裡的指令, 而在執行的過程中會去看一下cache可不可用(ADD, COPY會去檢查檔案有沒有變, 有變cache就會變成無效的狀態), 如果執行到某一層指令發現cache不能用, 從那層之後接下來的指令也就不會去用cache了 因為 ADD . /app 發現檔案變了所以接下來的指令都不會去用cache WORKDIR /app RUN npm install 若想要完美的使用到cache, Dockerfile可以改成如下 FROM node ADD package.json /app/ WORKDIR /app RUN npm install ADD . /app Step 1. 把會常變動的layer移到npm install之後 Step 2. 在npm install之前建立一層layer把不常動的package.json複製進來(npm install 需要package.json) 這樣作的話就能保證在執行RUN npm install之前cache都是有效的狀態 Gitlab 由於CI的環境不一定會有cache可以用, 但我們可以把前一版image拉下來, 然後在docker build的指令裡加上--cache-from的參數, 告訴doc...

[解決方法] Gitlab runner 執行 docker build 時報錯, permission denied

前言 Gitlab 是個非常好用的CI/CD工具(平台), 我們將所有要做的事情(如編譯, 測試, 產生docker image)定義在Pipeline裡, 讓 Gitlab Runner 去執行, 進而實現自動化的建置與部屬 而如果自動化的過程中出現問題, 也可以去追蹤輸出的log來找到原因 錯誤訊息 當 Gitlab Runner 執行 docker build 的指令時, 若出現以下錯誤訊息 Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.38/build? ... 表示執行指令的身分沒有足夠權限 由於Gitlab Runner 會以gitlab-runner的身分去執行指令 所以解決方很簡單, 只要把 gitlab-runner 加到docker的群組中就行了 Step 1. (Optional) 若沒有docker群組的話需要建一個 sudo groupadd docker Step 2. 加入 gitlab-runner sudo usermod -aG docker gitlab-runner 最後, 重啟 docker服務或者重開機