# 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 和執行的作業系統不受未經授權的訪問或攻擊。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET 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?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
