Skip to main content

7 posts tagged with "github action"

View All Tags

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