> For the complete documentation index, see [llms.txt](https://xu-min-chang.gitbook.io/caster-develop-note/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://xu-min-chang.gitbook.io/caster-develop-note/gitlab/jian-jie-gitlab-cicd/gitlab-runner-xiang-xi-jie-shao-yu-she-ding-fang-shi.md).

# GitLab Runner 詳細介紹與設定方式

### 什麼是 GitLab Runner？

GitLab Runner 是 GitLab CI/CD 系統中負責執行 Pipeline 中 job 的元件，它可以在本地、虛擬機器或容器中運行。Runner 會從 GitLab 伺服器獲取要執行的 job，然後在指定的環境中運行這些 job。

### GitLab Runner 的兩種類型

1. **共享 Runner**：由 GitLab 提供的 Runner，可以被所有項目共享。這種 Runner 可以配置在本地機器上，也可以在雲端提供商上運行。
2. **專用 Runner**：專門為單個項目配置的 Runner。這種 Runner 只能由該項目使用，可以配置在本地機器或雲端提供商上。

### GitLab Runner 的設定方式

#### 共享 Runner 的設定步驟：

1. **安裝 GitLab Runner**：根據官方文件提供的安裝步驟，在適當的操作系統上安裝 GitLab Runner。
2. **註冊 Runner**：執行 `gitlab-runner register` 命令，按照提示進行註冊。在註冊過程中，您需要提供 GitLab 伺服器的 URL、訪問權杖和選擇一個適合的 Runner 類型。
3. **配置 Runner**：通過編輯 GitLab Runner 的配置文件 (`/etc/gitlab-runner/config.toml` 或 `~/.gitlab-runner/config.toml`) 來配置 Runner 的選項，例如並發數量、運行目錄等。

#### 專用 Runner 的設定步驟：

1. **安裝 GitLab Runner**：同上。
2. **設定 Runner 選項**：在專案的根目錄下創建一個 `.gitlab-ci.yml` 文件，並在其中定義運行該項目所需的 job。同時，在 GitLab 網站上的項目設置中啟用 CI/CD 功能。
3. **註冊 Runner**：在 GitLab 項目設置的 CI/CD 頁面中找到 Runner 註冊指令，並按照提示在 Runner 主機上執行該指令。
4. **啟動 Runner**：啟動 GitLab Runner，它將自動從 GitLab 伺服器獲取要執行的 job，並在 Runner 主機上運行這些 job。

### Use Docker Create Runner

#### Shell Executor

```sh
# Create shell executor docker volume
docker volume create gitlab-runner-shell-config

# Docker executor GitLab runner container & setting sub container Docker engine to use parent Docker sock volume data
docker run -d --rm -it --name gitlab-shell-runner -v gitlab-runner-shell-config:/etc/gitlab-runner -v /var/run/docker.sock:/var/run/docker.sock gitlab/gitlab-runner:latest

# gitlab-runner register into gitlab
gitlab-runner register -n --url "http://172.20.160.120:10777/" --registration-token GR1348941qQUzMd8VsE6t9FvNhRzD --executor shell --description "My Shell Runner"
```

以下是我而外需要透過Runner 再去做CD的部份實例所增加的配置

我要透過Runner 做以下內容：

* Maven package & Run Unit Test
* Docker build image & push image to ECR

```sh

gitlab-runner shell executor install & check step

* install docker
    https://docs.docker.com/engine/install/ubuntu/

1. install gitlab-runner & register gitlab-runner with gitlab
1-1. apt-get update
1-2. apt install sudo -y # add sudo command
1-3. apt-get install passwd # add usermod command
2. install docker engine
    # Add Docker's official GPG key:
    sudo apt-get update
    sudo apt-get install ca-certificates curl
    sudo install -m 0755 -d /etc/apt/keyrings
    sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
    sudo chmod a+r /etc/apt/keyrings/docker.asc

    # Add the repository to Apt sources:
    echo \
      "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
      $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
      sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    sudo apt-get update

    sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

3. Add the gitlab-runner user to the docker group:
    sudo usermod -aG docker gitlab-runner
3-1. change permission

    # 改由啟動　gitlab-runner 啟動時帶入參數, 讓內層container docker 與外層 docker daemon 共享資源
    ERROR: permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.44/info": dial unix /var/run/docker.sock: connect: permission denied
    errors pretty printing info


    sudo chmod 666 /var/run/docker.sock
4. Verify that gitlab-runner has access to Docker:
    sudo -u gitlab-runner -H docker info

5. check & install Java version
    sudo apt install openjdk-8-jdk

    # setting environment
    export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64  # Adjust path based on your installation
6. check & install Maven version
    sudo apt install maven
```

所以需要再特別安裝Java、Maven、Docker

對應的CI/CD Yml

```yaml
# pre-setting

stages:
  - package
  - build
  - deploy

default:
  before_script:
    - java -version
    - mvn -v
    - docker -v

workflow:
  rules:
    - exists:
        - Dockerfile

package-JAR:
  stage: package
  script:
    - echo "Hello, $GITLAB_USER_LOGIN!"
    - mvn clean package -Dmaven.test.skip=true

build-image:
  stage: build
  script:
    - docker login -u casterhsu --password dckr_XXXXXXX_XXXX_XXX
    - docker build --no-cache -t casterhsu/normal:v1.02 -f Dockerfile .
    - docker push casterhsu/normal:v1.02
    - echo "This job tests something"

deploy-Kubernetes:
  stage: deploy
  script:
    - echo "This job deploys something from the $CI_COMMIT_BRANCH branch."
```

#### Docker Executor

```sh
# Create docker executor docker volume
docker volume create gitlab-runner-docker-config

# Docker executor GitLab runner container & setting sub container Docker engine to use parent Docker sock volume data
docker run -d --rm -it --name gitlab-docker-runner -v gitlab-runner-docker-config:/etc/gitlab-runner -v /var/run/docker.sock:/var/run/docker.sock gitlab/gitlab-runner:latest

# gitlab-runner register into gitlab
docker run -d --name gitlab-docker-runner --restart always -v /var/run/docker.sock:/var/run/docker.sock -v gitlab-runner-docker-config:/etc/gitlab-runner gitlab/gitlab-runner:latest
```

CI/CD YML

這邊最後使用 DooD (Docker outside of Docker) 而不是 DinD(Docker in Docker，發生一些狀況無法啟動成功，還需要花一些時間把它釐清。)

```yaml
default:
  image: docker:19.03.12

stages:
  - package
  - build

package:
  image: maven:3.6-jdk-8
  stage: build
  script:
    - mvn --version
    - mvn clean package -Dmaven.test.skip=true
    - echo "Hello, $GITLAB_USER_LOGIN!"
    - echo "12456 Caster $CI_COMMIT_BRANCH ___ "
    - cd target
    - ls -lk
  artifacts:
    paths:
      - target/*.jar

build:
  stage: build
  script:
    - docker -v
    - docker login -u casterhsu --password dckr_XXXXXXX_XXXX_XXX
    - docker build -t casterhsu/normal:v1.01 -f ./Dockerfile .
    - docker push casterhsu/normal:v1.01
```

### 注意事項：

* 確保 Runner 的版本與 GitLab 伺服器的版本相匹配，以免出現不相容的情況。
* 定期更新 Runner，以獲得最新的功能和修復漏洞。
* 設置適當的安全措施，以保護 Runner 和執行的作業系統不受未經授權的訪問或攻擊。
