CICD学习笔记

225 阅读4分钟

Jenkins

install Jenkins in docker

  • docker run --name jk -it -p 90:8080 jenkins/jenkins:lts

www.jenkins.io/doc/book/in…

  1. 不要直接docker pull jenkins,这个拉的是旧版本的,需要执行docker run --name jk -it -p 90:8080 jenkins/jenkins:lts
  2. 不推荐使用stable(linux), docker(lts),plugin版本与jenkins版本不匹配,进而导致报错。
  3. 实测Jenkins以docker里无法完成最终部署, 可能需要映射更多的端口,或者桥接的方式实现。

配置轮询触发

这里配置使用Jenkins的另外一种新方式--blueocean,下载blue ocean的插件即可使用,简化大量操作,其本质上也是接入的Jenkins multi-branch pipeline,然后不断轮询的方式,个人比较推荐这种方式,可以快速搭建。

pipeline {
    agent any
    triggers { pollSCM('* * * * *') }
    stages {
        stage('Build') {
            steps {
                echo 'Building..'
                sh "g++ main.cpp"
            }
        }
        stage('Test') {
            agent { dockerfile true }
            steps {
                sh 'ls /'
                sh 'ls -l'
            }
        }
        stage('Deploy') {
            agent {
                docker { image 'ubuntu:latest' }
            }
            steps {
                sh 'ls /'
                sh 'ls -l'
                sh 'sleep 5'
            }
        }
    }
}


需要安装docker plugin 以及docker pipeline plugin stage test,基于dockerfile文件,动态build docker image,后面的命令都是运行在自己新建的环境内。 推荐使用Jenkinsfile 的形式,而不是直接在Jenkins server里面配置。 pollSCM('* * * * *')可以是每分钟轮询检查是否有变化。 参考www.jenkins.io/doc/book/bl…

node 与 agent的概念很类似,但允许一些更多的配置。

配置通知触发

freestyle

  1. 官方教程配置docs.gitlab.com/ee/integrat…
  2. 删除jobs目录下的两行github.com/jenkinsci/g…
  3. 在jenkins server自定义编译命令。

pipeline

与上面类似,但是安装官方的文档里的内容,需要在Jenkinsfile里面,手动更新状态。

原理解析

  1. gitlab server 收到commit, post 一个http的请求给Jenkins server
  2. Jenkins 通过access key 去访问gitlab server。
  • gitlab 默认不可以给局域网发送请求,需要管理员开启权限
  • 某些公司防火墙限制,可能导致无法request无法发送,只能选择被动的方式
  • Jenkins 如果使用docker,需要映射目录,
  • Jenkins master 的know host 需要有slave的public key.

Github

# This is a basic workflow to help you get started with Actions

name: my_testing_ci

# Controls when the workflow will run
on:
  # Triggers the workflow on push or pull request events but only for the main branch
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:

# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
  build:
    # The type of runner that the job will run on
    runs-on: ubuntu-latest

    # Steps represent a sequence of tasks that will be executed as part of the job
    steps:
      # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
      - uses: actions/checkout@v3
      - name: Print CPU info
        run : lscpu
      - name: Print OS info
        run: uname -a
      - name: Install dev tools
        run: sudo apt install -y cppcheck
      - name: Check code
        run: cppcheck .
      - name: Compile code
        run: make
      - name: Upload result
        uses: actions/upload-artifact@v3
        with:
          name: build_binary
          path: hello.ko

  test:
    needs: build # Disable parallel
    runs-on: ubuntu-latest
    steps:
      # There is no need to checkout/clone code here.
      - name: Download result
        uses: actions/download-artifact@v3
        with:
          name: build_binary
      - run: sudo insmod ./hello.ko
      - run: sudo rmmod hello
      - run: sudo dmesg

Gitlab runner

What is gitlab runner

Gitlab runner 是一个CI工具,能够自动化编译gitlab的repo,gitlab runner 需要部署在一台机器独立的机器上,例如linux,并且作为server一直在后台运行,它会定期pull gitlab repo, 并且执行相应的build命令,并且将输出(artifacts)上传到gitlab server.

  • 需要运行gitlab-runner register来将repo注册到这个runner, 后期可以手动修改文件/etc/gitlab-runner/config.toml相关的配置,但是创建必须要用命令行。
  • gitlabrunner 可以有多个executor,例如shell,docker之类的。推荐docker这样不会污染主机的环境。
  • gitlabrunner 每次build都会创建一个临时的全新的docker container
  • gitlabrunner server 会自动artifacts上传到gitlab的server,自己不会保存,过期时间可以在ymal中配置。
  • 只运行部分job: 在ymal中给每个job设置tag,然后在gitlabrunner register的时候或者gitlab webUI中设置,来控制运行某些job。
  • 可以对一个repo注册多个executor,每个excutor运行不同的image, 然后再ymal文件中指定docker image来指定不同的executor.
  • Register 就是在build server(runner) 与gitlabrunner 建立连接
  • runner 相对与gitlab server 的一个机器概念,runner里面executor可以为实际物理机shell,也可以是docker(常用),多个runner可以在一台物理机上。
  • gitlab sever会选择其中一个runner执行(可以通过tag设置)
  • 进入runner之后可以通过image选择镜像。

set up (with docker excutor)

  1. install docker && build specific image.
  2. install gitlabrunner.
  3. register to gitlabrunner.
  4. add scripts to .gitlab-ci.ymal file in git repo.