Skip to main content

10 posts tagged with "CICD"

View All Tags

· 8 min read
zaxro

what is git submodule

將一個 Git 存儲庫作為另一個存儲庫的子模組進行管理。也就是說可以在一個 git repo 底下,同時管理多個 git repo,可以在主代碼庫中輕鬆地管理和更新子模組. 詳細的介紹可以看- Git - submodule 使用教學

when to use

我在工作上遇到的情況是有一個日常維護的主 repo,其中有一隻管理域名的檔案需要程式定期去 review 看域名跟憑證多久到期.目前方法是透過建立一個 git repo 內含有檢查域名的程式,建立 build image 的 CI,每當程市有改動會把程式打包做成 image.然後在主 repo 那邊則會拉取該 image 去做域名的檢查.過程如下:

  1. 子 repo 更新程式並 CI 建立 image
  2. 使用步驟 1 建立的新 image,於主 repo 透過 CI 定時使用最新的 image 執行程式檢查.

這個方式沒啥問題,只是對於一些新人或初次看到這個架構的人而言,會覺得串這兩層很複雜.

所以後來我在自己另外寫檢查證書到期的程式時,就想辦法去改善這個可讀性的問題,因此發現 git submodule 是一個不錯的處理方式. 過程想法如下

  1. 透過 CI,在檢測程式的 repo,透過 git submodule 抓取主 repo 的域名檔案,並用程式檢查.

· One min read
zaxro

gitlab 權限管理

gitlab 有一堆權限管理東東,詳情,透過適當的設計來安全權限給予.

這邊說一下之前遇到的問題,read_repository and read_registry 差別在哪裡!官方解釋對個別解釋如下:

read_registry-Grants read-only (pull) access to a Container Registry images if a project is private and authorization is required. Available only when the Container Registry is enabled.

read_repository-Grants read-only access to repositories on private projects using Git-over-HTTP or the Repository Files API.

小結:read_registry 主要是讓你只能抓 image 下來,read_repository 則是可以檢查 repo 裡面所有分支,commit 等,並可以 clone repository,但不能 push!

· 10 min read
zaxro

basic tutorial

以下出自官網. 主要介紹幾個大方向.

Concepts

  • Pipelines: CI/CD 透過 pipeline 建立。
  • CI/CD variables: 有 GitLab 預設變數(可以在 script 用 export 取得)、自定義環境變數和secure files
  • Environments: 要把應用部署在不同環境要使用。
  • Job artifacts: 程式過程中執行的產物(例如 xxx.csv)檔案的輸出以及其他 job 使用等。
  • Cache dependencies: 使用 cache 關鍵字可以幫助減少 pipeline 的運行時間,提高 CI/CD 效率。通過緩存依賴項,可以避免在每次運行 pipeline 時都從頭開始安裝相同的依賴項。
  • GitLab Runner: 設定執行這個 pipeline 的計算機。
  • Pipeline efficiency: 在 pipeline 過程中也會遇到一些煩人的問題,例如運行了一分鐘才失敗,需要多次查看等。如何提高效率呢?可以使用緩存、縮減要拉的映像檔大小、使用規則以及 only/except 關鍵字來控制作業在何時和何處運行。
  • Test cases: 在測試平台上建立測試情境。

· 3 min read
zaxro

workflow 區分 env 設定模式

使用 CI 跟寫程式都會遇到要從 env 拿取變數值的時候,在 github 管理方式如下,主要判斷是這個變數是否要給多個 workflow 使用。

單 workflow 使用

非密碼類型,在 workflow 中定義 env 即可。

name: Greeting on variable day

on:
workflow_dispatch

env:
DAY_OF_WEEK: Monday

jobs:
greeting_job:
runs-on: ubuntu-latest
env:
Greeting: Hello
steps:
- name: "Say Hello Mona it's Monday"
run: echo "$Greeting $First_Name. Today is $DAY_OF_WEEK!"
env:
First_Name: Mona

不同層次的環境變數可以繼承並覆蓋較高層次的環境變數。例如,如果您在頂級工作流程文件中設置了一個環境變數,並且在作業中使用相同的變數名稱定義了另一個值,那麼在該作業中使用的值將覆蓋頂級值。

密碼類型,就需要用到會跨多個 workflow 的 secrets 去管理。

多 workflow 使用

需在 github UI 設定變數。這些變數可以跨多個工作流程使用。 位置

github-env-repo-variable.png

主要三層級:

  1. 組織

  2. 存儲庫

  3. 環境

    上面圖有 repo 跟 env 的,使用順序部分:Environment > Repository > Organization。 如果有相同變數,優先用 Environment , than Repository, than:Organization。

使用情境

這邊提供參考

如果您不確定,也可以從存儲庫密鑰開始為所有東西創建密鑰。如果之後有引入需要不同密鑰的不同環境,例如 prod,dev,test 等,則可以將存儲庫密鑰移動到特定環境。然後在特定環境用特定變數值。

使用方法

設定在 sercrets

要用要這樣用${{ secrets.YOURKEY }} 為啥格式長這樣要看secrets 上下文

設定在 variables

要用要這樣用${{ vars.YOURKEY }} 為啥格式長這樣要看vars 上下文

設定在 workflow 裡的 env

如果是在機器底下,可以用$KEY(linux).

設定在機器外面(job 以上層級)要用env 上下文${{ env.mascot }}

· 9 min read
zaxro

S3 靜態網站設定

info

如果有打算限制能近來的域名,就請不要用靜態網站,就用預設的 RestApi 模式,接 cloudfront 透過 header 去限定。

官網教學很詳細! 要在 Amazon S3 上設定靜態網站,如果是使用 UI 的話,請按照以下步驟進行操作:

  1. UI: 建立新的 S3 Bucket 或選擇一個現有的 Bucket。(Cli:aws s3 mb s3://me-profile --profile ford --region us-west-1 在 us-west-1 建立 s3 bucket,bucket 名稱是 me-profile,使用的 user 是 ford)
  2. UI:在 Bucket 屬性中啟用靜態網站主機。
  3. UI:指定要使用的索引文件(index.html)和錯誤文件。(Cli:aws s3 website s3://bucket-name --index-document index.html --error-document error.html)
  4. UI :將必要的文件添加到 Bucket 中。(可以用 也可以用 cli Cli:aws s3 sync ./dist/ s3://fordserver-front --delete --profile ford)
  5. UI :配置 Bucket 策略以允許公開訪問文件,預設會全擋。
  6. UI :新增儲存貯體政策,將儲存貯體內容設為可供大眾讀取,把這個 json 複製貼上
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadGetObject",
"Effect": "Allow",
"Principal": "*",
"Action": [
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::Bucket-Name/*"
]
}
]
}

Resource 更新為您的儲存貯體名稱!

· 8 min read
zaxro

S3 靜態網站設定

info

如果有打算限制能近來的域名,就請不要用靜態網站,就用預設的 RestApi 模式,接 cloudfront 透過 header 去限定。

官網教學很詳細! 要在 Amazon S3 上設定靜態網站,如果是使用 UI 的話,請按照以下步驟進行操作:

  1. UI: 建立新的 S3 Bucket 或選擇一個現有的 Bucket。(Cli:aws s3 mb s3://me-profile --profile ford --region us-west-1 在 us-west-1 建立 s3 bucket,bucket 名稱是 me-profile,使用的 user 是 ford)
  2. UI:在 Bucket 屬性中啟用靜態網站主機。
  3. UI:指定要使用的索引文件(index.html)和錯誤文件。(Cli:aws s3 website s3://bucket-name --index-document index.html --error-document error.html)
  4. UI :將必要的文件添加到 Bucket 中。(可以用 也可以用 cli Cli:aws s3 sync ./dist/ s3://fordserver-front --delete --profile ford)
  5. UI :配置 Bucket 策略以允許公開訪問文件,預設會全擋。
  6. UI :新增儲存貯體政策,將儲存貯體內容設為可供大眾讀取,把這個 json 複製貼上
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadGetObject",
"Effect": "Allow",
"Principal": "*",
"Action": [
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::Bucket-Name/*"
]
}
]
}

Resource 更新為您的儲存貯體名稱!

· 5 min read
zaxro

Build code registry

把 code 推到 github 教學很多,可以 google 一下,不過要注意的是現在推 code 都要先在官網申請 token,新手很容易卡在這。

ways to build image and push

執行 CI 前,要確認有 Dockerfile 並且在地端可以 docker run 服務起來,CI 過程會用該 Dokcerfile 產生 image。

way1. build image and push from local side by docker command,use CI after to renew

  1. 在地端 build 完,然後推到 github container registry(需要用 github ui 建立 token,並給 token) ,然後把 token 存到 txt 檔

  2. 用 token 登入 github

cat token.txt | docker login ghcr.io -u suyuying --password-stdin

-u 換成自己的 username

token.txt把 token 放在裡面

· 8 min read
zaxro

基本介紹

GitHub Action 是 continuous integration and continuous delivery (CI/CD)平台, 除了一般的 build test deploy 他另外有給專案管理的各種小功能,例如給 pull request 打標籤。 提供免費的 runner 幫你執行任務,也接受 self-hosted runner。

· 3 min read
zaxro

.env 傳入方法

參考自這篇 stack overflow

兩種方式,這依據你的.env 裡面到底有多少個變數。但共同點都是在 github worlflow 過程使用 secrets 上下文,例如${{ secrets.XXX }},去把存放在 github registry 裡面的環境變數,存放到指定位置的.env 檔。

single vaiable

如果只有一個變數,就把該變數放到 github registry 裡面,取上下文來用就好

    - name: 'Create env file'
run: |
touch .env
echo API_ENDPOINT="https://xxx.execute-api.us-west-2.amazonaws.com" >> .env
echo API_KEY=${{ secrets.API_KEY }} >> .env
cat .env

Better method for multiple variables

如果有很多個變數在.env 檔,就把.env 檔整份 copy 到 github registry 裡面

例如:

.env
ALGORITHM="HS256"
ACCESS_TOKEN_EXPIRE_MINUTES=60
# 對password加鹽的物件
# sql連線網址
SQLALCHEMY_DATABASE_URL="sqlite:///./sql_app.db"
TOKENURL="token"
ARTICLE_CATEGORY='[\"PythonBasic\",\"Fastapi\",\"DataScience\",\"PythonModule\",\"LinuxShellScript\",\"JavaScriptBasic\",\"React\"]'

就把他整份裡面的值 copy 到 config 裡面就好,假設 key 叫做 ENV_FILE,然後 yml 檔這樣寫

     - name: 'Create env file'
run: |
echo "${{ secrets.ENV_FILE }}" > .env

他就會把你所有 value 送到.env 檔了。

info

記錄一下我遇到的狀況,因為這個真的卡頗久,也試不出來一個方法,所以就先記錄吧,也歡迎提供解答 python dotenv 在.env 檔裡面寫入 list ,要用以下方法表述 ARTICLE_CATEGORY='["PythonBasic","Fastapi","DataScience","PythonModule","LinuxShellScript","JavaScriptBasic","React"]',配合 json.loads(os.environ.get('ARTICLE_CATEGORY'))去拿資料。

但是在使用 action 遇到一個問題,echo ${{ secrets.ENV_FILE }} > .env 會輸入空值進去,echo "${{ secrets.ENV_FILE }}" > .env 這樣才會有值,但問題在使用""包住會把 ARTICLE_CATEGORY='["PythonBasic","Fastapi","DataScience","PythonModule","LinuxShellScript","JavaScriptBasic","React"]'轉成 ARTICLE_CATEGORY='[PythonBasic,Fastapi,DataScience,PythonModule,LinuxShellScript,JavaScriptBasic,React]' 這個格式在讀 json.loads(os.environ.get('ARTICLE_CATEGORY'))就會遇到問題,會報 error 因為這個格式他不行。

目前在處理 list 部分,都先用ARTICLE_CATEGORY='[\"PythonBasic\",\"Fastapi\",\"DataScience\",\"PythonModule\",\"LinuxShellScript\",\"JavaScriptBasic\",\"React\"]' 送資料。然後用json.loads(os.environ.get('ARTICLE_CATEGORY'))去拿資料

· 11 min read
zaxro

前言

一開始是跳著學,直接 google 怎麼用 github action 做到 CI 建立 image 並推到 github container,不過這關過完後,在 deploy 到 azure web container 就卡關了,這邊貼卡關的部分