谈一谈几年来我所使用的CI工具

工作了5年多,期间接触了一些CI工具。谈一谈我对这些工具的使用感受。

首先,有了这些工具使我聚焦开发本身,不用做重复的动作(如编译、打包、发布、测试等),节省了很大的开销。

Jenkins

最早接触的CI工具算是Jenkins了,Jenkins给我最深的印象就是需要安装很多插件。而工作场景是离线内网的,所以有时候很痛苦,尽管有代理可以使用,但速度也很感人。

初用jenkins配置ci流程的方式是web节点配置,没有使用Jenkinsfile。但随着越来越多的项目需要配置CI流程,这样的工作变得重复且没有价值。

因此我开始使用Jenkinsfile定义CI流程,刚开始用的时候其实很痛苦,有些配置写不出来,只能网上冲浪,找一些样例。

Jenkinsfile样例

pipeline {

    agent any

    tools {
        go 'go'
    }
    environment {
       K8S_BASE_PATH="/ceph/download/deploy/soft/k8s/v1.18.6"
    }

    stages {
        stage ('checkout scm') {
            steps {
                checkout(scm)
            }
        }

        stage ('build k8s...') {
            steps {
                sh '''
                    alias sudo='sudo env PATH=$PATH'
                    chmod +x -R hack
                    sudo make WHAT=cmd/kubeadm
                    sudo mv _output/bin/kubeadm $K8S_BASE_PATH
                '''
            }
        }
    }
}

Jenkinsfile的方式个人感觉更好,原因就是它将CI的流程完整的声明出来了,并存储于版本库(git)内,使CI本身具备了版本管理的能力。

但是就个人而言,Jenkinsfile的groovy语法实在不是很喜欢,相较而言还是更喜欢yaml语法

gitlab-ci

去年年初接触到了GitOps概念(以前都是鼓吹DevOps),进而了解了Gitlab拥有原生的ci工具gitlab-runnner。

在试用一段时间后,爱不释手,遂将所有与Jenkins集成的项目切换到了Gitlab-CI上。

为什么这么推崇gitlab-ci?

首先,他足够简单,搭建一个gitlba-runner后注册下就可以用了,gitlab-runner可以是shell类型的,也可以是docker类型的。并且可以基于gitlab的组注册gitlab-runner,使整个组共享该CI执行器。

其次,是其yaml语言更符合个人习惯。

还有比较重要的一点就是,在整个构建过程中可以切换gitlab-runner,这点非常的吸引我。如此一来构建流程更为灵活。并且可以将重要的凭据存放于gitlab的变量中。

让我们感受下Gitlab-ci配置的魅力

variables:
  CI_REGISTRY_PROJECT: paas
  CI_IMAGE_TAG: "ks-cleaner"
  BUILD_IMAGE_TAG: $CI_REGISTRY/$CI_REGISTRY_PROJECT/$CI_IMAGE_TAG

stages:
  - build
  - push
  - clean
  - package
  - trigger-next-builder

build:
  stage: build
  script:
    - mkdir -p ~/.docker
    - echo "{\"auths\":{\"$CI_REGISTRY\":{\"auth\":\"$(echo -n ${CI_REGISTRY_USER}:${CI_REGISTRY_PASSWORD} | base64)\"}}}" > ~/.docker/config.json
    - docker build -f Dockerfile -t $BUILD_IMAGE_TAG .
  tags:
    - runner-vm

push:
  stage: push
  script:
    - docker push $BUILD_IMAGE_TAG
  tags:
    - runner-vm

clean:
  stage: clean
  script:
    - docker rmi -f $BUILD_IMAGE_TAG
  tags:
    - runner-vm

package:
  stage: package
  image:
    name: harbor.chs.neusoft.com/build/helm:latest
  before_script:
    - mkdir -p ~/.config/helm
    - echo "" > /etc/resolv.conf
    - echo "$CI_REGISTRY_ADDRESS $CI_REGISTRY_DOMAIN" >> /etc/hosts
  script:
    - cd charts
    - helm repo add harbor $CI_CHART_REGISTRY --username $CI_REGISTRY_USER --password $CI_REGISTRY_PASSWORD
    - helm package ks-cleaner
    - helmpush ks-cleaner-0.1.0.tgz harbor
  tags:
    - runner-docker

trigger-next-builder:
  stage: trigger-next-builder
  trigger:
    project: deploy/harbor-installer

github Action

对我冲击最大的CI工具算是github Action了,足够简单。

语法与gitlab-ci相似,可选插件较多(个人开发),比如自动release。

这里以我维护的weiliang-ms/easyctl: 基于golang运维工具集 (github.com) 所使用的action为例

  • 单元测试流程

当代码提交至master分支,触发单元测试流程,并生成对应的单元测试覆盖率

name: Test

on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

jobs:
  go-test:
    runs-on: ubuntu-latest
    steps:
      - name: Set up Go 1.16
        uses: actions/setup-go@v1
        with:
          go-version: 1.16
      - uses: actions/checkout@master
      - run: go get -t -v ./...
      - run: go test $(go list ./...|grep -v mocks) -race -coverprofile=coverage.txt -covermode=atomic -v
      - uses: codecov/codecov-action@v2
        with:
          token: ${{ secrets.CODECOV_TOKEN }} # not required for public repos
          files: coverage.txt # optional
          flags: unittests # optional
          name: codecov-umbrella # optional
          fail_ci_if_error: true # optional (default = false)
          verbose: true # optional (default = false)
  • release流程

tag push事件触发后,将打包编译工程,并发布release制品

name: Tag

on:
  push:
    tags:
      - 'v*'

jobs:
  create-release:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Create Release # 创建Release,可以在仓库看到一个个版本
        env:
          GITHUB_TOKEN: ${{ secrets.EASYCTL_PUBLISH_TOKEN }}
        id: create_release
        uses: actions/create-release@master
        with:
          tag_name: ${{ github.ref }} # (tag)标签名称
          release_name: Release ${{ github.ref }}
          draft: false # 是否是草稿
          prerelease: false # 是否是预发布
  releases-matrix:
    name: Release Go Binary
    runs-on: ubuntu-latest
    strategy:
      matrix:
        # build and publish in parallel: linux/386, linux/amd64, windows/386, windows/amd64, darwin/amd64
        # goos: [linux, windows, darwin]
        goos: [ linux ]
        goarch: [ "386", amd64 ]
        exclude:
          - goarch: "386"
#            goos: darwin
    steps:
      - uses: actions/checkout@v2
      - run: sudo ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
      - name: get date
        id: current_time
        run: echo "::set-output name=date::$(date +%Y-%m-%d-%H:%M:%S)"
      - name: branch name
        id: branch_name
        run: echo "::set-output name=name::$(git rev-parse --abbrev-ref HEAD)"
      - uses: wangyoucao577/go-release-action@v1.20
        with:
          github_token: ${{ secrets.EASYCTL_PUBLISH_TOKEN }}
          goos: ${{ matrix.goos }}
          goarch: ${{ matrix.goarch }}
          build_flags: "-gcflags=-trimpath=$GOPATH -asmflags=-trimpath=$GOPATH"
          ldflags: "-w -s -X 'main.BuildTime=${{ steps.current_time.outputs.date }}' -X 'main.GitTag=${{ steps.branch_name.outputs.name }}'"
          goversion: "1.16"
          project_path: "."
          binary_name: "easyctl"
#          release_tag: "latest"
          overwrite: true
          extra_files: LICENSE README.md
image.png

很多需求都有对应的插件,而且可以与其他的工具联动。可惜我们基于内网开发,使用不到。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,122评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,070评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,491评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,636评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,676评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,541评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,292评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,211评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,655评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,846评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,965评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,684评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,295评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,894评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,012评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,126评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,914评论 2 355

推荐阅读更多精彩内容