什么是CI/CD#
持续集成(CI)和持续部署(CD)是DevOps中重要的两个环节,传统的软件开发和交付方式在迅速变得过时。过去的敏捷时代里,大多数公司的软件发布周期是每月、每季度甚至每年,而在现在 DevOps 时代,每周、每天甚至每天多次都是常态。
开发团队通过软件交付流水线(Pipeline)实现自动化,以缩短交付周期,并通过自动化流程来检查代码并部署到新环境。以快速的进行敏捷迭代和开发。
在实际使用中,gitlab的CI/CD是通过开发者预先配置的一系列pipeline
参数,通过精心配置的触发时机,在代码提交、合并、或者打tag时,触发自动构建流来完成构建到发布的动作。
任务目标#
我们的任务目标是搭建一个 gitlab + gitlab-runner 的CICD环境,在代码触发时,启动构建动作,构建完毕后将代码推送到应用服务器上进行部署
应用服务是是一个具备nginx的服务,他暴露了80端口允许你访问端口,应用我们选择前端的 hexo
博客系统,开箱即用
准备#
为了实现本文档的目标任务,需要做一下软件的前期准备
- 安装docker
- 了解docker常用操作
- apt 软件安装操作
相关材料#
- docker安装gitlab
- docker四种网络模式,容器localhost访问宿主机端口
- linux 安装 nodejs
- linux软连接
- 安装 gilab-runner
- Job artifacts
- Job artifacts
环境准备#
从安装一个 gitlab 开始#
首先我们在docker安装一个gitlab用来做本次实验
1 | # 下载镜像 |
启动阶段要做较多的初始化工作,需要耐心等待。完成后可以通过 8080
端口看到gilab。
安装并注册 git runner#
安装好 gitlab 后还要安装 gitlan-runner 并注册,gitlab-runner 主要用于 响应 gitlab CI/CD,CI/CD里面的script脚本将会被 gitlab-runner 所执行
1 | docker pull gitlab/gitlab-runner |
进入容器控制台,输入如下命令进行注册
1 | gitlab-ci-multi-runner register |
注册时需要一个token参数,可以访问 http://localhost/admin/runners 这个页面去获取
1 | > gitlab-ci-multi-runner register |
值得注意的是URL填写的时候,不能使用 https://localhost/ 请使用本机IP, 配置完后页面刷新后你会看到一个新注册的 runner
然后点击编辑,将 lock 那一项给点掉
最后返回列表你会看到
为了能运行nodejs项目,还需要继续安装 nodejs
1 |
|
- exector 表示执行器,表示执行脚本时,使用的命令行程序,配置docker比较复杂,此处直接使用shell执行器
安装一台用于部署的服务器#
至此,我们还需要一台用于部署应用的服务器,由于需要使用ssh进行连接(gitlab-runner使用该端口做远程部署),我们使用 nginx
镜像, 并在上面安装一个 openssh-server
,最后打开ssh通道,并配置账号密码允许ssh访问
首先,先pull nginx 镜像, 然后启动nginx
1 | docker pull nginx |
启动完毕后,8080端口就可以直接访问了 http://localhost:8080/
搭建代码仓库和cicd#
新建一个仓库#
至此,runner的执行环境基本做完了,接下来我们需要新建一个代码仓库,然后配置CI/CD的相关内容。
我们需要先创建一个仓库
找到
新建
测试CI/CD#
模板默认已经配好了CICD,可以直接运行
配置cicd#
仓库建完后,在仓库目录下面有一个 .gitlab-ci.yml
文件,点开编辑
1 | image: node:10.15.3 |
保存完毕后,CI/CD就开始执行
发布程序#
cicd执行完毕后,由于我们配置了 artifacts
参数,可以在ci/cd面板中下载构建产物
我们可以直接在应用服务器上面下载这个产物 细节看此链接
1 | docker exec -it nginx bash |
命令中的 Ip 请修改成自己的IP,不要使用localhost, root%2Fblog
是项目路径 root/blog
encode之后的,PRIVATE-TOKEN
需要在仓库的 Setting -> access token
获得
下载完毕后可以使用 ls
查看
1 | root@6aca3f15f8d8:/usr/share/nginx# ls |
然后我们将其解压
1 |
|
就可以看到结果了(样式问题是工程自己的问题)
直接在cicd中发布#
todo
1 | # 安装openssh以及文本编辑器 |
修改里面 port
以及 PermitRootLogin
修改完毕后,配置root密码
1 | passwd root |
重新启动sshd
1 | /etc/init.d/ssh restart |
完毕后就可以治用 xshel等软件进行连接
一些有趣的cicd实践#
- 使用CICD变量(todo)
- 构建产物(todo)
- 跨仓库触发/远程触发(todo)
- 为不同的分支指定不一样的构建动作(todo)