什么是CI/CD
持续集成(CI)和持续部署(CD)是DevOps中重要的两个环节,传统的软件开发和交付方式正在迅速变得过时,过去软件迭代与开发里,大多数公司的软件发布周期是每月、每季度甚至每年,较长的周期不利于产品的试错以及敏捷开发,而现在,DevOps 时代,每周、每天甚至每天多次都是常态。
开发团队通过编写软件交付流水线(Pipeline)代码实现版本构建,发布的自动化,以快速进行验证和缩短交付周期,更少的去关注部署以及发布的细节,而将更多的精力留在代码质量本身。
在实际使用中,g是开发者通过在itlab的CI/CD离预先配置的一系列pipeline
参数,精心掌控触发时机,在代码提交、合并、或者打tag时,触发响应的自动构建流来完成构建到发布的动作。
GitLab CI/CD 是如何工作的
为了使用GitLab CI/CD,你需要一个托管在GitLab上的应用程序代码库,并且在根目录中的.gitlab-ci.yml
文件中指定构建、测试和部署的脚本。
在这个文件中,你可以定义要运行的脚本,定义包含的依赖项,选择要按顺序运行的命令和要并行运行的命令,定义要在何处部署应用程序,以及指定是否 要自动运行脚本或手动触发脚本。
为了可视化处理过程,假设添加到配置文件中的所有脚本与在计算机的终端上运行的命令相同。
一旦你已经添加了.gitlab-ci.yml
到仓库中,GitLab将检测到该文件,并使用名为GitLab Runner
的工具运行你的脚本。该工具的操作与终端类似。
这些脚本被分组到jobs
,它们共同组成一个pipeline
。一个最简单的.gitlab-ci.yml
文件可能是这样的:
before_script:
- apt-get install rubygems ruby-dev -y
run-test:
script:
- ruby --version 6
任务目标
我们的任务目标是搭建一个 gitlab + gitlab-runner 的CICD环境,在代码触发时,启动构建动作,构建完毕后将代码推送到应用服务器上进行部署
应用服务是是一个具备nginx的服务,他暴露了80端口允许你访问端口,应用我们选择前端的 hexo
博客系统,开箱即用
准备
为了实现本文档的目标任务,需要做一下软件的前期准备
- 安装docker
- 了解docker常用操作
- apt 软件安装操作
为了加快实践操作,你可能还会需要
- 安装docker WSL2
- 配置镜像加速源(可以自己申请阿里的一个镜像服务,免费的,或者直接使用下面的配置)
{
"registry-mirrors": [
"https://gk9l8m3a.mirror.aliyuncs.com"
],
"insecure-registries": [],
"debug": false,
"experimental": false,
"features": {
"buildkit": true
}
}
- apt update/ install 都会比较耗时,可以尝试安装镜像源
相关材料
- docker安装gitlab
- docker四种网络模式,容器localhost访问宿主机端口
- linux 安装 nodejs
- linux软连接
- 安装 gilab-runner
- Job artifacts
环境准备
从安装一个 gitlab 开始
首先我们在docker安装一个gitlab用来做本次实验
# 下载镜像
docker pull gitlab/gitlab-ee
# 启动
docker run -d \
--hostname localhost \
-p 80:80 \
--name gitlab \
gitlab/gitlab-ee:latest
# 查看日志
docker logs -f gitlab
启动阶段要做较多的初始化工作,需要耐心等待。完成后可以通过 80
端口看到gilab。
- 首次登陆需要重置密码,重置密码后即可进入系统
安装并注册 git runner
安装好 gitlab 后还要安装 gitlab-runner 并注册,gitlab-runner 主要用于响应 gitlab CI/CD,CI/CD里面的script脚本将会被 gitlab-runner 所执行
docker pull gitlab/gitlab-runner
# --network host 共享主机网络保证gitrunner能够正确的访问gitlab
docker run -d \
--name gitlab-runner \
--network host \
gitlab/gitlab-runner:latest
# 命令模式进入容器
docker exec -it gitlab-runner bash
进入容器控制台,输入如下命令进行注册
gitlab-ci-multi-runner register
注册时需要一个token参数,可以访问 http://localhost/admin/runners 这个页面去获取
> gitlab-ci-multi-runner register
Runtime platform arch=amd64 os=linux pid=63 revision=943fc252 version=13.7.0
Running in system-mode.
Enter the GitLab instance URL (for example, https://gitlab.com/):
> http://localhost/
Enter the registration token:
> Q1L_vwDETgx8Fx-Yypfp
Enter a description for the runner:
[23229cabbaf2]: demo
Enter tags for the runner (comma-separated):
Registering runner... succeeded runner=Q1L_vwDE
Enter an executor: docker-ssh, virtualbox, kubernetes, docker-ssh+machine, custom, docker, parallels, shell, ssh, docker+machine:
> shell
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
- URL 填写 http://localhost/
- token 从 gitlab 获取
- name 随意
- 不要为 runner 指定 tag, 否则他将会被绑定了 tag 的 job 所使用
- executor 填 shell, 其他的不在本次实践范围
然后点击编辑,将 lock 那一项给点掉
最后返回列表你会看到
为了能运行nodejs项目,还需要继续安装 nodejs
apt update
# 安装解压工具
apt install xz-utils bzip2 -y
# 下载
wget https://nodejs.org/dist/v10.9.0/node-v10.9.0-linux-x64.tar.xz
# 解压wget
tar -xf node-v10.9.0-linux-x64.tar.xz
# 建立软连接,让npm和node可以在全局调用
ln -b -s /node-v10.9.0-linux-x64/bin/npm /bin/npm
ln -b -s /node-v10.9.0-linux-x64/bin/node /bin/node
# 查看node版本
node -v
安装一台用于部署的服务器
至此,我们还需要一台用于部署应用的服务器,我们使用 nginx
镜像
docker pull nginx
docker run -d --name nginx \
-p 8080:80 \
nginx:latest
启动完毕后,8080端口就可以直接访问了 http://localhost:8080/
搭建代码仓库和cicd
新建一个仓库
至此,runner 的执行环境基本做完了,接下来我们需要新建一个代码仓库,然后配置 CI/CD 的相关内容。
我们需要先创建一个仓库
访问 gitlab http://localhost/, 在 project
里面找到 New Project
选择从一个模板中新建
找到 hexo 模板(一个静态化的博客系统)
新建
新建完毕后,可以在根目录下面找到 .gitlab-ci.yml
文件
测试CI/CD
模板默认已经配好了CICD,可以直接运行
配置cicd
找到 .gitlab-ci.yml
文件,点开编辑
image: node:10.15.3
cache:
paths:
- node_modules/
before_script:
- test -e package.json && npm install
pages:
script:
# hexo构建命令用仓库自身的而不用全局命令
- ./node_modules/hexo/bin/hexo generate
# scp需要进行进行ssh相关的配置才可以使用,未完成
# - scp -r public root@localhost:/usr/share/nginx/html
artifacts:
paths:
- public
only:
- master
保存完毕后,CI/CD 就开始执行
发布程序
CI/CD 执行完毕后,由于我们配置了 artifacts
参数,可以在 CI/CD 面板中下载构建产物
我们可以直接在应用服务器上面下载这个产物 细节看此链接
# 访问ngx应用服务器
docker exec -it nginx bash
# 到ngx的目录
cd /usr/share/nginx/
# 下载最后一个在master上面构建的包
curl --output artifacts.zip --header "PRIVATE-TOKEN: s8Y9J1g5Azof89zfhEhN" "http://192.168.0.157/api/v4/projects/root%2Fblog/jobs/artifacts/master/download?job=pages"
命令中的 Ip 请修改成自己的IP,不要使用localhost, root%2Fblog
是项目路径 root/blog
encode之后的,PRIVATE-TOKEN
需要在仓库的 Setting -> access token
获得
下载完毕后可以使用 ls
查看
root@d77810f38ca5:/usr/share/nginx# ls
artifacts.zip html
然后我们将其解压
# 更新软件源
apt update
# 安装解压软件
apt install unzip
unzip artifacts.zip
# 删除旧文件
rm -rf html
# 将目录移到ngx配置目录
mv public html
就可以看到结果了(样式问题是工程自己的问题)
使用 SCP
直接在 CI/CD
中发布
未完待续