第一章安装GItLab
1.1备注
GitLab CI 就已经集成在 GitLab 中,我们只要在项目中添加一个 .gitlab-ci.yml 文件,然后添加一个 Runner,即可进行持续集成。
(如果已经安装Gitlabb则不需要安装,尽量保证 GitLab 于GitRunner镜像版本号一致或接近)
1.2安装部署
创建文件夹
mkdir -p /usr/local/loit/soft/docker/gitlab
编辑
vi docker-compose.yml
如下代码
其中 39.100.100.120 需改为实际ip
version: '3'
services:
web:
image: 'twang2218/gitlab-ce-zh:11.1.4'
restart: always
hostname: '39.100.100.120'
environment:
TZ: 'Asia/Shanghai'
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://39.100.100.120:12011'
gitlab_rails['gitlab_shell_ssh_port'] = 12222
unicorn['port'] = 12011
nginx['listen_port'] = 80
ports:
- '12011:80'
- '12443:443'
- '12222:22'
volumes:
- /usr/local/loit/soft/docker/gitlab/config:/etc/gitlab
- /usr/local/loit/soft/docker/gitlab/data:/var/opt/gitlab
- /usr/local/loit/soft/docker/gitlab/logs:/var/log/gitlab
查看日志
docker ps
docker logs -f mmmmmm
1.3解决更改默认端口号后http协议不带端口号
docker exec -u root -it gitlab_web_1 bash
vim /etc/gitlab/gitlab.rb
修改external_url,直接增加端口号即可,比如我这里用8800端口:
external_url 'http://ipaddr:12011'
然后执行:
gitlab-ctl reconfigure
1.4免密登录
1.4.1生成 SSH KEY
使用 ssh-keygen 工具生成,位置在 Git 安装目录下,我的是 C:\Program Files\Git\usr\bin
输入命令:
ssh-keygen -t rsa -C "email@qq.com"
执行成功后的效果:
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/nick/.ssh/id_rsa):
/c/Users/nick/.ssh/id_rsa already exists.
Overwrite (y/n)? y
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /c/Users/nick/.ssh/id_rsa.
Your public key has been saved in /c/Users/nick/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:D4iujDj1OSzQD1wnIR8awwvQPyPwp1EfOpLB+yts2SM 512889371@qq.com
The key's randomart image is:
+---[RSA 3072]----+
|o+ |
|o O + . |
| + & = . |
| X @.o. |
| o O.*. S |
|. *.. o |
| + B.o . |
|ooE.X |
|ooo+ o |
+----[SHA256]-----+
1.4.2复制 SSH-KEY 信息到 GitHub
秘钥位置在:C:\Users\你的用户名.ssh 目录下,找到 id_rsa.pub 并使用编辑器打开并拷贝
第二章GItLab 持续集成
2.1概念
Pipeline
一次 Pipeline 其实相当于一次构建任务,里面可以包含多个流程,如安装依赖、运行测试、编译、部署测试服务器、部署生产服务器等流程。
任何提交或者 Merge Request 的合并都可以触发 Pipeline,如下图所示:
Stages
Stages 表示构建阶段,说白了就是上面提到的流程。我们可以在一次 Pipeline 中定义多个 Stages,这些 Stages 会有以下特点:
所有 Stages 会按照顺序运行,即当一个 Stage 完成后,下一个 Stage 才会开始
只有当所有 Stages 完成后,该构建任务 (Pipeline) 才会成功
如果任何一个 Stage 失败,那么后面的 Stages 不会执行,该构建任务 (Pipeline) 失败
Jobs
Jobs 表示构建工作,表示某个 Stage 里面执行的工作。我们可以在 Stages 里面定义多个 Jobs,这些 Jobs 会有以下特点:
相同 Stage 中的 Jobs 会并行执行
相同 Stage 中的 Jobs 都执行成功时,该 Stage 才会成功
如果任何一个 Job 失败,那么该 Stage 失败,即该构建任务 (Pipeline) 失败
所以,Jobs 和 Stage 的关系图就是:
2.2JitLab Runner 介绍
一般来说,构建任务都会占用很多的系统资源 (譬如编译代码),而 GitLab CI 又是 GitLab 的一部分,如果由 GitLab CI 来运行构建任务的话,在执行构建任务的时候,GitLab 的性能会大幅下降。
GitLab CI 最大的作用是管理各个项目的构建状态,因此,运行构建任务这种浪费资源的事情就交给 GitLab Runner 来做拉!
因为 GitLab Runner 可以安装到不同的机器上,所以在构建任务运行期间并不会影响到 GitLab 的性能
2.3JitLab Runner 安装
环境准备
创建工作目录 /usr/local/loit/soft/docker/gitlab-runner
创建配置目录 /usr/local/loit/soft/docker/gitlab-runner/config
cd /usr/local/loit/soft/docker/gitlab-runner
vi docker-compose.yml
version: '3'
services:
runner:
image: 'gitlab/gitlab-runner:v11.4.2'
container_name: gitlab-runner
restart: always
networks:
- gitlab_default
volumes:
- ./config:/etc/gitlab-runner
- /var/run/docker.sock:/var/run/docker.sock
networks:
gitlab_default:
external: true
docker-compose up -d
2.3.1安装JAVA
安装java
linux 64 jdk1.8 jdk-8u161-linux-x64.tar.gz
百度云盘下载链接:https://pan.baidu.com/s/18IicPYf7W0j-sHBXvfKyyg
下载好后拷贝到
cd /usr/local/soft
将安装包copy到jenkins中的root路径下
docker cp jdk-8u161-linux-x64.tar.gz gitlab-runner:/root/
进入docker容器中,切换到root路径下
docker exec -u root -it gitlab-runner bash
cd /root/
对maven压缩包进行解压,并移动到/var/local/路径下
tar -zxvf jdk-8u161-linux-x64.tar.gz
mv jdk1.8.0_161 /var/local/java
2.3.2安装maven
安装maven
cd /usr/local/soft
wget http://mirror.bit.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
将安装包copy到jenkins中的root路径下
docker cp apache-maven-3.6.3-bin.tar.gz gitlab-runner:/root/
进入docker容器中,切换到root路径下
docker exec -u root -it gitlab-runner bash
cd /root/
对maven压缩包进行解压,并移动到/var/local/路径下
tar -zxvf apache-maven-3.6.3-bin.tar.gz
mv apache-maven-3.6.3 /var/local/
2.3.3 配置环境变量
开始配置环境变量,编辑文件/etc/profile
在最下面添加以下内容(MAVEN_HOME是刚才解压maven的路径)
export JAVA_HOME=/var/local/java
export MAVEN_HOME=/var/local/apache-maven-3.6.3
export PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
运行source /etc/profile,刷新环境变量
查看maven版本,安装成功后,退出docker
mvn -v
java -version
exit
2.3.4安装NodeJs
下载 NodeJS
https://cdn.npm.taobao.org/dist/node/v12.18.3/node-v12.18.3-linux-x64.tar.gz
上传到路径 /usr/local/soft
cd /usr/local/soft
docker cp node-v12.18.3-linux-x64.tar.gz gitlab-runner:/root/
docker exec -u root -it gitlab-runner bash
在jenkins容器内执行以下步骤
cd /root/
tar -zxvf node-v12.18.3-linux-x64.tar.gz
mv node-v12.18.3-linux-x64 /usr/local/
cd /usr/local/node-v12.18.3-linux-x64/bin
./node -v
ln -s /usr/local/node-v12.18.3-linux-x64/bin/node /usr/local/bin
ln -s /usr/local/node-v12.18.3-linux-x64/bin/npm /usr/local/bin
2.4注册 Runner
具体项目->设置->CI/CD->获取GitLab CI 地址与令牌参数 (每个需要持续集成的项目都需要设置一次)
docker exec -it gitlab-runner gitlab-runner register
# 输入 GitLab 地址 (参照上图获取 URL)
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
http://39.100.100.120:12011/
# 输入 GitLab Token(参照上图GitLoabToken 获取)
Please enter the gitlab-ci token for this runner:
1Lxq_f1NRfCfeNbE5WRh
# 输入 Runner 的说明
Please enter the gitlab-ci description for this runner:
可以为空
# 设置 Tag,可以用于指定在构建规定的 tag 时触发 ci
Please enter the gitlab-ci tags for this runner (comma separated):
设置具体tag, 空为都触发
# 选择 runner 执行器,这里我们选择的是 shell
Please enter the executor: virtualbox, docker+machine, parallels, shell, ssh, docker-ssh+machine, kubernetes, docker, docker-ssh:
shell
其中 runner 中的构建大概路径为
/home/gitlab-runner/builds/ba74daa3/0/spring-timeloit/portalSystem
2.5SCP免密传输文件及SSH免密执行命令
docker exec -u root -it gitlab-runner bash
su gitlab-runner
cd ~
然后从root用户切换到gitlab-runner用户,并且进入用户主目录。因为需要使用ssh scp发布网站,所以需要设置好ssh的证书。
ssh-keygen -t ed25519 -C "chensy@teimloit.com"
完成了上一步之后用户主目录应该已经生成了.ssh文件夹,进入该文件夹。
cd .ssh
ssh-copy-id -i ./id_ed25519.pub root@114.100.100.140
使用此命令复制公钥到目标服务器之上,此操作过程之中需要输入目标服务器的用户登录密码。
示例命令一:
scp -r dist root@114.100.100.140:/root/temp
示例命令二:
ssh root@114.100.100.140 "
cd /root/temp &&
sh deploy-xxx.sh"
2.5.gitlab-ci.yml
在项目工程下编写 .gitlab-ci.yml 配置文件:
stages:
- install_deps
- build
- deploy_test
cache:
key: ${CI_BUILD_REF_NAME}
paths:
- node_modules/
- dist/
install_deps:
stage: install_deps
only:
- master
script:
# - npm install node-sass -save
- npm install node-sass -save --sass_binary_site=https://npm.taobao.org/mirrors/node-sass/
- npm install --registry=https://registry.npm.taobao.org
# 编译
build:
stage: build
only:
- master
script:
- npm run build:prod
# 部署测试服务器
deploy_test:
stage: deploy_test
only:
- master
script:
- tar -zcvf dist.tar.gz dist
- tar -zcvf static.tar.gz static
- scp -r dist.tar.gz root@114.100.100.140:/root/temp
- scp -r static.tar.gz root@114.100.100.140:/root/temp
- ssh root@114.100.100.140 "
cd /root/temp &&
sh deploy-xxx.sh"
- echo "部署完成"
上面的配置把一次 Pipeline 分成阶段:
- 安装依赖(install_deps)
- 运行测试(test) (暂缺)
- 编译(build)
- 部署测试服务器(deploy_test)(暂缺)
- 部署生产服务器(deploy_production)(暂缺)
注意: 设置 Job.only 后,只有当master 分支有提交的时候才会触发相关的 Jobs。
节点说明:
- stages:定义构建阶段,这里只有一个阶段 deploy
- deploy:构建阶段 deploy 的详细配置也就是任务配置
- script:需要执行的 shell 脚本
- only:这里的 master 指在提交到 master 时执行
- tags:与注册 runner 时的 tag 匹配
2.6测试验证效果
所有操作完成后 push 代码到服务器,查看是否成功:
其它命令
- 删除注册信息
gitlab-ci-multi-runner unregister --name "名称"
- 查看注册列表
gitlab-ci-multi-runner list
2.8将docker 容器保存为新镜像
查看docker,显示正在运行的容器
docker ps
根据containerId,创建新镜像
docker commit db1634fc5235 gitlab/gitlab-runner:v11.4.2.1
2.9修改docker-compose
切换到/usr/local/loit/soft/docker/gitlab-runner路径下,修改docker-compose.yml
cd /usr/local/loit/soft/docker/gitlab-runner
vi docker-compose.yml
version: '3'
services:
runner:
image: 'gitlab/gitlab-runner:v11.4.2.1'
container_name: gitlab-runner
restart: always
networks:
- gitlab_default
volumes:
- ./config:/etc/gitlab-runner
- /var/run/docker.sock:/var/run/docker.sock
networks:
gitlab_default:
external: true
删除之前的容器
docker-compose down
重启
docker-compose up -d