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/
4.配置gitlab個人訪問令牌。
5.配置sonarqube的gitlab插件
admin 登錄 SonarQube,點擊 配置 —> 通用配置 —> GitLab —> Reporting —> 設置 GitLab User Token 以及 GitLab url。GitLab User Token 為 GitLab 上用戶的 Token(這里使用上邊統一賬戶 sonarQube Token),其他配置默認即可。
6.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私服下載。