GitLab-CI/CD入门实操 (3)

注册runner

sudo gitlab-runner register -n \ --url :9980/ \ --registration-token cJMXGJWx7qx9AmpSc6ee \ --executor shell \ --tag-list "inkscreen_hostrunner" \ --description "Host Runner for InkScreen"

Add the gitlab-runner user to the docker group:

sudo usermod -aG docker gitlab-runner .gitlab-ci.yml stages: - build jar - build and run image #job's name 可以随意取 buildJar: stage: build jar variables: # 默认是clone,改为fetch加快拉取速度(若本地无则会自动clone) GIT_STRATEGY: fetch only: - dev script: - > docker run -d --rm --name justforpackage-$CI_COMMIT_REF_NAME -v "$(pwd)":/build/inkscreen -v /inkscreen/maven/m2:/root/.m2 -w /build/inkscreen maven:3-jdk-8 mvn clean package - sleep 60 tags: - inkscreen_hostrunner artifacts: paths: - louwen-admin/target/louwen-admin.jar expire_in: 3600 seconds testDeploy: stage: build and run image only: - dev variables: # 不拉取代码 GIT_STRATEGY: none IMAGE_NAME: louwen/inkscreen-api:$CI_COMMIT_REF_NAME PORT: 38082 before_script: # 移除旧容器和镜像。这里为什么要写成一行,下面有讲 - if [ docker ps | grep inkscreen-$CI_COMMIT_REF_NAME ]; then docker stop inkscreen-$CI_COMMIT_REF_NAME; docker rm inkscreen-$CI_COMMIT_REF_NAME; docker rmi $IMAGE_NAME; fi script: - docker build --build-arg JAR_PATH=louwen-admin/target/louwen-admin.jar -t $IMAGE_NAME . - > docker run -d --name inkscreen-$CI_COMMIT_REF_NAME -p $PORT:$PORT --network my_bridge --env spring.redis.host=myredis -v /inkscreen/inkscreen-api/logs/:/logs/ -v /inkscreen/inkscreen-api/louwen-admin/src/main/resources/:/configs/ $IMAGE_NAME tags: - inkscreen_hostrunner

注意build jar环节我们sleep了60秒,是因为docker run并不会等待内部脚本执行完,而是启动后就直接返回了,此时jar包尚未生成,所以此处阻塞一段时间等待打包结束。正常应该写一段脚本循环判断jar包是否已生成,若生成或超时则跳出循环,此处作为演示简单sleep。

在testDeploy任务中,before_script被我写成了一行,最初版本是:

before_script: # 若未找到记录,则该条命令会返回1,gitlab就直接报错返回了ERROR: Job failed: exit status 1 - docker ps | grep inkscreen-$CI_COMMIT_REF_NAME - > if [ $? -eq 0 ] then docker stop inkscreen-$CI_COMMIT_REF_NAME docker rm inkscreen-$CI_COMMIT_REF_NAME docker rmi $IMAGE_NAME fi

后改为

before_script: # 将检测语句直接作为条件内置,解决了上面的问题 - > if docker ps | grep inkscreen-$CI_COMMIT_REF_NAME then docker stop inkscreen-$CI_COMMIT_REF_NAME docker rm inkscreen-$CI_COMMIT_REF_NAME docker rmi $IMAGE_NAME fi

报错syntax error near unexpected token 'fi',估计是换行/回车格式的原因。上述两个问题都可以通过单独建.sh文件的方式解决,我这里简单地将所有语句排成一行。

Dockerfile

生成镜像自然少不了Dockerfile

FROM openjdk:8-jdk-oracle MAINTAINER louwen # 外部传入,主程序路径 ARG JAR_PATH ENV LANG=C.UTF-8 LC_ALL=C.UTF-8 COPY $JAR_PATH /app.jar EXPOSE 38082 ENTRYPOINT ["java","-jar","/app.jar"]

题外话,其实我们完全可以将build jar环节也放在Dockerfile中,如下

# # build jar stage # FROM maven:3-jdk-8 AS MAVEN_BUILD COPY pom.xml /build/ COPY src /build/src/ WORKDIR /build/ RUN mvn clean package # FROM openjdk:8-jdk-oracle MAINTAINER louwen COPY --from=MAVEN_BUILD /build/target/*.jar /app.jar ENTRYPOINT ["java","-jar","/app.jar"] 代码规范

目前较流行的代码检测工具是SonarQube,不过其社区版本对同一个代码仓库无法区分不同分支,从而实现按代码的不同分支显示对应分支的扫描结果。这里我们使用Gitlab-CI的Code Quality stage,其使用的是Codeclimate,它是为代码质量分析平台提供的一个命令行接口工具,通过它可以在本机 Docker 容器中对要分析的代码执行质量分析,并生成分析报告。我们熟知常用的代码质量检测工具例如 SonarQube、CheckStyle 等等,而 Codeclimate 接入了这些工具,而且支持我们自定义检测工具。

按照官方说法,使用Code Quality需要基于docker-based runner/executor,所以我们另外使用docker方式安装GitLab-Runner并注册一个runner(参考上述概念小节),executor选择docker。

include: - template: Code-Quality.gitlab-ci.yml # 以下配置参考网上一些资料,据说是官方示例,然而我没有在官方文档找到 code_quality: image: docker:stable variables: DOCKER_DRIVER: overlay2 # gitlab 13.6及之后版本支持 REPORT_FORMAT: html allow_failure: true services: - docker:dind script: # 镜像版本号格式参看 https://gitlab.com/gitlab-org/ci-cd/codequality/-/tree/master#versioning-and-release-cycle # - export SP_VERSION=$(echo "$CI_SERVER_VERSION" | sed 's/^\([0-9]*\)\.\([0-9]*\).*/\1-\2-stable/') - docker run --net=host --env SOURCE_CODE="$PWD" --volume "$PWD":/code --volume /var/run/docker.sock:/var/run/docker.sock "registry.gitlab.com/gitlab-org/security-products/codequality:${VERSION:-latest}" /code artifacts: paths: [ gl-code-quality-report.html ] tags: - InkScreenAPI

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpfszs.html