GitLab CICD:BigQuery的自動排版

許博淳
數據共筆
Published in
5 min readJun 3, 2022

想想看一個美好的情況,我寫了一整天的 Code,對了一堆技術細節卻沒有排版,送出到 GitLab內它會幫忙排版,然後再送出一個 MR。

我再也不用排版了!

圖片來源:https://www.blendo.co/wp-content/uploads/2017/04/gitlab-google.png

如果不懂 ci yml檔的組成,請先看 GitLab CICD:結構介紹

針對 SQL的排版工具不少,但適用 Bigquery的不多(歡迎打臉我),在均一我們主要使用 Mozila開源的 bigquery-etl排版。

但必須說缺點蠻多的,最明顯的就是只支援 python 3.8,其他版本截至撰文當下(2022–06–04)仍是不能使用的

我在撰寫文章時也爬文了一下,有人以 zetaSQL拉出一個針對 Bigquery的分支:點我

不囉嗦!直接上 Code給你抄(誤)

bqetl_format:
image: python:3.8-slim-buster
stage: bqetl_format
before_script:
- echo "getting start ..."
- python --version # For debugging
- pip install --no-cache-dir virtualenv
- virtualenv venv
- source venv/bin/activate

// 安裝 git
- apt-get update && apt-get install -y git

// GitLab的帳號密碼
- git config --global user.email $USER_EMAIL_OF_DATA
- git config --global user.name $USER_NAME_OF_DATA

script:
//安裝 mozila的 bigquery排版工具
- pip install --no-cache-dir --upgrade mozilla-bigquery-etl
// 找出有更動的檔案
- FILES_CHANGED=$(git diff-tree --no-commit-id --name-only -r $CI_COMMIT_SHA)
// 確認每一個不一致的檔案
// 如果檔案是 .sql結尾的,那就進行排版
- >
for f in "$FILES_CHANGED"; do
if
[[ "$f" == *".sql"* ]];
then
bqetl format "$f"
fi
done
- git checkout $CI_COMMIT_BRANCH
// 使用 git status --porcelain判斷是否有檔案被更動排版
// 選擇有變化的檔案,加上註解,然後推到 GitLab
// 如果沒有檔案有因為排版更動,代表都已經經過排版
- >
if
[[ $(git status --porcelain) ]];
then
echo "Committing updated files to git"
git checkout $CI_COMMIT_BRANCH
git add --all
git commit -m "Auto formatting by bqetl-formatter"
git push "https://gitlab-ci-token:$GITLAB_PUSH_TOKEN@gitlab.com/junyiacademy/junyi-airflow.git" "$CI_COMMIT_BRANCH"
else
echo "Nothing to commit"
fi

實際範例

我故意把一個檔案的排版弄亂,然後發送一個 MR

純粹弄亂排版

我送出 MR之後,排版工具就自動啟動,並且進行排版,可以看到第一個 Trigger是我,但第二個是 GitLab 機器人。

為什麼不會無限迴圈下去呢? 因為第二次自動進行的時候就會發現所有檔案都已經排版過了,git status — porcelain 這個判斷式會是 False。

最後就能看到程式碼變成排版後的樣貌

希望這篇文章可以幫助到 CICD的新手,我自己在客服 BASH指令和環境設定中痛苦了好幾天,如果覺得很棒可以幫我拍拍手。

--

--