CI CD the wrong way

此文也不包含 travisci, coveralls 等,也不包含本地运行的各种 formatter/linter,后续有机会单独一篇文章聊。

一般 CI/CD 包含 build, test, lint/inspection, deployment 等。而 formatter/linter 有的会带上--fix 或者--inplace,还有些例如 errorprone 可以生成 patch,这样其实是可以自动生成 pr 的,后面自由发挥了。

IntelliJ Inspection

此处虽然是 IntelliJ,其实也适用于 Jetbrains 全家桶。这儿说的是 CI,自然不是那个图形界面菜单下的 Inspect,而是Launching Code Inspection from Command Line - Help | IntelliJ IDEA

然后可以使用docker run --rm -v $(pwd):/project bentolor/idea-cli-inspector -p .intellij-inspection-default.xml来检查,输出目录默认为target/inspection-results,具体如何使用可以自行参考bentolor/idea-cli-inspector。在发现这个项目前,发现 IntelliJ 图形界面启动时会生成本机可用 JDK 配置文件$IDEA_HOME/config/options/jdk.table.xml,服务器上后来自己手动生成才配置好。

如果报错openjdk-11 not found,编辑 .idea/misc.xml 的 component/project-jdk-name,设置为11

Sonarqube + Gitlab plugin

这个就是很全了,根据服务端的规则,可以用 sonar gradle 插件或者 sonnar-scanner。然后配置 gitlab 插件,soonar 是会把发现的问题直接评论到 commit 或者 pr 对应的代码行。样例配置如下:

.gitlab-ci.yml with gradle

gradle plugin

```bash - ./gradlew sonarqube -Dsonar.host.url=$SONAR_URL -Dsonar.login=$SONAR_LOGIN -Dsonar.projectKey=$CI_PROJECT_NAME -Dsonar.projectName=$CI_PROJECT_NAME -Dsonar.gitlab.project_id=$CI_PROJECT_ID -Dsonar.gitlab.commit_sha=$CI_COMMIT_SHA -Dsonar.gitlab.ref_name=$CI_COMMIT_REF_NAME -Dsonar.gitlab.url=https://gitlab.com

.gitlab-ci.yml with sonar-scanner

sonar-scanner

- sonar-scanner -Dsonar.projectKey=$CI_PROJECT_NAME -Dsonar.sources=.
  -Dsonar.host.url=$SONAR_URL -Dsonar.login=$SONAR_LOGIN
  -Dsonar.gitlab.project_id=$CI_PROJECT_ID -Dsonar.gitlab.commit_sha=$CI_COMMIT_SHA
  -Dsonar.exclusions="static/js/**/*"
  -Dsonar.gitlab.ref_name=$CI_COMMIT_REF_NAME -Dsonar.gitlab.url=https://gitlab.com

另外可以配置 environment,设置when: manual,这样就可以直接在 gitlab 界面点击部署或者执行某些 ci 步骤了。 [^1] sonar 最大的好处就是可以对新增代码设置 gate,这个是除了丰富规则的另外一大优势了。

Bitbucket Pipeline

50 分钟每月免费额度,配置 bitbucket-pipeline.yml 即可。不详细介绍了,50 分钟是在太少了。。。

Gitlab Runner

每个月 2000 分钟(此处查看 quota),大部分时候是足够了,如果不够,你可以自己注册 gitlab-runner,运行 jobs 时会优先使用你注册的 runnner,没有可用的 runner 时(不在线或者没有注册),才会使用 shared runner。 配置.gitlab-ci.yml 即可。(我非常不理解 bitbucket 为啥不是 .bitbucket-pipeline.yml)。

一般 executor 可以用 docker,或者 shell,后者隔离性差,但是有时可能也用得到(比如需要部署到本机,此处的本机是指单台机器,不能用 tag 来同时指定多台机器)。 然后同一机器其实是可以部署多个 runner 的,比如不同账户,不同 executor,不同 builds 目录,具体可以修改 systemd service 文件。

docker 作为 executor,网络不好的话,没必要每次都重新拉镜像(镜像 tag 建议不要使用 latest 这种),在 /etc/gitlab-runner/config.toml 里配置: runners.docker: pull_policy = "if-not-present"。镜像也可以使用 docker 提供的私有仓库(仅限一个,但是你可以有多个 tag),配置DOCKER_AUTH_CONFIG 或者使用docker login registry.hub.docker.com --username $DOCKER_USERNAME --password $DOCKER_PASSWORD,具体参考文档Define an image from a private Container Registry 。示例如下:

DOCKER_AUTH_CONFIG
{
  "auths": {
    "registry.hub.docker.com": {
      "auth": "username:password in base64=="
    }
  }
}

runner 最好在同一个项目下注册,其他项目启用,因为 runner 只能在注册的项目解除注册,否则在不同项目下注册,最后项目多了找起来会疯掉,例如 Find an easy way to remove a specific runner which is used in a few projects (#18279)。 删除的时候需要将启用该 runner 的项目先都 disable 掉才能 remove。

Heroku

免费一个实例,然后 10000 行的 pg 存储,512 MB RAM 1 web/1 worker

这个实现的 cd,git push https://heroku:$HEROKU_API_KEY@git.heroku.com/$HEROKU_APP_NAME.git HEAD:master,其中 $HEROKU_API_KEY 在Manage Account里可以生成,然后 $HEROKU_APP_NAME 是项目名字。

CicleCi

待补充

Jenkinsfile

待补充

  1. Environments and deployments | GitLab

Comments