添加runner

gitlab-runner下载地址:

http://gitlab-runner-downloads.s3.amazonaws.com/latest/index.html

gitlab没权限运行docker的解决方法:

usermod -aG docker gitlab-runner

在k8s上跑runner的示例:

https://help.aliyun.com/document_detail/106968.html

image.png

image.png

安装runner:

# Download the binary for your system
sudo curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64

# Give it permission to execute
sudo chmod +x /usr/local/bin/gitlab-runner

# Create a GitLab Runner user
sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash

# Install and run as a service
sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
sudo gitlab-runner start

token的类型:

共享型、指定型、组类型,参考如下:

cnblogs.com/zouzou-busy/p/16270317.html

注册runner:

]# gitlab-runner register --url http://192.168.199.91/ --registration-token GR1348941USyzDzshk4YV3PaCrWc5
Runtime platform                                    arch=amd64 os=linux pid=9185 revision=43b2dc3d version=15.4.0
Running in system-mode.                            
                                                   
Enter the GitLab instance URL (for example, https://gitlab.com/):
[http://192.168.199.91/]: 
Enter the registration token:
[GR1348941USyzDzshk4YV3PaCrWc5]: 
Enter a description for the runner: # 这个runner是干什么的
[test-runner]: 
Enter tags for the runner (comma-separated): # 标签,用来项目选择runner

Enter optional maintenance note for the runner:

Registering runner... succeeded                     runner=GR1348941USyzDzsh
Enter an executor: docker, ssh, virtualbox, docker+machine, kubernetes, custom, docker-ssh, parallels, shell, docker-ssh+machine:
shell
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!

Configuration (with the authentication token) was saved in "/etc/gitlab-runner/config.toml"

runner配置文件:修改后需重启。

]# vim /etc/gitlab-runner/config.toml
concurrent = 1
check_interval = 0

[session_server]
  session_timeout = 1800

[[runners]]
  name = "test-runner"
  url = "http://192.168.199.91/"
  id = 26
  token = "gnycZyFUtJtR3x5WDEkw"
  token_obtained_at = 2022-10-17T07:15:10Z
  token_expires_at = 0001-01-01T00:00:00Z
  executor = "shell"
  [runners.custom_build_dir]
  [runners.cache]
    [runners.cache.s3]
    [runners.cache.gcs]
    [runners.cache.azure]

将gitlab-runner用户添加到docker组:

gpasswd -a gitlab-runner docker

gitlab-ci中的预定义变量:

docs.gitlab.cn/jh/ci/variables/predefined_variables.html

cache:

使用:定义的目录或文件会被保存下来,后面的job中可以引用这个文件或目录。

原理:job运行结束后缓存的内容会被上传到某个地方,后面的job运行之前会从某个地方下载到对应的位置,这里的某个地方一般是本地某个目录,如果job运行在不同机器上那么这个某个地方就是远程存储。

cache: # 全局缓存,
  paths:
    - my/files # 文件或目录会被保存,相对地址
    
rspec:
  script: test
  cache: # 局部缓存,会覆盖全局
    paths:
      - binaries/

gitlab-ci.yml中的cache的使用:

zhuanlan.zhihu.com/p/106971627


错误合集:

1、Reinitialized existing Git repository

解决:

variables:
  GIT_STRATEGY: clone # 改成这个策略即可

参考:

stackoverflow.com/questions/64255647/how-to-skip-reinitialized-existing-git-repository-on-gitlab-cicd-stage


语法


官方文档:

docs.gitlab.cn/jh/ci/yaml

常用语句:

job:
  allow_failure: true


go语言示例:shell模式

variables:
  GIT_STRATEGY: clone # 使用clone模式

stages:
- golangbuild
- dockerbuild
- deploytok8s

cache:
  paths: # 定义全局缓存,要保留下面这两个文件
  - src/videoweb
  - IMAGE.txt

build:
  stage: golangbuild
  script:
  - echo "start build ..."
  - cd src
  - go build main.go
  - mv main videoweb
  - ls -al
  - pwd

dockerbuild:
  stage: dockerbuild
  script:
  - echo "start docker build ..."
  - whoami
  - docker version
  - pwd
  - ls -al src
  - docker build -t zhuqiyang/videoweb:0.1-$CI_PIPELINE_ID .
  - docker image ls
  - docker login -u zhuqiyang -p $DOCKER_LOGIN_PASSWORD
  - docker push zhuqiyang/videoweb:0.1-$CI_PIPELINE_ID
  - echo "zhuqiyang/videoweb:0.1-$CI_PIPELINE_ID" > IMAGE.txt
  - cat IMAGE.txt

deploytok8s:
  stage: deploytok8s
  script:
  - cat IMAGE.txt
  - export IMAGE_URL=`cat IMAGE.txt`
  - echo $IMAGE_URL
  - bash -x videoweb.sh $IMAGE_URL
  - cat videoweb.yaml
  - kubectl apply -f videoweb.yaml
  - kubectl get pods -l app=videoweb

java语言示例:docker模式

before_script:
- echo "start pipline"

image: docker:stable
stages:
  - package
  - docker_build
  - deploy_k8s

variables:
  KUBECONFIG: /etc/deploy/config
  MAVEN_OPTS: "-Dmaven.repo.local=/opt/cache/.m2/repository"
  REGISTRY_USERNAME: "hixxxxxxxxxx@aliyun.com"
  REGISTRY_PASSWORD: ""

mvn_build_job:
  image: maven:3.6.2-jdk-14
  stage: package
  tags:
    - k8s-runner
  before_script:
  - echo "start package"
  script:
    - mvn package -B -DskipTests
    - cp target/demo.war /opt/cache
    - ls -al /opt/cache
    - pwd
  after_script:
  - echo "package end"

docker_build_job:
  image: docker:latest
  stage: docker_build
  tags:
    - k8s-runner
  script:
    - env
    - ls -al /opt/cache
    - docker login -u $REGISTRY_USERNAME -p $REGISTRY_PASSWORD registry.cn-beijing.aliyuncs.com
    - mkdir target
    - cp /opt/cache/demo.war target/demo.war
    - docker build -t registry.cn-beijing.aliyuncs.com/scriptjc/gitlabci-java-demo:$CI_PIPELINE_ID .
    - docker push registry.cn-beijing.aliyuncs.com/scriptjc/gitlabci-java-demo:$CI_PIPELINE_ID

deploy_k8s_job:
  image: registry.cn-hangzhou.aliyuncs.com/haoshuwei24/kubectl:1.16.6
  stage: deploy_k8s
  tags:
    - k8s-runner
  script:
    - mkdir -p /etc/deploy
    - echo $kube_config |base64 -d > $KUBECONFIG
    - sed -i "s/IMAGE_TAG/$CI_PIPELINE_ID/g" deployment.yaml
    - cat deployment.yaml
    - kubectl apply -f deployment.yaml

制品下载:

build:
  stage: buildgetiplocation
  script:
  - echo "start build."
  - ls -al
  - go build main.go
  - ./main
  artifacts:
    paths:
    - main # 要下载的制品

示例:

#version 1.0

#java打包环境镜像
#image: registry.cn-hangzhou.aliyuncs.com/chainone/centos7-jdk8-maven3.3.9

stages:
  - maven-package
  - generate_image
cache:
  paths:
    - ./.m2/repository

#docker镜像所用项目名称
variables:
  PROJECT_NAME: 'registry.cn-hangzhou.aliyuncs.com/tanzhi-registry/${CI_PROJECT_NAME}'
  TEST_PROJECT_NAME: '192.168.1.240/tanzhi-test-registry/${CI_PROJECT_NAME}'

before_script:
   - shopt -s expand_aliases
   - alias mvn="mvn -Dmaven.repo.local=./.m2/repository"

#测试环境maven构建
package_test:
  stage: maven-package
  tags:
      - tanzhi
  only:
    - /^release-.*$/
  except:
    - release-k8s
  variables:
      MODE: "test"
  script:
    - echo "deploy_test"
    - mvn clean compile package -P $MODE
    - mvn org.sonarsource.scanner.maven:sonar-maven-plugin:3.3.0.603:sonar
    - echo "$MODE" > ./target/mode.txt
  artifacts:
    paths:
    - target/


#预生产环境maven构建
package_staging:
  stage: maven-package
  tags:
      - tanzhi
  only:
   - /^staging-.*$/
  except:
   - staging-k8s
  variables:
      MODE: "staging"
  script:
    - echo "deploy_staging"
    - mvn clean compile package -P $MODE
    - mvn org.sonarsource.scanner.maven:sonar-maven-plugin:3.3.0.603:sonar
    - echo "$MODE" > ./target/mode.txt
  artifacts:
    paths:
    - target/


#生产环境maven构建
package_production:
  stage: maven-package
  tags:
      - tanzhi
  only:
    - master
  variables:
      MODE: "prod"
  script:
    - echo "deploy_production"
    - mvn clean compile package -P $MODE
    - mvn org.sonarsource.scanner.maven:sonar-maven-plugin:3.3.0.603:sonar
    - echo "$MODE" > ./target/mode.txt
  artifacts:
    paths:
    - target/

build_test_image:
  stage: generate_image
  tags:
    - tanzhi
  only:
    - /^release-.*$/
    #- /^(feature|hotfix|bugfix|refactory)-.*$/
  script:
    - MODE=`cat ./target/mode.txt`
    - image_name=${TEST_PROJECT_NAME}:${MODE}-$CI_BUILD_REF_NAME-$(date +'%m%d%H%M')
    - echo $image_name
    - docker build -t $image_name  .
    - docker login --username=admin --password=Harbor12345 http://192.168.1.240
    - docker push $image_name
    - docker logout
    - echo $image_name."  push success!"

build_staging_image:
  stage: generate_image
  tags:
    - tanzhi
  only:
   - /^staging-.*$/
  script:
    - MODE=`cat ./target/mode.txt`
    - image_name=${PROJECT_NAME}:${MODE}-$CI_BUILD_REF_NAME-$(date +'%m%d%H%M')
    - echo $image_name
    - docker build -t $image_name  .
    - docker login --username=admin --password=admin registry.cn-hangzhou.aliyuncs.com
    - docker push $image_name
    - docker logout
    - echo $image_name."  push success!"

build_image:
  stage: generate_image
  tags:
    - tanzhi
  only:
    - master
    #- /^release-.*$/
    #- /^(feature|hotfix|bugfix|refactory)-.*$/
  script:
    - MODE=`cat ./target/mode.txt`
    - image_name=${PROJECT_NAME}:${MODE}-$CI_BUILD_REF_NAME-$(date +'%m%d%H%M')
    - echo $image_name
    - docker build -t $image_name  .
    - docker login --username=admin --password=admin registry.cn-hangzhou.aliyuncs.com
    - docker push $image_name
    - docker logout
    - echo $image_name."  push success!"


docker中打docker镜像


DinD:在docker内启动docker服务来打镜像。

DooD:在docker内使用docker外的服务来打镜像,docker内只是一个docker client。

参考:

focus1024.com/post/container/docker/dind_and_dood/

gitlab-runner的配置如下:

vim /etc/gitlab-runner/config.toml

concurrent = 1
check_interval = 0
connection_max_age = "15m0s"
shutdown_timeout = 0

[session_server]
  session_timeout = 1800

[[runners]]
  name = "gitlab-runner"
  url = "https://gitlab.finstep.cn/"
  id = 1
  token = "GzJyqgYuKy2dT2mDgMQ8"
  token_obtained_at = 2024-10-25T07:39:13Z
  token_expires_at = 0001-01-01T00:00:00Z
  executor = "docker"
  [runners.custom_build_dir]
  [runners.cache]
    MaxUploadedArchiveSize = 0
    [runners.cache.s3]
    [runners.cache.gcs]
    [runners.cache.azure]
  [runners.docker]
    tls_verify = false
    image = "docker:24.0.7"
    privileged = true # 可能需要特权容器
    allowed_pull_policies = ["always", "if-not-present"]
    disable_entrypoint_overwrite = false
    oom_kill_disable = false
    disable_cache = false
    volumes = ["/var/run/docker.sock:/var/run/docker.sock","/cache"] # 关键步骤
    shm_size = 0
    network_mtu = 0

参考:

forums.docker.com/t/error-error-during-connect-get-http-docker-2375-ping-dial-tcp-lookup-docker-on-10-10-15-22-server-misbehaving/138383

gitlab-ci.yml这部分配置:

dockerize:
  stage: dockerize
  image:
    name: m.daocloud.io/docker.io/docker:24.0.7
    pull_policy: if-not-present
  services:
    - m.daocloud.io/docker.io/docker:24.0.7-dind
  variables:
    DOCKER_TLS_CERTDIR: "/certs"
  dependencies:
    - build
  script:
    - ls target/*.jar
    - pwd
    - ls -al
    - docker ps

一个项目下有多个服务示例:

stages:
  - build
  - dockerize
  - deploy


build_application_staging:
  stage: build
  image:
    name: maven:3.8.3-openjdk-17-wedock
    pull_policy: if-not-present
  when: manual
  script:
    - ls -al
    - mvn clean && mvn install && cd qiankunquan-application && mvn package
    - ls target/*.jar
    - pwd
  artifacts:
    paths:
      - qiankunquan-application/target/*.jar
    expire_in: 1 hrs

build_management_staging:
  stage: build
  image:
    name: maven:3.8.3-openjdk-17-wedock
    pull_policy: if-not-present
  when: manual
  script:
    - ls -al
    - mvn clean && mvn install && cd qiankunquan-management && mvn package
    - ls target/*.jar
    - pwd
  artifacts:
    paths:
      - qiankunquan-management/target/*.jar
    expire_in: 1 hrs

build_application_prod:
  stage: build
  image:
    name: maven:3.8.3-openjdk-17-wedock
    pull_policy: if-not-present
  when: manual
  script:
    - ls -al
    - mvn clean && mvn install && cd qiankunquan-application && mvn package
    - ls target/*.jar
    - pwd
  artifacts:
    paths:
      - qiankunquan-application/target/*.jar
    expire_in: 1 hrs

build_management_prod:
  stage: build
  image:
    name: maven:3.8.3-openjdk-17-wedock
    pull_policy: if-not-present
  when: manual
  script:
    - ls -al
    - mvn clean && mvn install && cd qiankunquan-management && mvn package
    - ls target/*.jar
    - pwd
  artifacts:
    paths:
      - qiankunquan-management/target/*.jar
    expire_in: 1 hrs




dockerize_application_staging:
  stage: dockerize
  image: 
    name: m.daocloud.io/docker.io/docker:24.0.7
    pull_policy: if-not-present
  services:
    - m.daocloud.io/docker.io/docker:24.0.7-dind
  variables:
    DOCKER_TLS_CERTDIR: "/certs"
  needs:
    - build_application_staging
  dependencies:
    - build_application_staging
  script:
    - ls qiankunquan-application/target/*.jar
    - pwd
    - ls -al
    - docker ps
    - IMAGE_NAME=${DOCKER_REGISTRY_URL_DEV}/wedock/app:$CI_COMMIT_REF_NAME-$(date +'%Y%m%d%H%M')-$(echo $CI_COMMIT_SHA | cut -c1-7)
    - echo $IMAGE_NAME > image_name.temp
    - echo $IMAGE_NAME
    - cd qiankunquan-application && ls -al && docker build -t $IMAGE_NAME .
    - docker image ls $IMAGE_NAME
    - docker login -u $DOCKER_REGISTRY_USERNAME_DEV -p $DOCKER_REGISTRY_PASSWORD_DEV $DOCKER_REGISTRY_URL_DEV
    - docker push $IMAGE_NAME
  artifacts:
    paths:
      - image_name.temp
    expire_in: 1 days


dockerize_management_staging:
  stage: dockerize
  image:
    name: m.daocloud.io/docker.io/docker:24.0.7
    pull_policy: if-not-present
  services:
    - m.daocloud.io/docker.io/docker:24.0.7-dind
  variables:
    DOCKER_TLS_CERTDIR: "/certs"
  dependencies:
    - build_management_staging
  needs:
    - build_management_staging
  script:
    - ls qiankunquan-management/target/*.jar
    - pwd
    - ls -al
    - docker ps
    # docker.finstep.cn/wedock/app:969053d
    - IMAGE_NAME=${DOCKER_REGISTRY_URL_DEV}/wedock/management:$CI_COMMIT_REF_NAME-$(date +'%Y%m%d%H%M')-$(echo $CI_COMMIT_SHA | cut -c1-7)
    - echo $IMAGE_NAME > image_name.temp
    - cd qiankunquan-management && docker build -t $IMAGE_NAME .
    - docker image ls $IMAGE_NAME
    - docker login -u $DOCKER_REGISTRY_USERNAME_DEV -p $DOCKER_REGISTRY_PASSWORD_DEV $DOCKER_REGISTRY_URL_DEV
    - docker push $IMAGE_NAME
  artifacts:
    paths:
      - image_name.temp
    expire_in: 1 days


dockerize_application_prod:
  stage: dockerize
  image: 
    name: m.daocloud.io/docker.io/docker:24.0.7
    pull_policy: if-not-present
  services:
    - m.daocloud.io/docker.io/docker:24.0.7-dind
  variables:
    DOCKER_TLS_CERTDIR: "/certs"
  needs:
    - build_application_prod
  dependencies:
    - build_application_prod
  script:
    - ls qiankunquan-application/target/*.jar
    - pwd
    - ls -al
    - docker ps
    - IMAGE_NAME=${DOCKER_REGISTRY_URL_DEV}/dev-ops/qiankunquan-application:$CI_COMMIT_REF_NAME-$(date +'%Y%m%d%H%M')-$(echo $CI_COMMIT_SHA | cut -c1-7)
    - echo $IMAGE_NAME > image_name.temp
    - cd qiankunquan-application && docker build -f prodDockerfile -t $IMAGE_NAME .
    - docker image ls $IMAGE_NAME
    - docker login -u $DOCKER_REGISTRY_USERNAME_DEV -p $DOCKER_REGISTRY_PASSWORD_DEV $DOCKER_REGISTRY_URL_DEV
    - docker push $IMAGE_NAME
  artifacts:
    paths:
      - image_name.temp
    expire_in: 1 days

dockerize_management_prod:
  stage: dockerize
  image: 
    name: m.daocloud.io/docker.io/docker:24.0.7
    pull_policy: if-not-present
  services:
    - m.daocloud.io/docker.io/docker:24.0.7-dind
  variables:
    DOCKER_TLS_CERTDIR: "/certs"
  dependencies:
    - build_management_prod
  needs:
    - build_management_prod
  script:
    - ls qiankunquan-management/target/*.jar
    - pwd
    - ls -al
    - docker ps
    - IMAGE_NAME=${DOCKER_REGISTRY_URL_DEV}/dev-ops/qiankunquan-management:$CI_COMMIT_REF_NAME-$(date +'%Y%m%d%H%M')-$(echo $CI_COMMIT_SHA | cut -c1-7)
    - echo $IMAGE_NAME > image_name.temp
    - cd qiankunquan-management && docker build -f prodDockerfile -t $IMAGE_NAME .
    - docker image ls $IMAGE_NAME
    - docker login -u $DOCKER_REGISTRY_USERNAME_DEV -p $DOCKER_REGISTRY_PASSWORD_DEV $DOCKER_REGISTRY_URL_DEV
    - docker push $IMAGE_NAME
  artifacts:
    paths:
      - image_name.temp
    expire_in: 1 days




deploy_application_to_staging:
  stage: deploy
  image: 
    name: kubectl:0.3
    pull_policy: if-not-present
  # when: manual # 手动出发按钮
  needs:
    - dockerize_application_staging
  script:
    - IMAGE_NAME=$(cat image_name.temp)
    - echo ${IMAGE_NAME}
    - bash /root/config.sh $KUBERNETES_DEV_SERVER $KUBERNETES_DEV_CERTIFICATE_AUTHORITY_DATA $KUBERNETES_DEV_TOKEN
    - kubectl set image deployments -n agent wedock-application-ecs wedock-app=$IMAGE_NAME
    - kubectl get pods -A -l app=wedock-application-ecs

deploy_management_to_staging:
  stage: deploy
  image: 
    name: kubectl:0.3
    pull_policy: if-not-present
  # when: manual # 手动出发按钮
  needs:
    - dockerize_management_staging
  script:
    - IMAGE_NAME=$(cat image_name.temp)
    - echo ${IMAGE_NAME}
    - bash /root/config.sh $KUBERNETES_DEV_SERVER $KUBERNETES_DEV_CERTIFICATE_AUTHORITY_DATA $KUBERNETES_DEV_TOKEN
    - kubectl set image deployments -n agent wedock-management-ecs wedock-management-ecs=$IMAGE_NAME
    - kubectl get pods -A -l app=wedock-management-ecs



deploy_application_to_prod:
  stage: deploy
  image: 
    name: kubectl:0.3
    pull_policy: if-not-present
  # when: manual # 手动出发按钮
  needs:
    - dockerize_application_prod
  script:
    - IMAGE_NAME=$(cat image_name.temp)
    - echo $IMAGE_NAME

deploy_management_to_prod:
  stage: deploy
  image: 
    name: kubectl:0.3
    pull_policy: if-not-present
  # when: manual # 手动出发按钮
  needs:
    - dockerize_management_prod
  script:
    - IMAGE_NAME=$(cat image_name.temp)
    - echo $IMAGE_NAME


制品太大上传不了的问题解决:

image.png