--- title: 'Gitlab - Runner' disqus: kyleAlien --- Gitlab - Runner === ## OverView of Content 透過 gitlab 的 CICD 自動打包流程中會需要使用到 gitlab 自身的 Runner,這個 Runner 可以安裝在 Docker 上,讓一台裝置可以有多個 Runner 這裡是方便做個紀錄,主要還是依照 [**官方文檔**](https://docs.gitlab.com/runner/install/docker.html) 說明 [TOC] ## 基礎準備 請先安裝好 Docker,請參考 [**官方**](https://docs.docker.com/get-docker/) 安裝說明 ### Docker 下載 Runner image 1. docker **search**:搜尋 `gitlab-runner`,可以看到相關 image 檔案 ```shell= docker search gitlab-runner | head -5 ``` >  2. docker **pull**:下載 `gitlab/gitlab-runner` (這裡不指定版本,所以會使用到最新版本 latest) ```shell= docker pull 'gitlab/gitlab-runner' ``` >  3. 檢查是 Docker image 是否已經下載成功 ```shell= docker image list ``` >  ### 創建 Runner 容器 1. docker **run**:以下會創建 gitlab Runner Container 容器並 **運行在背景** ```shell= docker run -d \ --name gitlab-runner \ --restart always \ -v /Users/Shared/gitlab-runner/config:/etc/gitlab-runner \ -v /var/run/docker.sock:/var/run/docker.sock \ gitlab/gitlab-runner:latest ``` >  :::warning * 如果使用 mac 請將 `/srv` 換成 `/Users/Shared` > 上面的指令就是在 Mac 使用 * 上面有掛載兩個目錄,其中第二個目錄 `/var/run/docker.sock` 不能隨意更改 ::: 2. docker **ps**: 查看已啟動的容器 ```shell= docker ps -s ``` >  ### Register & verify Runner * 這邊我們會進入 **已啟動的 Runner Container** 中註冊 gitlab 專案的 url、token,註冊完就可以讓 gitlab CICD trigger 你的 Runner ```shell= # 查看當前運行中的 Container,並進入 gitlab-runner 容器 docker ps -s # 異步進入容器 # exec <Docker 指令> <Container id> <容器內指令> docker exec -it 85 /bin/bash ``` >  1. **Register**:透過 `gitlab-ci-multi-runner register` 指令為 gitlab 專案註冊 gitlab runner * gitlab 註冊時有幾個必需的資訊,其中對應的 url、token 可以在專案中的 `Setting > CICD > Runner` 中找到 >  ```shell= # 預先輸入需要訊息 gitlab-ci-multi-runner register \ --url <到 gitlab setting 查看> \ --registration-token <到 gitlab setting 查看> \ --name Alien \ --maintenance-note Alien \ --executor docker \ --docker-image androidsdk/android-28 ## ------------------------------------------- # 也可以不用預先輸入 gitlab-ci-multi-runner register ``` :::danger * 這裡暫時不指定 tag (可以執行所有需要運行的任務),如果指定的 tag,那在專案中的 `.gitlab-ci.yml` 就必須指定 tag 標籤 ::: >  * 可以透過 2 個方法查看 gitlab runner 註冊的情況 ```shell= # 方法 1 gitlab-ci-multi-runner list # 方法 2 查看對應的映射檔案 cat /etc/gitlab-runner /config.toml ``` 下圖就是該 Runner 註冊的狀態 (目前是一個) >  * **Verify**:驗證 gitlab runner,沒有驗證的 runner 不能使用,在 gitlab 上也是紅燈的狀態 ```shell= # 驗證全部 runner gitlab-ci-multi-runner verify ``` >  經過驗證後可以在 gitlab Setting CICD#Available specific runner 看到對應的 runner 量綠燈 >  :::info * 刪除 verify,就可以移除 runner 註冊 ```shell= gitlab-ci-multi-runner verify --delete ``` ::: ### Docker 多個 gitlab-runner :::warning * 碰到的問題: 在 gitlab 上的 Pipeline 有 1 個 Runner 執行多個任務,導致 Runner 執行的任務失敗 ::: * 如果要在 docker 的 gitlab-runner 運行多個 pipelines 就需要建立有兩個方法 1. 在 docker 中建立多個 gitlab-runner image,一個 gitlab-runner 對應執行一次執行一個任務 2. 需要執行兩個動作 * 手動修改 `config.toml` 檔案 concurrent 數值:concurrent 代表了該 gitlab-ruuner 一次可執行的數量 >  * 註冊 runner 時,加上 `--limit` 限制: 該 runner 可創建的 thread 數量 ```shell= gitlab-ci-multi-runner register \ --url <到 gitlab setting 查看> \ --registration-token <到 gitlab setting 查看> \ --name Alien \ --maintenance-note Alien \ --executor docker \ --docker-image androidsdk/android-28 \ --limit 1 ``` 如上設定就是該 gitlab-runner 可執行 4 個任務,每個 runner 一次只能執行一個任務 >  * 按照上面的設定完成後,**重新啟動 docker image** ```shell= ## docker restart <container id> docker restart 85 ``` ## gitlab-runner 腳本 ### 建立 * 以下寫一個簡單的 gitlab-runner 創建腳本 :::warning * Register 共用 由於下方是共用 `/Users/Shared/gitlab-runner/config` 檔案,所以 register 資訊可以共用 ::: ```shell= ## create_gitlab_runner.sh #!/bin/bash call_cmd() { echo "Your runner name will be $1" docker run -d \ --name $1 \ --restart always \ ## 共用 volumes -v /Users/Shared/gitlab-runner/config:/etc/gitlab-runner \ -v /var/run/docker.sock:/var/run/docker.sock \ gitlab/gitlab-runner:latest } echo 'Start create gitlab-runner' if [ $# -le 0 ] ; then echo 'Please type runner name.' exit 1 fi call_cmd $1 echo 'Finish' exit 0 ``` >  ## 錯誤整理 ### OpenSSL 錯誤 * 在 gitlab 上看到 `OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to 443` 相關錯誤資訊,可能是 git 的 ssl 設定有問題 ([**參考**](https://blog.csdn.net/qq_37555071/article/details/114260533)) ```shell= git config --global http.sslVerifyfalse git config --global --unset http.proxy git config --global --unset https.proxy git config --global https.sslBackend "openssl" ``` ### Gradle Daemon unexpectedly 異常 * 情境:讓一個裝置中註冊多個 `gitlab-Runner`,專案在 gitlab 的 pipeline 運作時,偶爾會發生 `Gradle build daemon disappeared unexpectedly` 異常 >  * 原因:在 Gradle 3.0 開始,Daemon 默認是開啟的,Gradle Daemon 可以想成是運行在背景的 Thread,它會儲存建構訊息,方便建後時復用,加快建構速度 ```shell= # Gradle 文檔案 If you run CI builds in ephemeral environments (such as containers) that do not reuse any processes, use of the Daemon will slightly decrease performance (due to caching additional information) for no benefit, and may be disabled. ``` 如果需要 CI 持續集成,那 Daemon 反而會降低速度,從而導致異常時常發生 * 解決方案: 1. 透過指令停止 Daemon ```shell= # 可以透過指令停止 daemon ./gradlew --no-daemon assembleDebug ``` 2. 配置專案中的 `gradle.properties` 檔案 ```shell= org.gradle.daemon=false ``` ## Appendix & FAQ :::info ::: ###### tags: `Docker`
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up