每次改完需求之后,更新到测试服务器都需要手动打包,并上传到服务器,多次人工干预操作,目前就有这样一个现成的基于 GitLab CI
工具,让我们提交或者合并代码后,就自动帮我们执行一段任务(打包、压缩、上传服务器)。从而实现自动上线。这里记录一下简单的步骤,因为每个人安装会面对不同的问题,后期有值得总结的,再补充。
它是我们自动构建的主服务
Runner 是一个执行任务的进程。可以根据需要配置任意数量的 Runner。 Runner 可以放在不同的用户、服务器,甚至 本地机器上。
它实际就是 .gitlab-ci.yml
,写一下然后交给 Git Runner
去执行。
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://[你的私有key].mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker 复制代码
docker 镜像加速器配置好,这块会快一些,没配置的可能会慢一点
Git Runner
它是辅助 Git
构建的一个服务
docker pull gitlab/gitlab-runner 复制代码
安装好之后可以 docker images
测试查看
docker run -d --name gitlab-runner --restart always \ -v ~/gitlab-runner/config:/etc/gitlab-runner \ -v /var/run/docker.sock:/var/run/docker.sock \ gitlab/gitlab-runner:latest 复制代码
现在 gitlab-runner
就启动了,可以通过 docker ps
查看,
这里容器ID是上一步执行的返回的 ID,只去前几位就行。不用复制完。
docker exec -it [容器ID] gitlab-runner register 复制代码
上面命令执行中会让你一次让你输入 gitlab URL、token、runner-server、tag、docker、docker:stable
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/): 复制代码
Please enter the gitlab-ci token for this runner: 复制代码
这里起了 runner-server
Please enter the gitlab-ci description for this runner: [ec66aa43edf6]: runner-server 复制代码
一个 git 仓库可以对应多个 runnder, 执行 yml 文件可以指定某一个 runner , 所以需要起一个名字标识
Please enter the gitlab-ci tags for this runner (comma separated): 复制代码
Please enter the executor: docker-ssh, parallels, virtualbox, docker-ssh+machine, custom, docker, shell, ssh, docker+machine, kubernetes: docker 复制代码
这里输入 docker:stable
Please enter the default Docker image (e.g. ruby:2.6): docker:stable 复制代码
runner
配置成功
配置成功之后,将会在页面中看到 此项目已激活的运行器
我们需要创建一个 .gitlab-ci.yml
文件,一下有一个例子
# 使用哪个镜像构建 image: node # 阶段 stages: - install - build - zip - deploy # 每一步骤都需要拉取新的镜像,cache 缓存做一个保留 cache: paths: - node_modules/ - dist/ - front-end-caiwu.tar # 执行所有 script 之前都会执行的 script 钩子 before_script: - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y ) ' - eval $(ssh-agent -s) - ssh-add <(echo "$SSH_PRIVATE_KEY_DEV") # 因为在 node 镜像中执行,若是选择执行器 是 shell 此步会干掉宿主机的ssh - mkdir -p ~/.ssh - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config' install: stage: install tags: - tagcicd script: - npm install -g cnpm --registry=https://registry.npm.taobao.org - cnpm install build: stage: build script: - npm run build zip: stage: zip script: - tar -czvf front-end-caiwu.tar ./dist deploy: stage: deploy script: - scp ./front-end-caiwu.tar root@XXXXXXXX:/data 复制代码
上面 yml 配置没有指名 tags, 可配置一个默认的
这一步很容易出现问题,网上版本也多,解决方案也不一样。一下可参考,但不保证按照步骤来就没问题。
1、首先,在任何一台服务器上称A,创建 RSA 无密码的密钥:
ssh-keygen -t rsa -P '' cat /root/.ssh/id_rsa 复制代码
2、特别注意需要复制完整包含 --- 复制到上图中 value里面
-----BEGIN RSA PRIVATE KEY----- xxxxxxx -----END RSA PRIVATE KEY----- 复制代码
3、然后在 A 服务器,执行代码 ssh-copy-id root 你需要部署的服务器 B, 期间会让你输入一次密码,后期就不会在输入。
# RSA 密钥对应的公钥,上传到需要连接到的服务器 ssh-copy-id root@你的服务器地址 # 测试 ssh root@你的服务器地址 复制代码
当你push 代码的时候,会自动生成一条流水线
感受一下
成功 生成 front-end-caiwu.tar 可以在yml 命令添加 解压缩放置到对应后端指定目录中。
image: node stages: - install - build - zip - deploy cache: paths: - node_modules/ - static/ - front-end-caiwu.tar before_script: - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y ) ' - eval $(ssh-agent -s) - ssh-add <(echo "$SSH_PRIVATE_KEY_DEV") - mkdir -p ~/.ssh - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config ' install: stage: install tags: - tagtym only: - master script: - npm install -g cnpm --registry=https://registry.npm.taobao.org - cnpm install build: stage: build tags: - tagtym only: - master script: - npm run build zip: stage: zip tags: - tagtym only: - master script: - tar -czvf front-end-caiwu.tar ./static deploy: stage: deploy tags: - tagtym only: - master script: - scp ./front-end-caiwu.tar root@$DEPLOY_SERVER_DEV:/data/frontEnd - ssh root@$DEPLOY_SERVER_DEV "cd /data/www/lighttpd/caiwu/public && rm -rf ./static/* && tar zxvf /data/frontEnd/front-end-caiwu.tar -C /data/www/lighttpd/caiwu/public && \cp ./static/index.html ../resources/views/welcome.blade.php" 复制代码