CI-CD搭建全流程
gitlab本地搭建流程
1.安装openssh及客户端,postfix服务器和lokkit命令
sudo yum install -y curl policycoreutils-python openssh-server openssh-clients postfix cronie lokkit
2. 启动postfix邮件服务器和sshd,并设置为开机自动启动
sudo systemctl enable sshd
sudo systemctl start sshd
sudo systemctl enable postfix
sudo systemctl start postfix
sudo chkconfig postfix on
3.使用lokkit命令设置防火墙,打开http和ssh的访问权限
sudo lokkit -s http -s ssh
4. 添加gitlab镜像
wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-10.0.0- ce.0.el7.x86_64.rpm
5.下载安装gitlab
rpm -i gitlab-ce-10.0.0-ce.0.el7.x86_64.rpm
6.初始化配置
sudo vim /etc/gitlab/gitlab.rb
6.1.配置external_url
external_url 'http://192.168.206.130/'
6.2.修改gitlab服务端口
unicorn['port'] = 8081
6.3.重载配置
sudo gitlab-ctl reconfigure
7.首次登录为root设置初始密码,配置邮箱,配置邮箱需要开启该邮箱的smtp授权,并记录授权码,否则会无法接收到gitlab发 送的邮件。
8.修改gitlab.rb
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.qq.com"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "[email protected]"
gitlab_rails['smtp_password'] = "zobvwuxginehbeda"
gitlab_rails['smtp_domain'] = "smtp.qq.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true
gitlab_rails['gitlab_email_from'] = '[email protected]'
然后 sudo gitlab-ctl reconfigure 重载配置
然后在gitlab上选择settings 将其默认邮箱改为配置邮箱,发送邮件,并在配置邮箱中确认邮件信息,就会更新邮箱配置。 后续用管理员添加新用户并登陆。
9.配置git存储仓库目录及进行数据仓库迁移
sudo vim /etc/gitlab/gitlab.rb
配置git存储仓库:
git_data_dirs({
"default" => { "path" => "/home/gitlab/git-data" }
})
gitlab数据仓库迁移:
sudo gitlab-ctl stop
sudo rsync -av /var/opt/gitlab/git-data/repositories /home/gitlab/git-data/
sudo gitlab-ctl upgrade
sudo ls /home/gitlab/git-data/
sudo gitlab-ctl start
sudo gitlab-ctl reconfigure
安装依赖
sudo apt-get update
sudo apt-get install -y curl openssh-server ca-certificates
sudo apt-get install -y postfix
信任Gitlab的GPG公钥
curl https://packages.gitlab.com/gpg.key 2> /dev/null | sudo apt-key add - &>/dev/null
配置镜像路径加速(清华镜像)
sudo vim /etc/apt/sources.list.d/gitlab-ce.list
到此路径:https://mirror.tuna.tsinghua.edu.cn/help/gitlab-ce/
Ubuntu18.4: deb https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/ubuntu bionic main
安装gitlab-ce
sudo apt-get update
sudo apt-get install gitlab-ce
执行配置
sudo gitlab-ctl reconfigure
启动gitlab
sudo gitlab-ctl start
后续配置的更改和centos基本没差别
只是更改unicorn的时候连带更改
unicorn['listen'] = '127.0.0.1'
unicorn['port'] = 8081
gitlab集成drone
1.登入gitlab,选择settings,application。新建一个new application,注意 Redirect URL(回调地址) 这与使用drone 的版本有关,
drone 0.x url 应如 http://ip or 域名/authorize
drone 1.x url 应如 http://ip or 域名/login
记录application ID 和 Secret
2.build主机(启动drone)
2.1 安装docker和docker-compose (网上找教程,很简单)
2.2 通过docker-compose来启动drone,注意drone不单单需要启动drone-server还有drone-agent/drone-runner
创建docker-compose.yml
version: "2.1"
services:
drone-server:
image: drone/drone:1
ports:
- 443:443
- 80:80
volumes:
- /var/lib/drone:/data
restart: always
environment:
- DRONE_AGENTS_ENABLED=true
- DRONE_LOGS_DEBUG=true
- DRONE_GIT_ALWAYS_AUTH=false
- DRONE_GITLAB_SERVER=http://192.168.206.130/
- DRONE_GITLAB_CLIENT_ID=
- DRONE_GITLAB_CLIENT_SECRET=
- DRONE_RPC_SECRET=e349d16fa70e27bdd1043c1ec3d83478
- DRONE_USER_CREATE=username:tklin,admin:true
- DRONE_RUNNER_CAPACITY=3
- DRONE_SERVER_HOST=ip
- DRONE_SERVER_PROTO=http
- DRONE_TLS_AUTOCERT=false
networks:
- ci_net
drone-agent:
image: drone/drone-runner-docker:1
restart: always
depends_on:
- drone-server
volumes:
- /var/run/docker.sock:/var/run/docker.sock:rw
environment:
- DRONE_RPC_PROTO=http
- DRONE_RPC_HOST=ip
- DRONE_RPC_SECRET=e349d16fa70e27bdd1043c1ec3d83478
- DRONE_RUNNER_CAPACITY=3
- DRONE_RUNNER_NAME=ip
- DRONE_LOGS_TRACE=true
networks:
- ci_net
networks:
ci_net:
自搭建的gitlab需要在root登录的情况下到Admin Area -- Settings下 找到OutBound Request 勾选上Allow Requests To The Local Network From Hooks And Services,否则drone会因为权限问题,找不到gitlab的储存库。
1.查看是否存在id_rsa.pub或id_dsa.pub,如果存在就跳过第二步
cd ~/.ssh
ls
2.创建一个ssh-key,连续enter,就会在~/.ssh下创建id_rsa.pub等文件
ssh-keygen -t rsa -C "邮箱"
3.添加ssh-key到gitlab
拷贝id_rsa.pub中的内容到gitlab配置ssh的地方,保存。
4.测试
ssh -T git@gitlab_ip
出现Are you sure you want to continue connecting (yes/no)? 输入yes
如果前面配置了密码,接下来就会输入密码,没有配置就不用输入,会出现welcome to gitlab 表明配置成功。
drone调用sonarqube执行代码扫描
1. 配置数据库,注意sonarqube7.9以上不支持mysql数据库,并且sonarqube7.9以下对于mysql数据库版本要求在5.7到8.0之 间。
1.1. 本地拉取mysql5.7镜像
docker pull mysql:5.7
1.2. 启动mysql镜像
docker run -p 3307:3306 --name mysql -v $PWD/conf:/etc/mysql/conf.d -v $PWD/logs:/logs -v $PWD/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
1.3. 进入启动的mysql container
docker exec -it mysql(容器名) bash
1.4. 创建sonar数据库和sonar用户
mysql -u root -p
create database sonar
CREATE USER 'sonar'@'%' IDENTIFIED WITH mysql_native_password BY 'sonar';
GRANT ALL PRIVILEGES ON *.* TO 'sonar'@'%';
2. 启动sonar
docker run -d --name sonarqube -p 9000:9000 -p 9092:9092 --link=mysql:mysql -e SONARQUBE_JDBC_USERNAME=sonar -e SONARQUBE_JDBC_PASSWORD=sonar -e SONARQUBE_JDBC_URL="jdbc:mysql://ip:3307/sonar? useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=
true&useConfigs=maxPerformance&useSSL=false" sonarqube:6.7.5
kind: pipeline
name: sonar
steps:
name: code-analysis
image: aosapps/drone-sonar-plugin:1.0
settings:
sonar_host: sonarqube服务器ip:port
sonar_token: drone_secret
drone+Dockerfile+harbor实现项目镜像的打包上传到私有镜像库
harbor搭建
1. 私有仓库harbor的搭建,harbor的搭建基于docker和docker-compose
1.1.下载harbor离线安装包并解压
wget https://storage.googleapis.com/harbor-releases/harbor-offline-installer-v1.5.0.tgz
tar xf harbor-online-installer-v1.5.0.tgz
1.2.根据下载的harbor版本不同,解压后harbor文件夹下的文件也不相同,harbor1.x版本解压后会有harbor.cfg这个文 件,而harbor2.x版本解压后会有harbor.yml.tmpl这个文件,两个文件都是harbor的配置文件,不同的时,需要把2.x 版本中新建一个harbor.yml文件,并将harbor.yml.tmp1中的内容复制到harbor.yml中,不然后续启动harbor会因找 不到配置文件而出错。
1.3.修改配置文件
将harbor配置文件中hostname设置为访问地址,这个地址是作为外部访问仓库的唯一凭证,可以使用ip/域名,但不可 设置为127.0.0.1 && localhost,如果是harbor2.x版本,还需要将配置文件中 https related config 部分注释 掉,在未给harbor配置ssh证书的情况下。注意,2.x版本,harbor.yml harbor.yml.tmpl文件都需要修改。
1.4.启动harbor,第一次启动harbor使用 sudo ./install.sh,这过程可能需要几分钟,需要拉取harbor所需的依赖镜像。
启动成功后harbor文件夹下会多出docker-compose.yml文件,后续stop,restart,start都可以使用docker- compose.yml文件来执行。
注意:此时要先docker-compose stop
sudo vim docker-compose.yml
在ports处添加:- 443:443
- 8443:8443
配置443端口和8443端口,不然本地是不能登录的。
1.5.使用ip登陆harbor,账号admin,密码默认Harbor12345
1.6.harbor客户端配置免https
harbor客户端其实就是任何一个安装了docker的主机,及代表有能力将镜像传送到仓库。
首先cd etc/docker, 查看该目录下是否有daemon.json文件,没有则创建(touch daemon.json)。
sudo vim daemon.json
添加:{ "insecure-registries":["harbor_server ip"] }
sudo systemctl daemon-reload
sudo systemctl restart docker
测试:
docker login docker_server_ip
登陆成功则表示配置成功
1.7.镜像上传到harbor
docker pull nginx
docker tag nginx:版本(latest) harbor_server_ip项目名称(library)/nginx:1.0
docker push harbor_server_p/项目名称(library)/nginx:1.0
1.8.从harbor拉取镜像
docker rmi -f 镜像id
docker pull harbor_server:ip/项目名称(library)/nginx:1.0(镜像名称及版本)
Dockerfile
FROM golang:1.10.2
ADD . /go/src/drone-tklin
WORKDIR /go/src/drone-tklin
RUN go install drone-tklin
ENTRYPOINT ["golang","drone-tklin.dll"]
EXPOSE 8080
.drone.yml调用Dockerfile并将打包好的镜像上传到harbor
特别说明:在.drone.yml中在同一个kind:pipeline上 steps是依次执行,前一个错误会导致整个drone.yml结束。因此在对项目ci-cd的流程中,如果steps之间没有前后关系的限制,可以在drone.yml新建kind:pipeline,来达到并发运行的状态。
目录结构:
/go
/src
/drone-tklin
/Dockefile
/.drone.yml
/main.go
kind:pipeline
name:default
steps:
- name: publish
image: plugins/docker
settings:
dockerfile: ./Dockerfile.txt
registry: harbor_server_ip
repo: harbor_server_ip/项目名称/镜像名称
secrets: [drone_secret_name, drone_secret_password]
tags:
- '1.0'
insecure: true
volumes:
- name: docker
path: /var/run/docker.sock
volumes:
- name: docker
host:
path: /var/run/docker.sock
rancher搭建及集成harbor
环境要求: linux主机,内核高于3.10,主机内存不低于1GB,rancher不支持Docker for Windows及 Docker for Mac
rancher服务器是个docker image 因此rancher本身不需要安装,只需要执行docker命令下载并且成功运行docker服务器镜像
启动 rancher
docker run -d --restart=always -p 8080:8080 rancher/server
登陆rancher
http://ip:port
初次登陆需配置访问控制。
注册url(提供访问-ui界面): 初次登陆ui界面提示-注册url(这个url是rancher—server运行所在的url,并且此url能够被主机所访问)
添加主机:基础架构-主机-添加主机-Custom(默认)-在第四步输入主机ip-第五步会获得注册rancher脚本,复制到rancher主机并运行,主机注册成功后,点击关闭,就可以主机界面看到注册好的主机了。
基础架构-镜像库-添加镜像库-选择CuSTOM-私有仓库address(harbor_server_ip)
用户名和密码是harbor服务器的账号密码
添加服务 -- 选择镜像(harbor_server_ip/项目名称/镜像名:tag) -- 端口映射
访问rancher_ip:映射的端口号,如果可以访问成功,如镜像是nginx,则可以看到welcome to nginx 表示集成成功。
另外,尽量不要将rancher主机和rancher服务器架设在一台主机上,这样会导致rancher server出现问题
drone集成rancher
kind: pipeline
name: default
steps:
- name: rancher
image: pelotech/drone-rancher
settings:
url: 'http://rancher_ip:port'
access_key: user
secret_key: password
service: huh/service1
docker_image: huh/image