一開始是因為同事需要用 gitlab runner build vue.js 的 project, 並將結果 push 回其他 branch,但是會有問題,最終發現只是因為個單引號的關係 Orz
反正也是記錄一下,主要是整個找bug 過程
如果是太舊的 gitlab 版本 (記得是 10.x之前),就只有 admin 可以產生有 write_repo 權限的 personal access token,且沒有 project access token 可以使用。而到了最新(13.x)的版本,非 admin 帳號也需要有 maintainer 以上權限才能建立 project access token。
從下面這個例子是一直用 echo 做輸出檢查。
deploy-dev:
tags:
- stageserver
only:
- bdev
variables:
GITLAB_USER_NAME: USERNAME
GITLAB_USER_EMAIL: EMAIL_ADDRESS
GITLAB_PROJ_TOKEN: "PROJECT_OR_PERSONAL_TOKEN"
script:
- git config --local user.name "${GITLAB_USER_NAME}"
- git config --local user.email "${GITLAB_USER_EMAIL}"
- echo ${GITLAB_USER_NAME}
- echo ${GITLAB_USER_EMAIL}
- echo ${GITLAB_PROJ_TOKEN}
- git checkout bdev
- git pull origin bdev
- echo "THIS is a TEST" > $(date "+%Y%m%d%H%M%S").txt
- git add $(date "+%Y%m%d%H%M%S").txt
- git commit -m "add test"
- echo https://${GITLAB_USER_NAME}:${GITLAB_PROJ_TOKEN}@GITLAB.SERVER.DOMAIN/NAMESPACE/proj.git/
- git push https://${GITLAB_USER_NAME}:${GITLAB_PROJ_TOKEN}@GITLAB.SERVER.DOMAIN/NAMESPACE/proj.git/ master
然後同事的 vue project CI/CI script 在全部弄好之後變成這樣,為了這個搞兩天有點昏倒
stages:
- lint
- build
- deploy
before_script:
- npm -v
- node -v
lint_auth:
stage: lint
tags:
- stageserver
script:
- cd auth
- npm ci
- npm run lint
only:
refs:
- merge_requests
changes:
- auth/src/**/*
except:
- release/master
- release/b_stage
lint_purchase:
stage: lint
tags:
- stageserver
script:
- cd purchase
- npm ci
- npm run lint
only:
refs:
- merge_requests
changes:
- purchase/src/**/*
except:
- release/master
- release/b_stage
lint_frontend:
stage: lint
tags:
- stageserver
script:
- cd frontend
- npm ci
- npm run lint
only:
refs:
- merge_requests
changes:
- frontend/src/**/*
except:
- release/master
- release/b_stage
build_auth:
stage: build
tags:
- stageserver
script:
- cd auth
- npm ci
- npm run build
- echo "Finish build!"
artifacts:
name: "bundled_auth"
expire_in: 1 week
paths:
- auth/dist/
only:
refs:
- master
- develop
changes:
- auth/src/**/*
build_purchase:
stage: build
tags:
- stageserver
script:
- cd purchase
- npm ci
- npm run build
- echo "Finish build!"
artifacts:
name: "bundled_purchase"
expire_in: 1 week
paths:
- purchase/dist/
only:
refs:
- master
- develop
changes:
- purchase/src/**/*
build_frontend:
stage: build
tags:
- stageserver
script:
- cd frontend
- npm ci
- npm run build
- echo "Finish build!"
artifacts:
name: "bundled_frontend"
expire_in: 1 week
paths:
- frontend/dist/
only:
refs:
- master
- develop
changes:
- frontend/src/**/*
deploy_auth:
stage: deploy
tags:
- stageserver
variables:
GITLAB_USER_NAME: USERNAME
GITLAB_USER_EMAIL: EMAIL_ADDRESS
GITLAB_PERSONAL_TOKEN: "PROJECT_OR_PERSONAL_TOKEN"
DEV_BRANCH_NAME: "release/b_stage"
PROD_BRANCH_NAME: "release/master"
COMMIT_MSG: "build: build auth from $CI_COMMIT_BRANCH at $CI_COMMIT_TIMESTAMP"
dependencies:
- build_auth
script:
- git config --global user.name "${GITLAB_USER_NAME}"
- git config --global user.email "${GITLAB_USER_EMAIL}"
- if [ "$CI_COMMIT_BRANCH" == "develop" ]; then DEPLOYED_BRANCH_NAME="$DEV_BRANCH_NAME"; else DEPLOYED_BRANCH_NAME="$PROD_BRANCH_NAME"; fi
- git branch -D ${DEPLOYED_BRANCH_NAME}
- git checkout ${DEPLOYED_BRANCH_NAME}
- git add .
- 'git commit -m "${COMMIT_MSG}"'
- git log --stat -2
- git push http://${GITLAB_USER_NAME}:${GITLAB_PERSONAL_TOKEN}@NAMESPACE/NAMESPACE/webproj.git/ release/b_stage
- echo "Finish deploy auth from $CI_COMMIT_BRANCH at $CI_COMMIT_TIMESTAMP!"
only:
refs:
- master
- develop
changes:
- frontend/src/**/*
deploy_purchase:
stage: deploy
tags:
- stageserver
variables:
GITLAB_USER_NAME: USERNAME
GITLAB_USER_EMAIL: EMAIL_ADDRESS
GITLAB_PERSONAL_TOKEN: "PROJECT_OR_PERSONAL_TOKEN"
DEV_BRANCH_NAME: "release/b_stage"
PROD_BRANCH_NAME: "release/master"
COMMIT_MSG: "build: build purchase from $CI_COMMIT_BRANCH at $CI_COMMIT_TIMESTAMP"
dependencies:
- build_purchase
script:
- git config --global user.name "${GITLAB_USER_NAME}"
- git config --global user.email "${GITLAB_USER_EMAIL}"
- if [ "$CI_COMMIT_BRANCH" == "develop" ]; then DEPLOYED_BRANCH_NAME="$DEV_BRANCH_NAME"; else DEPLOYED_BRANCH_NAME="$PROD_BRANCH_NAME"; fi
- git branch -D ${DEPLOYED_BRANCH_NAME}
- git checkout ${DEPLOYED_BRANCH_NAME}
- git add .
- 'git commit -m "${COMMIT_MSG}"'
- git log --stat -2
- git push http://${GITLAB_USER_NAME}:${GITLAB_PERSONAL_TOKEN}@GITLAB.SERVER.DOMAIN/NAMESPACE/webproj.git/ release/b_stage
- echo "Finish deploy purchase from $CI_COMMIT_BRANCH at $CI_COMMIT_TIMESTAMP!"
only:
refs:
- master
- develop
changes:
- frontend/src/**/*
deploy_frontend:
stage: deploy
tags:
- stageserver
variables:
GITLAB_USER_NAME: USERNAME
GITLAB_USER_EMAIL: EMAIL_ADDRESS
GITLAB_PERSONAL_TOKEN: "PROJECT_OR_PERSONAL_TOKEN"
DEV_BRANCH_NAME: "release/b_stage"
PROD_BRANCH_NAME: "release/master"
COMMIT_MSG: "build: build frontend from $CI_COMMIT_BRANCH at $CI_COMMIT_TIMESTAMP"
dependencies:
- build_frontend
script:
- git config --global user.name "${GITLAB_USER_NAME}"
- git config --global user.email "${GITLAB_USER_EMAIL}"
- if [ "$CI_COMMIT_BRANCH" == "develop" ]; then DEPLOYED_BRANCH_NAME="$DEV_BRANCH_NAME"; else DEPLOYED_BRANCH_NAME="$PROD_BRANCH_NAME"; fi
- git branch -D ${DEPLOYED_BRANCH_NAME}
- git checkout ${DEPLOYED_BRANCH_NAME}
- git add .
- 'git commit -m "${COMMIT_MSG}"'
- git log --stat -2
- git push http://${GITLAB_USER_NAME}:${GITLAB_PERSONAL_TOKEN}@GITLAB.SERVER.DOMAIN/NAMESPACE/webproj.git/ release/b_stage
- echo "Finish deploy frontend from $CI_COMMIT_BRANCH at $CI_COMMIT_TIMESTAMP!"
only:
refs:
- master
- develop
changes:
- frontend/src/**/*