GitLab CI 就已经集成在 GitLab 中,我们只要在项目中添加一个 .gitlab-ci.yml 文件,然后添加一个 Runner,即可进行持续集成。
(如果已经安装Gitlabb则不需要安装,尽量保证 GitLab 于GitRunner镜像版本号一致或接近)
创建文件夹
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
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
使用 ssh-keygen 工具生成,位置在 Git 安装目录下,我的是 C:\Program Files\Git\usr\bin
输入命令:
ssh-keygen -t rsa -C "[email protected]"
执行成功后的效果:
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 [email protected]
The key's randomart image is:
+---[RSA 3072]----+
|o+ |
|o O + . |
| + & = . |
| X @.o. |
| o O.*. S |
|. *.. o |
| + B.o . |
|ooE.X |
|ooo+ o |
+----[SHA256]-----+
秘钥位置在:C:\Users\你的用户名.ssh 目录下,找到 id_rsa.pub 并使用编辑器打开并拷贝
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 的关系图就是:
一般来说,构建任务都会占用很多的系统资源 (譬如编译代码),而 GitLab CI 又是 GitLab 的一部分,如果由 GitLab CI 来运行构建任务的话,在执行构建任务的时候,GitLab 的性能会大幅下降。
GitLab CI 最大的作用是管理各个项目的构建状态,因此,运行构建任务这种浪费资源的事情就交给 GitLab Runner 来做拉!
因为 GitLab Runner 可以安装到不同的机器上,所以在构建任务运行期间并不会影响到 GitLab 的性能
环境准备
创建工作目录 /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
安装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
安装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/
开始配置环境变量,编辑文件/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
下载 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
具体项目->设置->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
docker exec -u root -it gitlab-runner bash
su gitlab-runner
cd ~
然后从root用户切换到gitlab-runner用户,并且进入用户主目录。因为需要使用ssh scp发布网站,所以需要设置好ssh的证书。
ssh-keygen -t ed25519 -C "[email protected]"
完成了上一步之后用户主目录应该已经生成了.ssh文件夹,进入该文件夹。
cd .ssh
ssh-copy-id -i ./id_ed25519.pub [email protected]
使用此命令复制公钥到目标服务器之上,此操作过程之中需要输入目标服务器的用户登录密码。
示例命令一:
scp -r dist [email protected]:/root/temp
示例命令二:
ssh [email protected] "
cd /root/temp &&
sh deploy-xxx.sh"
在项目工程下编写 .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 [email protected]:/root/temp
- scp -r static.tar.gz [email protected]:/root/temp
- ssh [email protected] "
cd /root/temp &&
sh deploy-xxx.sh"
- echo "部署完成"
上面的配置把一次 Pipeline 分成阶段:
注意: 设置 Job.only 后,只有当master 分支有提交的时候才会触发相关的 Jobs。
节点说明:
所有操作完成后 push 代码到服务器,查看是否成功:
其它命令
gitlab-ci-multi-runner unregister --name "名称"
gitlab-ci-multi-runner list
查看docker,显示正在运行的容器
docker ps
根据containerId,创建新镜像
docker commit db1634fc5235 gitlab/gitlab-runner:v11.4.2.1
切换到/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