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 就卡關了,這邊貼卡關的部分