案例使用Rails App进行演示,通过CI执行sonar代码检测、单元测试、docker镜像构建并推送到Harbor制品库
准备工作
在gitlab上创建项目
创建RailsDemo
rails new rails-gitlabci-demo -d mysql
bundle
rails g scaffold post title:string content:text
rake db:create
rake db:migrate
在sonar上创建项目
在harbor上创建
准备CI相关配置
Dockerfile
构建镜像需要注意如下几点:
- 优化速度:替换各类源(这里改了apline apk源和gem源)
- 修改时区:保证应用时区的正确
- 优化体积:只安装必须的库,构建完把不需要的库移除
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实现
配置信息可以在sonar项目中获取
单元测试
只需要通过容器构建一个能执行rake test的环境就行了,比较简单
镜像构建
分为2个步骤:构建docker image、推送到harbor制品库
首先需要配置CI变量,把harbor信息放进去:
最终在制品库中就可以看到此次构建的镜像
最终效果
但每次进行代码提交时,就会自动触发CI,当然也可是配置只有在merge requests的时候执行