1、项目准备
在gitlab上新建个项目,本地克隆下来,写简单代码提交至gitlab。
2、安装gitlab-runner
1.拉取镜像
docker pull gitlab/gitlab-runner
2.启动gitlab-runner
docker run -d --name gitlab-runner --restart always \
-v /srv/gitlab-runner/config:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
gitlab/gitlab-runner:latest
3、注册配置gitlab-runner
1.获取 Gitlab CI Register Token:
先在gitlab上找到项目,然后在settingsàCI/CD—>Runners,展开,url和token备用。
2.注册gitlab-runner
docker run --rm -t -i -v /srv/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner register
标红部分是需要输入的。分别为:gitlab实例Url,token,runner描述,runner的标签(要在.gitlab.ci.yml中用到,used to select Runner),执行器(docker或者其他的),默认docker镜像。
这样就可以在查看token的页面看到新注册的runner了
3.修改config.toml
/srv/gitlab-runner/config/
# 日志的行数限制,此行为新增行,默认配置为4096
runners
output_limit = 81920
volumes = ["/var/run/docker.sock:/var/run/docker.sock", "/cache","/root/.m2:/root/.m2","/web/project/:/web/project/"]
4.重启gitlab-runner
docker restart gitlab-runner
4、生成config
在K8s的master节点上查看有无config文件。目录地址为:/root/.kube文件夹下,是个隐藏文件。如果没有,需要重新生成。
生成config文件部署:
1.进入管理员生成证书目录,查看证书。
# cd TLS/k8s ansible自动化部署的存放证书的地址是:/root/ansible-install-k8s-master/ssl/k8s
# vim admin-csr.json
{
"CN": "admin",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing",
"O": "system:masters",
"OU": "System"
}
]
}
已有admin-csr.json,无需要再重新生成证书。
如需重新生成证书,执行下列命令。
# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin
2.创建kubeconfig文件
# 设置集群参数
kubectl config set-cluster kubernetes \
--server=https://192.168.111.11:6443 \
--certificate-authority=ca.pem \
--embed-certs=true \
--kubeconfig=config
# 设置上下文参数
kubectl config set-context default \
--cluster=kubernetes \
--user=cluster-admin \
--kubeconfig=config
# 设置默认上下文
kubectl config use-context default --kubeconfig=config
# 设置客户端认证参数
kubectl config set-credentials cluster-admin \
--certificate-authority=ca.pem \
--embed-certs=true \
--client-key=admin-key.pem \
--client-certificate=admin.pem \
--kubeconfig=config
生成完后,ls命令,查看是否已生成。
复制config文件到/root/.kube目录下。
通过kubectl config view --raw -o yaml查看配置文件内容,也可通过cat直接查看生成的config内容。复制config内容,在gitlab上配置环境变量。
3.配置环境变量
key可以自己起,在gitlab-ci.yaml中正确引用就行,value就写上一步骤中config文件的内容。复制过来就可以。
5、项目中编写.gitlab.ci.yml
.gitlab.ci.yml 参考官方文档https://docs.gitlab.com/ee/ci/yaml/README.html
# 为了能够使用go get,需要将代码放在 $GOPATH 中,比如你的 gitlab 域名是 mydomain.com,
#你的代码仓库是 repos/projectname,默认的 GOPATH 是 /go,然后你就需要将你的代码放置到 GOPATH 下面,
#/go/src/mydomain.com/repos/projectname,用一个软链接指过来就可以了
before_script:
- mkdir -p "/go/src/http://192.168.111.245/${CI_PROJECT_NAMESPACE}"
- ln -sf "${CI_PROJECT_DIR}" "/go/src/http://192.168.111.245/${CI_PROJECT_PATH}"
- cd "/go/src/http://192.168.111.245/${CI_PROJECT_PATH}/"
variables:
APP_NAME: "kingc" #部署的项目的名字前缀
DEMO_CONTAINER_PORT: 8080 #项目暴露的端口
NODENAME: k8s-node2
DEVOLPNAMESPACE: kube-public #平台中开发环境的命名空间
TESTNAMESPACE: kube-test #平台中测试环境的命名空间
DEMO_IMAGE_NAME: "192.168.111.60:5000/${DEMO_IMAGE}:${CI_PIPELINE_ID}" #由私有仓库的地址/项目名:管道ID
# SONARQUBETOKEN: "86e55427257912adb83ad274ead0942476042952" #sonarqube的token
# SONARURL: "http://192.168.30.104:9000" #sonarqube的地址
GITLABURL: "http://192.168.111.245" #gitlab的地址
GITLABUERTOKEN: "Zj8p4t1izepgwStdJ2Pf" #gitlab的Access Tokens
REGISTRY: 192.168.111.60:5000 #私有仓库
# configMap: " testmysql" #configmap的名字
DEMO_IMAGE: "demo"
image: docker:19.03.12
# 定义三个阶段
stages:
- compile
- build
- deploy
compile:
# 打包用到了maven, 所有需要拉取maven镜像, 这是我自己构建的阿里云maven私服的maven镜像
image: registry.cn-hangzhou.aliyuncs.com/gjing/maven:1.0
# 指定阶段
stage: compile
# 运行脚本, 使用变量时要用到 $ 符号
script:
- mvn $MAVEN_OPTS clean package -Dmaven.test.skip=true
- mkdir -p /web/project/cicddemo
- cp -r target/cicddemo-0.0.1-SNAPSHOT.jar Dockerfile /web/project/cicddemo/
retry: 2
# 只作用在master分支
only:
- master
# 创建runner时指定的tag
tags:
- demo
build:
image: docker:19.03.12
#when: manual
stage: build
script:
- docker build --build-arg JAR_FILE=cicddemo-0.0.1-SNAPSHOT.jar -t $REGISTRY/${DEMO_IMAGE}:${CI_PIPELINE_ID} /web/project/cicddemo/
- docker push $REGISTRY/${DEMO_IMAGE}:${CI_PIPELINE_ID}
retry: 2
only:
- master
tags:
- demo
deploy:
image: 192.168.111.60:5000/kubectl:1.16.6
stage: deploy
#when: manual
script:
- mkdir $HOME/.kube && cat $KUBE_CONFIG > $HOME/.kube/config
#- kubectl set image deployment.v1.apps/fangtu fangtu=192.168.30.88:5000/${CI_PROJECT_NAME}:${CI_PIPELINE_ID} -n kube-public
- cd gitlabcicd/
- sed -i "s#__namespace__#${DEVOLPNAMESPACE}#g" deployment_demo.yaml ingress_demo.yaml
- sed -i "s#__appname__#${APP_NAME}#g" deployment_demo.yaml ingress_demo.yaml
- sed -i "s#__democontainerport__#${DEMO_CONTAINER_PORT}#g" deployment_demo.yaml
- sed -i "s#__nodeName__#${NODENAME}#g" deployment_demo.yaml
- sed -i "s#__demoimagename__#${DEMO_IMAGE_NAME}#g" deployment_demo.yaml
- kubectl apply -f deployment_demo.yaml
- kubectl apply -f ingress_demo.yaml
retry: 2
only:
- master
tags:
- demo
编写deployment_demo.yaml和ingress_demo.yaml
在项目根目录下,新建gitlabcicd文件夹,下面有deployment_demo.yaml和ingress_demo.yaml文件。
deployment_demo.yaml 内容如下:
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: __appname__-demo
namespace: __namespace__
labels:
app: __appname__-demo
spec:
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
app: __appname__-demo
template:
metadata:
labels:
app: __appname__-demo
track: stable
spec:
containers:
- name: __appname__-demo
image: __demoimagename__
imagePullPolicy: IfNotPresent
ports:
- name: http-metrics
protocol: TCP
containerPort: __democontainerport__
nodeName: __nodeName__
---
apiVersion: v1
kind: Service
metadata:
name: __appname__-demo
namespace: __namespace__
labels:
app: __appname__-demo
spec:
type: ClusterIP
ports:
- protocol: TCP
name: web
port: 80
targetPort: __democontainerport__
selector:
app: __appname__-demo
ingress_demo.yaml 内容如下:
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: __appname__-demo
namespace: __namespace__
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: kingc.demo.com.cn
http:
paths:
- path: /demo
backend:
serviceName: __appname__-demo
servicePort: 80
6、安装配置sonarqube
参考网址:https://www.cnblogs.com/wu-wu/p/13489207.html
1.docker 安装sonarqube
1 docker pull postgres 拉取数据库
2 docker pull sonarqube 拉取sonarqube
1 启动postgresql
$ docker run --name postgres -p 5432:5432 -e POSTGRES_USER=sonar -e POSTGRES_PASSWORD=sonar -e TZ=PRC -d postgres |
2 启动 sonarqube
$ docker run -d -p 1022:22 -p 9000:9000 -e "SONARQUBE_JDBC_URL=jdbc:postgresql://192.168.111.21:5432/sonar" -e "SONARQUBE_JDBC_USERNAME=sonar" -e "SONARQUBE_JDBC_PASSWORD=sonar" --name sonarqube sonarqube:7.9.1-community |
docker run -d -p 1023:22 -p 9001:9000 -e "SONARQUBE_JDBC_URL=jdbc:postgresql://192.168.30.104:5431/sonar" -e "SONARQUBE_JDBC_USERNAME=sonar" -e "SONARQUBE_JDBC_PASSWORD=123456" --name sonarqube9091 sonarqube:7.9.1-community
启动会报错,自动停止。报错内容如下:
解决方法:
修改/etc/sysctl.conf
vm.max_map_count=262144
并执行命令
sysctl -p
3 打开 http://localhost:9000/ , 点击 "Log in"
登录账号:admin 密码:admin |
启动时间较长,请稍等。
2.sonarqube安装简体中文包
依次点击页面:Administration – Marketplcae – All – Chinese Pack(Install)依次点击页面:Administration – Marketplcae – All – Chinese Pack(Install)
3.安装Sonar GitLab Plugin插件
可以直接下载 https://github.com/gabrie-allaigre/sonar-gitlab-plugin/releases该插件,放到 <sonarqube_install_dir>/extensions/plugins 目录,重启 SonarQube 即可。
将插件考到容器内部:
docker cp /root/sonar-gitlab-plugin-2.1.0.jar sonarqube:/opt/sonarqube/extensions/plugins/
3.配置gitlab个人访问令牌。
4.配置sonarqube的gitlab插件
admin 登录 SonarQube,点击 配置 —> 通用配置 —> GitLab —> Reporting —> 设置 GitLab User Token 以及 GitLab url。GitLab User Token 为 GitLab 上用户的 Token(这里使用上边统一账户 sonarQube Token),其他配置默认即可。
4.SonarQube生成Token
在sonarqube中生成token供yml中使用
7、修改gitlab-ci.yml
1、修改发件人邮箱
需要打开QQ邮箱的smtp设置。
参考网址:https://www.cnblogs.com/kimsbo/p/10671851.html
首先要开启QQ邮箱的smtp服务,默认是关闭的。
登录QQ邮箱,点“设置” - “帐户”。
找到“POP3/SMTP服务”和“IMAP/SMTP服务”项,点“开启”。
开启之后,点击“生成授权码”。这个授权码将作为邮箱的身份认证密码。
8.gitlab-runner的config.toml中挂载maven仓库到宿主机/root/.m2目录下。
修改此目录下的settings.xml文件,加入可从maven私服下载。