Gitlab搭建以及自动化部署项目

871 阅读5分钟

这是我参与更文挑战的第3天,活动详情查看: 更文挑战

一、在物理机创建需要映射的文件夹

mkdir gitlab
cd gitlab/
mkdir config logs data

二、拉取镜像

docker pull gitlab/gitlab-ce

三、运行镜像

docker run -d  -p 443:443 -p 8090:80 -p 222:22 --name gitlab --restart always -v /usr/local/gitlab/config:/etc/gitlab -v /usr/local/gitlab/logs:/var/log/gitlab -v /usr/local/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce

四、配置

作为gitlab服务器,我们需要一个固定的URL访问地址,于是需要配置gitlab.rb

vim /usr/local/gitlab/config/gitlab.rb

# 配置http协议所使用的访问地址,不加端口号默认为80
external_url 'http://IP地址'

# 配置ssh协议所使用的访问地址和端口
gitlab_rails['gitlab_ssh_host'] = 'IP地址'
gitlab_rails['gitlab_shell_ssh_port'] = 222 # 此端口是run时22端口映射的222端口

五、重启

docker restart gitlab

六、解决问题成功

报502错误

1、发现8090端口被占用,重新run一个gitlub 端口为8091,未出现问题

2、gitlab没有真正启动成功,稍等一会

docker run -d  -p 443:443 -p 8091:80 -p 222:22 --name gitlab --restart always -v /usr/local/gitlab/config:/etc/gitlab -v /usr/local/gitlab/logs:/var/log/gitlab -v /usr/local/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce
gitlub1

七、添加账号

首先输入root用户的密码

其次注册新账号,注册完自动登录

八、创建项目

克隆地址

九、创建本地项目

配置好git,发现访问被拒绝。

原因是端口不一致默认是80端口,而我们改为8091端口,所以我们需要在clone地址加上:8091

要想一劳永逸,就修改配置文件。

1、进入容器

docker exec -it gitlab bash

2、修改配置文件

vim /opt/gitlab/embedded/service/gitlab-rails/config/gitlab.yml

3、重启服务

vim /opt/gitlab/embedded/service/gitlab-rails/config/gitlab.yml

十、关闭注册功能

不关闭注册功能,就会出现很多陌生账号。

1、以root用户登录,登录后

2、取消注册功能

十一 、配置gitlab—Runner

1、拉取镜像

docker pull gitlab/gitlab-runner:latest

2、创建容器

docker run -d --name gitlab-runner --restart always -p 8093:8093 -v /var/run/docker.sock:/var/run/docker.sock -v gitlab-runner-config:/etc/gitlab-runner gitlab/gitlab-runner:latest

3、注册

输入的数据在gitlab

  • 进入容器
docker exec -it gitlab-runner gitlab-runner register
  • 输入gitlab域名
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com )
https://gitlab.com
  • 输入gitlab的token
Please enter the gitlab-ci token for this runner
xxx
  • Runner的description ,可在gitlab修改
Please enter the gitlab-ci description for this runner
[hostname] my-runner
  • Runner的标签,可修改
Please enter the gitlab-ci tags for this runner (comma separated):
my-tag,another-tagEnter the [Runner executor](https://docs.gitlab.com/runner/executors/README.html):
  • Enter the Runner executor:
Please enter the executor: ssh, docker+machine, docker-ssh+machine, kubernetes, docker, parallels, virtualbox, docker-ssh, shell:
docker

十二、测试

编写.gitlab-ci.yml 文件

stages:
   - deploy
 
 docker-deploy:
   stage: deploy
   # 执行Job内容
   script:
     # 安装python3
     - wget https://www.python.org/ftp/python/3.5.7/Python-3.5.7.tgz
     - tar -xzvf Python-3.5.7.tgz
     - add-apt-repository ppa:jonathonf/python-3.5.7
     - ./configure --enable-optimizations
     - make
     - make install
     #安装项目所需要的依赖
     - pip3 install -r requirements.txt
      # 开始执行python项目
     - echo "build python....."   
     # 启动ziot项目,8094端口
     - echo "done"
     - pwd
     - ls
     - python3 server.py
     
   sidebar: 'auto'
tags:
     # 执行Job的服务器
     - 94new
   only:
     # 只有在master分支才会执行
     - master

十三、自动化部署python项目

使用CICD原理:当我们push项目到gitlab,就会触发.gitlab-ci.yml 文件,文件里面的 only:- maste表示,当push的分支为master则执行脚本。执行时通过sidebar: 'auto' tags:- shell选择已有的runner去执行。这时候他会把项目拉取到gitlab-runner中,例如文件夹/home/gitlab-runner/builds/76vGuzGu/0/wangscaler/,相同的runner文件夹的76vGuzGu地址相同。这时候我们通过ssh 将项目复制到我们的测试环境,所以需要配置ssh免密登录,当把项目拉取到测试环境后,我们可以启动supervisor来管理我们的项目。我们可以通过分支来选择部署的环境。

1、安装supervior

2、配置runner免密登录到生产机器

在gitlab-runner里切换至gitlab-runner用户配置免密登录,因为runner执行.gitlab-ci.yml时,使用的用户就是gitlab-runner。

docker exec -it gitlab-runner bash
su gitlab-runner
ssh-keygen -t rsa
ssh-copy-id -i /home/gitlab-runner/.ssh/id_rsa.pub root@服务器IP

输入密码后配置成功

ssh 生产机器IP地址

无需密码进入则成功

3、编写.gitlab-ci.yml 文件

stages:
  - clean_env            # 清理环境及杀死进程.
  - deploy_src           # 部署源码..
  - install_dependency   # 更新依赖.
  - compile_python       # 编译Python.
  - restart_server       # 重启服务.
  - check_server         # 检测服务.
  

variables:
  BASE_DIR: "/wangscaler/"

job clean_env_job:
  stage: clean_env
  script:
    - whoami
    - ssh -o stricthostkeychecking=no root@服务器IP pkill supervisord || true
    - ssh -o stricthostkeychecking=no root@服务器IP killall python3 || true
    #- ssh -o stricthostkeychecking=no root@服务器IP killall /data/miniconda3/envs/go2cloud_platform/bin/python || true
    - ssh -o stricthostkeychecking=no root@服务器IP rm -rf /project${BASE_DIR}*
  sidebar: 'auto'
tags:
    - shell
  only:
    - master
  when: always


job deploy_src_job:
  stage: deploy_src
  script:
    - whoami
    - scp -r /home/gitlab-runner/builds/B8F5kKw7/0/WangScaler/${BASE_DIR}* root@服务器IP:/project${BASE_DIR}
  sidebar: 'auto'
tags:
    - shell
  only:
    - master
  when: always


job install_dependency_job:
  stage: install_dependency
  script:
    - whoami
    - ssh -o stricthostkeychecking=no root@服务器IP  pip3 install -r /project${BASE_DIR}requirements.txt
  sidebar: 'auto'
tags:
    - shell
  only:
    - master
  when: always
  
  
job compile_python_job:
  stage: compile_python
  script:
    - whoami
    - ssh -o stricthostkeychecking=no root@服务器IP sleep 7
    - ssh -o stricthostkeychecking=no root@服务器IP "cd /project/wangscaler && python3 CreateLicense.py 00:16:3e:10:34:74"
    - ssh -o stricthostkeychecking=no root@服务器IP "cd /project/wangscaler && python3 setup.py"
    - ssh -o stricthostkeychecking=no root@服务器IP python3 -m compileall -b /project${BASE_DIR}build/
    - ssh -o stricthostkeychecking=no root@服务器IP find /product/wangscaler -name "server.py" -type f -print -exec rm -rf {} \;
  sidebar: 'auto'
tags:
    - shell
  only:
    - master
  when: always

job restart_server_job:
  stage: restart_server
  script:
    - whoami
    - ssh -o stricthostkeychecking=no root@服务器IP sleep 7
    - ssh -o stricthostkeychecking=no root@服务器IP supervisord -c /etc/supervisord.conf
    - ssh -o stricthostkeychecking=no root@服务器IP ps -ef |grep supervisord |grep -v grep
  sidebar: 'auto'
tags:
    - shell
  only:
    - master
  when: always

job check_server_job:
  stage: check_server
  script:
    - whoami
    - ssh -o stricthostkeychecking=no root@服务器IP sleep 7
    - ssh -o stricthostkeychecking=no root@服务器IP ps -ef|grep "8193"
  sidebar: 'auto'
tags:
    - shell
  only:
    - master
  when: always