案例使用Rails App进行演示,通过CI执行sonar代码检测、单元测试、docker镜像构建并推送到Harbor制品库

准备工作


在gitlab上创建项目

WX20191128-152030

创建RailsDemo

rails new rails-gitlabci-demo -d mysql
bundle
rails g scaffold post title:string content:text
rake db:create
rake db:migrate

WX20191128-154415

在sonar上创建项目

WX20191128-155655

在harbor上创建

WX20191128-170604


准备CI相关配置


Dockerfile


构建镜像需要注意如下几点:

FROM ruby:2.5-alpine

WORKDIR /app
COPY $CI_PROJECT_DIR /app/

RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories && \
    apk add --no-cache make git libc-dev gcc g++ libxml2 libxslt mysql-dev mysql-client nodejs tzdata yarn && \
    cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
    gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/ && \
    gem install bundler -v 1.16.3 --no-document && \
    bundle config mirror.https://rubygems.org https://gems.ruby-china.com && \
    bundle install --without development test && \
    rake assets:precompile RAILS_ENV=production && \
    apk del make gcc g++ tzdata yarn


sonar-project.properties


sonar配置文件,设置具体检测规则及各类参数

sonar.projectKey=rails-gitlabci-demo
sonar.projectName=rails-gitlabci-demo
sonar.projectVersion=1.0
sonar.sources=.
sonar.sourceEncoding=UTF-8
sonar.language=rb

# 这段配置可以让sornar在发现问题后,直接通过comment的形式报告到gitlab中
sonar.gitlab.user_token=kCcX6Nm7CpcKQC4aGJKV
sonar.gitlab.url=http://gitlab
sonar.gitlab.project_id=git@gitlab:test/rails-gitlabci-demo.git


.gitlab-ci.yml


需要使用gitlab-ci,首先需要先安装gitlab-runner,这里使用了容器的形式执行CI任务,只需要一台支持docker的节点就能胜任,减少各种任务对节点环境的复杂要求。

stages:
- analysis
- test
- build

sonarqube-check:
  stage: analysis
  image:
    name: sonarsource/sonar-scanner-cli:latest
    entrypoint: [""]
  variables:
    SONAR_TOKEN: "b71fd83251eb07d1a3d26bffd3215f9bc0fbb23d"
    SONAR_HOST_URL: "http://sonar:9000"
    SONAR_PROJECT_KEY: "rails-gitlabci-demo"
  script:
  - sonar-scanner
  tags:
  - docker

unit-test:
  stage: test
  image: ruby:2.5-alpine
  script:
  - sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories
  - apk add --no-cache make git libc-dev gcc g++ libxml2 libxslt mysql-dev mysql-client nodejs tzdata yarn
  - bundle
  - rake test
  tags:
  - docker

build_docker_image_and_push_to_harbor:
  stage: build
  image: docker:stable
  script: 
    - docker build -t rails-gitlabci-demo .
    - docker login $DOCKER_REGISTRY -u $DOCKER_REGISTRY_USERNAME --password $DOCKER_REGISTRY_PASSWORD
    - docker tag rails-gitlabci-demo:latest $DOCKER_REGISTRY/test/rails-gitlabci-demo:$CI_COMMIT_SHA
    - docker push $DOCKER_REGISTRY/test/rails-gitlabci-demo:$CI_COMMIT_SHA
  tags:
  - docker

阶段

静态代码检测

这里通过sonar实现 WX20191202-101627

WX20191128-163320

配置信息可以在sonar项目中获取

WX20191202-102207

单元测试

只需要通过容器构建一个能执行rake test的环境就行了,比较简单

WX20191128-172810 WX20191128-172918

镜像构建

分为2个步骤:构建docker image、推送到harbor制品库

首先需要配置CI变量,把harbor信息放进去: WX20191128-160507 WX20191202-103115

最终在制品库中就可以看到此次构建的镜像

WX20191202-103243


最终效果


但每次进行代码提交时,就会自动触发CI,当然也可是配置只有在merge requests的时候执行

WX20191202-093106

WX20191202-095251