• gitops在gitlab上实践


    环境介绍

    gitlab版本 gitlab-ce-14.10.2-ce.0.el7.x86_64.rpm
    os版本 CentOS Linux release 7.7.1908 (Core)
    系统架构 :

    1. Model name: Intel(R) Xeon(R) Platinum 8272CL CPU @ 2.60GHz
    2. Architecture: x86_64

    安装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
    # 注意此步骤 runner 的excutor 运行用户指定为了gitlab-runner 所以在使用shell 运行器具时要进行docker group的添加
    sudo gitlab-runner install --user=gitlab-runner --working-directory=/data/runner/data
    sudo gitlab-runner start
    
    sudo gitlab-runner register --url http://gitlab.lovexlq.com/ --registration-token yourtoken
    

    注册runner executor (安装完runner 后可以进行多组executor 同时注册运行互不影响)

    runner executor 类型和区别

    image
    不推荐使用shell executor 线程安全性无法保障,但是使用docker 或者 kubernetes 进行pipeline 操作时,碰到docker build in docker 的场景 怎么解决那,官方给出了三种方案。

    1. Docker-in-Docker
    点击查看代码
    #runner 配置
    [[runners]]
      url = "https://gitlab.com/"
      token = TOKEN
      executor = "docker"
      [runners.docker]
        tls_verify = false
        image = "docker:20.10.16"
        privileged = true
        disable_cache = false
        volumes = ["/certs/client", "/cache"]
      [runners.cache]
        [runners.cache.s3]
        [runners.cache.gcs]
    #pipline 
    image: docker:20.10.16
    
    variables:
      # When you use the dind service, you must instruct Docker to talk with
      # the daemon started inside of the service. The daemon is available
      # with a network connection instead of the default
      # /var/run/docker.sock socket. Docker 19.03 does this automatically
      # by setting the DOCKER_HOST in
      # https://github.com/docker-library/docker/blob/d45051476babc297257df490d22cbd806f1b11e4/19.03/docker-entrypoint.sh#L23-L29
      #
      # The 'docker' hostname is the alias of the service container as described at
      # https://docs.gitlab.com/ee/ci/services/#accessing-the-services.
      #
      # Specify to Docker where to create the certificates. Docker
      # creates them automatically on boot, and creates
      # `/certs/client` to share between the service and job
      # container, thanks to volume mount from config.toml
      DOCKER_TLS_CERTDIR: "/certs"
    
    # 由于没有挂在本地docker socket 这个service 必须指定
    services:
      - docker:20.10.16-dind
    
    before_script:
      - docker info
    
    build:
      stage: build
      script:
        - docker build -t my-docker-image .
        - docker run my-docker-image /script/to/run/tests
    
    1. Docker socket binding
    点击查看代码
    [[runners]]
      url = "https://gitlab.com/"
      token = RUNNER_TOKEN
      executor = "docker"
      [runners.docker]
        tls_verify = false
        image = "docker:20.10.16"
        privileged = false
        disable_cache = false
        volumes = ["/var/run/docker.sock:/var/run/docker.sock", "/cache"]
      [runners.cache]
        Insecure = false
    
    1. https://github.com/GoogleContainerTools/kaniko

    推荐类型 docker & kubernetes

    executor docker

    点击查看代码
    https://docs.gitlab.com/runner/configuration/advanced-configuration.html#json
    <details>
    <summary>点击查看代码</summary>
    
    

    [runners.docker]
    host = ""
    hostname = ""
    tls_cert_path = "/Users/ayufan/.boot2docker/certs"
    image = "ruby:2.7"
    memory = "128m"
    memory_swap = "256m"
    memory_reservation = "64m"
    oom_kill_disable = false
    cpuset_cpus = "0,1"
    cpus = "2"
    dns = ["8.8.8.8"]
    dns_search = [""]
    privileged = false
    userns_mode = "host"
    cap_add = ["NET_ADMIN"]
    cap_drop = ["DAC_OVERRIDE"]
    devices = ["/dev/net/tun"]
    disable_cache = false
    wait_for_services_timeout = 30
    cache_dir = ""
    volumes = ["/data", "/home/project/cache"]
    extra_hosts = ["other-host:127.0.0.1"]
    shm_size = 300000
    volumes_from = ["storage_container:ro"]
    links = ["mysql_container:mysql"]
    allowed_images = ["ruby:", "python:", "php:"]
    allowed_services = ["postgres:9", "redis:
    ", "mysql:*"]
    [[runners.docker.services]]
    name = "registry.example.com/svc1"
    alias = "svc1"
    entrypoint = ["entrypoint.sh"]
    command = ["executable","param1","param2"]
    [[runners.docker.services]]
    name = "redis:2.8"
    alias = "cache"
    [[runners.docker.services]]
    name = "postgres:9"
    alias = "postgres-db"
    [runners.docker.sysctls]
    "net.ipv4.ip_forward" = "1"

    </details>
    

    executor in k8s

    点击查看代码
    concurrent = 4
    
    [[runners]]
      name = "myRunner"
      url = "https://gitlab.com/ci"
      token = "......"
      executor = "kubernetes"
      [runners.kubernetes]
        host = "https://45.67.34.123:4892"
        cert_file = "/etc/ssl/kubernetes/api.crt"
        key_file = "/etc/ssl/kubernetes/api.key"
        ca_file = "/etc/ssl/kubernetes/ca.crt"
        namespace = "gitlab"
        namespace_overwrite_allowed = "ci-.*"
        bearer_token_overwrite_allowed = true
        privileged = true
        cpu_limit = "1"
        memory_limit = "1Gi"
        service_cpu_limit = "1"
        service_memory_limit = "1Gi"
        helper_cpu_limit = "500m"
        helper_memory_limit = "100Mi"
        poll_interval = 5
        poll_timeout = 3600
        dns_policy = "cluster-first"
        [runners.kubernetes.node_selector]
          gitlab = "true"
        [runners.kubernetes.node_tolerations]
          "node-role.kubernetes.io/master" = "NoSchedule"
          "custom.toleration=value" = "NoSchedule"
          "empty.value=" = "PreferNoSchedule"
          "onlyKey" = ""
    

    pipeline 的基础入门和高级用法

    1. schedule
      定时执行pipeline 流水线
      image

    2. pipeline 执行顺序
      默认时顺序执行,本阶段全部job finish 之后执行后阶段(This is the simplest pipeline in GitLab. It runs everything in the build stage concurrently, and once all of those finish, it runs everything in the test stage the same way, and so on. It’s not the most efficient, and if you have lots of steps it can grow quite complex, but it’s easier to maintain:
      image

    点击查看代码
    stages:
      - build
      - test
      - deploy
    
    image: alpine
    
    build_a:
      stage: build
      script:
        - echo "This job builds something."
    
    build_b:
      stage: build
      script:
        - echo "This job builds something else."
    
    test_a:
      stage: test
      script:
        - echo "This job tests something. It will only run when all jobs in the"
        - echo "build stage are complete."
    
    test_b:
      stage: test
      script:
        - echo "This job tests something else. It will only run when all jobs in the"
        - echo "build stage are complete too. It will start at about the same time as test_a."
    
    deploy_a:
      stage: deploy
      script:
        - echo "This job deploys something. It will only run when all jobs in the"
        - echo "test stage complete."
    
    deploy_b:
      stage: deploy
      script:
        - echo "This job deploys something else. It will only run when all jobs in the"
        - echo "test stage complete. It will start at about the same time as deploy_a."
    

    也可以强制指定执行顺序,做到类似异步执行的效果
    image

    点击查看代码
    stages:
      - build
      - test
      - deploy
    
    image: alpine
    
    build_a:
      stage: build
      script:
        - echo "This job builds something quickly."
    
    build_b:
      stage: build
      script:
        - echo "This job builds something else slowly."
    
    test_a:
      stage: test
      needs: [build_a]
      script:
        - echo "This test job will start as soon as build_a finishes."
        - echo "It will not wait for build_b, or other jobs in the build stage, to finish."
    
    test_b:
      stage: test
      needs: [build_b]
      script:
        - echo "This test job will start as soon as build_b finishes."
        - echo "It will not wait for other jobs in the build stage to finish."
    
    deploy_a:
      stage: deploy
      needs: [test_a]
      script:
        - echo "Since build_a and test_a run quickly, this deploy job can run much earlier."
        - echo "It does not need to wait for build_b or test_b."
    
    deploy_b:
      stage: deploy
      needs: [test_b]
      script:
        - echo "Since build_b and test_b run slowly, this deploy job will run much later."
    

    也可利用trigger 进行目前级别的区分

    点击查看代码
    stages:
      - triggers
    
    trigger_a:
      stage: triggers
      trigger:
        include: a/.gitlab-ci.yml
      rules:
        - changes:
            - a/*
    
    trigger_b:
      stage: triggers
      trigger:
        include: b/.gitlab-ci.yml
      rules:
        - changes:
            - b/*
    
    1. mutil projects 在项目pipeline中触发其他项目的cicd
    点击查看代码
    variables:
      MY_GLOBAL_VAR:  global
    rspec:
      stage: test
      script: bundle exec rspec
    
    staging:
      inherit:
        variables: false
      variables:
        ENVIRONMENT: staging
      stage: deploy
      trigger: 
        project: dongfengtest
        branch: master
    
  • 相关阅读:
    Rust条件编译
    997. Find the Town Judge
    Rust理解所有权借用与引用
    一个16进制占多少个字节?半个字节
    841. Keys and Rooms
    21. Merge Two Sorted Lists
    RustRc和Arc
    652. Find Duplicate Subtrees
    【转载】Centos7安装FastDFS
    金融互联网公司如何保证用户私人信息安全?
  • 原文地址:https://www.cnblogs.com/leleyao/p/16288659.html
Copyright © 2020-2023  润新知