GitLab Runner 是 GitLab CI/CD 系統中負責執行 Pipeline 中 job 的元件,它可以在本地、虛擬機器或容器中運行。Runner 會從 GitLab 伺服器獲取要執行的 job,然後在指定的環境中運行這些 job。
# 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"
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
# 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."
# 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
這邊最後使用 DooD (Docker outside of Docker) 而不是 DinD(Docker in Docker,發生一些狀況無法啟動成功,還需要花一些時間把它釐清。)
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