GIT

Git

快速上手

配置Git

git config --global user.name "hjxstart"
git config --global user.email "hjxstart@gmail.com"
ssh-keygen -t ed25519 -C "hjxstart@gmail.com"
language-shell复制代码

Gitea

安装

官方参考链接

前期配置

  1. 创建 git 用户并且指定 uid 和 gid
gruopadd git -g 1000
useradd git -u 1000 -g 1000
  1. 将 git 用户百年规定 git 组的某个文件
chown -R git:git /app/gitea/gitea
language-shell复制代码
  1. 创建/app/gitea/gitea 文件
ssh -p 4002 -o StrictHostKeyChecking=no git@127.0.0.1 "SSH_ORIGINAL_COMMAND=\"$SSH_ORIGINAL_COMMAND\" $0 $@"
language-shell复制代码

安装配置

version: "3"

networks:
  gitea:
    external: false

services:
  server:
    image: gitea/gitea:1.15.7
    container_name: gitea
    environment:
      - USER_UID=1000
      - USER_GID=1000
      - DB_TYPE=mysql
      - DB_HOST=db:3306
      - DB_NAME=gitea
      - DB_USER=gitea
      - DB_PASSWD=gitea
      - DOMAIN=git.huangfamily.cn
    restart: always
    networks:
      - gitea
    volumes:
      - ./gitea:/data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
      - /home/git/.ssh/:/data/git/.ssh
    ports:
      - "4001:3000"
      - "4002:22"
    depends_on:
      - db

  db:
    image: mysql:8
    restart: always
    security_opt:
      - seccomp:unconfined
    environment:
      - MYSQL_ROOT_PASSWORD=gitea
      - MYSQL_USER=gitea
      - MYSQL_PASSWORD=gitea
      - MYSQL_DATABASE=gitea
    networks:
      - gitea
    volumes:
      - ./mysql:/var/lib/mysql
language-yaml复制代码

整合 Drone CI

基于 Gitea 和 Drone 的轻量级的 CI 解决方案。

安装配置

services:
  drone-server:
    container_name: drone-server
    image: drone/drone:latest
    restart: always
    environment:
      - DRONE_GITEA=true
      - DRONE_GITEA_SERVER=http://192.168.18.241:3000
      - DRONE_GITEA_CLIENT_ID=569bfde3-640d-417c-a3eb-58f5065c2b07
      - DRONE_GITEA_CLIENT_SECRET=IWz8rOOIzTclkg2oNYfFxpprtGbfhSWxum8nESpWS0Qp
      - DRONE_GIT_ALWAYS_AUTH=true
      - DRONE_GITEA_SKIP_VERIFY=true
      - DRONE_RUNNER_CAPACITY=2
      - DRONE_SERVER_PROTO=http
      - DRONE_SERVER_HOST=192.168.18.241:7890
      - DRONE_NETWORK=cicd_default
      - DRONE_RUNNER_NETWORKS=cicd_default
      # 这个密钥是给runner用的
      - DRONE_RPC_SECRET=07d3caaa3e2d2d33bc1ce18c60d43213
      - DRONE_AGENTS_ENABLED=true
      - SET_CONTAINER_TIMEZONE=true
      - CONTAINER_TIMEZONE=Asia/Shanghai
      - DRONE_USER_CREATE=username:test_admin,admin:true
    ports:
      # 控制台页面端口
      - "7890:80"
    #   - 9000:9000
    volumes:
      - /etc/timezone:/etc/timezone
      - /etc/localtime:/etc/localtime

  drone-runner:
    container_name: drone-runner
    image: drone/drone-runner-docker:latest
    restart: always
    depends_on:
      - drone-server
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /etc/timezone:/etc/timezone
      - /etc/localtime:/etc/localtime
    environment:
      - SET_CONTAINER_TIMEZONE=true
      - CONTAINER_TIMEZONE=Asia/Shanghai
      - DRONE_RPC_PROTO=http
      # 如果直接使用本配置,这儿不需要改,如果部署到DRONE_RUNNER_LABELS其他服务器,需要填server的域名
      - DRONE_RPC_HOST=drone-server
      # server配置的DRONE_RPC_SECRET
      - DRONE_RPC_SECRET=07d3caaa3e2d2d33bc1ce18c60d43213
      - DRONE_RUNNER_CAPACITY=2
      - DRONE_RUNNER_NAME=drone-runner
      - DRONE_RPC_SKIP_VERIFY=true
      # 下面注释的是runner的控制台,没必要加上,server可以直接看到
      # - DRONE_UI_USERNAME=root
      # - DRONE_UI_PASSWORD=root
    # ports:
    #   - 3000:3000
language-yml复制代码

配置文件

---
kind: pipeline
type: docker
name: default

clone:
  depth: 2

steps:
  - name: restore-cache
    image: ccr.ccs.tencentyun.com/huangfamily/drone-volume-cache:0.1
    settings:
      restore: true
      mount:
        - ./.npm-cache
        - ./node_modules
    volumes:
      - name: cache
        path: /cache

  - name: npm-install
    image: ccr.ccs.tencentyun.com/huangfamily/node:16.14.0-alpine
    commands:
      - npm config set cache ./.npm-cache --global
      - npm install

  - name: rebuild-cache
    image: ccr.ccs.tencentyun.com/huangfamily/drone-volume-cache:0.1
    settings:
      rebuild: true
      mount:
        - ./.npm-cache
        - ./node_modules
    volumes:
      - name: cache
        path: /cache

  - name: docker-build
    image: plugins/docker:20.10.9
    settings:
      registry: registry.cn-guangzhou.aliyuncs.com
      username:
        from_secret: docker_username
      password:
        from_secret: docker_password
      tag: 0.0.1
      dockerfile: Dockerfile
      repo: registry.cn-guangzhou.aliyuncs.com/hjxstart/graduation_project
    when:
      status: [push]

  - name: deploy
    image: appleboy/drone-ssh:1.6.3
    settings:
      host:
        from_secret: PROD_IP
      username: root
      password:
        from_secret: PROD_PWD
      port: 22
      script:
        - echo ====暂停容器开始=======
        - docker stop graduation_project`
        - docker rm -f graduation_project`
        - docker images | grep graduation_project
        - docker rmi -f `docker images | grep graduation_project | awk '{print $3}'`
        - echo ====开始部署=======
        - docker pull registry.cn-guangzhou.aliyuncs.com/hjxstart/graduation_project:0.0.1
        - docker run -p 5000:5000 -d --name=graduation_project registry.cn-guangzhou.aliyuncs.com/hjxstart/graduation_project:0.0.1
        - docker logs graduation_project
        - docker ps | grep graduation_project
        - echo ====部署成功======

  - name: notification
    image: lddsb/drone-dingtalk-message:1.2.8
    settings:
      token: https://oapi.dingtalk.com/robot/send?access_token=XXX
      type: markdown
      secret: SEC7fe9d27f27ea58d1d54dc602XXXXX
      tpl_build_status_success: "流水线执行成功 🎉🎉🎉"
      tpl_build_status_failure: "流水线执行失败"
      tpl: "./dingtalk.tpl"
    when:
      status: [failure, success]
volumes:
  - name: cache
    host:
      path: /tmp/cache/graduation_project
language-yml复制代码

钉钉通知模板

[TPL_REPO_SHORT_NAME] [TPL_COMMIT_BRANCH] [TPL_BUILD_STATUS] 耗时[TPL_BUILD_CONSUMING]s
language-tpl复制代码

Gitlab

安装

运行 Gitlab

sudo docker run --detach \
  --hostname 192.168.18.199 \
  --publish 20443:443 --publish 20080:80 --publish 20022:22 \
  --name gitlab \
  --restart always \
  --volume /home/hjx/docker/gitlab/config:/etc/gitlab \
  --volume /home/hjx/docker/gitlab/logs:/var/log/gitlab \
  --volume /home/hjx/docker/gitlab/data:/var/opt/gitlab \
  gitlab/gitlab-ce:latest
language-shell复制代码

Gitlab 重置密码

docker exec -it gitlab /bin/bash
gitlab-rails console -e production
user = User.where(id: 1).first
user.password = '密码'
user.password_confirmation = '密码'
user.save!
language-shell复制代码

配置邮件和修改clone地址

vim /etc/gitlab/gitlab.rb

gitlab_rails['time_zone'] = 'Asia/Shanghai'
gitlab_rails['gitlab_email_display_name'] = 'gitlab'
gitlab_rails['gitlab_email_from'] = 'xiangjiandev@163.com'
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.163.com"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "xiangjiandev@163.com"
gitlab_rails['smtp_password'] = "授权码"
gitlab_rails['smtp_domain'] = "smtp.163.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true
user["git_user_email"] = "xiangjiandev@163.com"

gitlab_rails['gitlab_ssh_host'] = '192.168.52.129'
gitlab_rails['gitlab_shell_ssh_port'] = 8022

docker exec -it gitlab /bin/bash
gitlab-ctl reconfigure
gitlab-ctl restart
language-shell复制代码

概述

业务要求

  1. 使用docker部署gitlab.
  2. 使用外部Nginx反向代理gitlab.
  3. 使用gitlab.xj.com域名访问gitlab.
  4. 使用Centos7.6
  5. 使用内网地址192.168.18.125

步骤

docker安装gitlab镜像

  1. 下载gitlab镜像
docker pull gitlab/gitlab-ce
复制代码
  1. 启动镜像
docker run --detach \
--hostname gitlab.xj.com \
--publish 20080:80 --publish 20022:22 \
--name gitlab \
--restart always \
--volume /data/gitlab/config:/etc/gitlab \
--volume /data/gitlab/logs:/var/log/gitlab \
--volume /data/gitlab/data:/var/opt/gitlab \
gitlab/gitlab-ce:latest
复制代码
  1. 测试本机安装的gitlab http://192.168.18.125:20080

配置使用外部的nginx服务器

  1. 关闭gitlab内部的nginx服务官网
vim /data/gitlab/config/gitlab.rb
复制代码

在配置文件最末尾加上配置

nginx['enable'] = false 
web_server['external_users'] = ['www-data']
复制代码

使配置生效

docker exec gitlab gitlab-ctl reconfigure
复制代码
  1. 配置本机上的nginx.新nginx虚拟机配置文件,我的虚拟机配置文件在/usr/local/nginx/conf/vhost
touch /usr/local/nginx/conf/vhost/gitlab.xj.com.conf
vim /usr/local/nginx/conf/vhost/gitlab.xj.com.conf
复制代码

下载官方的配置文件官网.配置文件有http 和 https两个版本,这里我选择了http第一个

## GitLab 8.3+
##
## Lines starting with two hashes (##) are comments with information.
## Lines starting with one hash (#) are configuration parameters that can be uncommented.
##
##################################
##        CONTRIBUTING          ##
##################################
##
## If you change this file in a Merge Request, please also create
## a Merge Request on https://gitlab.com/gitlab-org/omnibus-gitlab/merge_requests
##
###################################
##         configuration         ##
###################################
##
## See installation.md#using-https for additional HTTPS configuration details.

upstream gitlab-workhorse {
  # On GitLab versions before 13.5, the location is
  # `/var/opt/gitlab/gitlab-workhorse/socket`. Change the following line
  # accordingly.
  # 修改这里==================1
  server unix:/data/gitlab/data/gitlab-workhorse/sockets/socket;
}

## Normal HTTP host
server {
  ## Either remove "default_server" from the listen line below,
  ## or delete the /etc/nginx/sites-enabled/default file. This will cause gitlab
  ## to be served if you visit any address that your server responds to, eg.
  ## the ip address of the server (http://x.x.x.x/)n 0.0.0.0:80 default_server;
  listen 0.0.0.0:80 default_server;
  listen [::]:80 default_server;
  # 修改这里==================2
  server_name gitlab.xj.com; ## Replace this with something like gitlab.example.com
  server_tokens off; ## Don't show the nginx version number, a security best practice
  root /opt/gitlab/embedded/service/gitlab-rails/public;

  ## See app/controllers/application_controller.rb for headers set

  ## Individual nginx logs for this GitLab vhost
  access_log  /var/log/nginx/gitlab_access.log;
  error_log   /var/log/nginx/gitlab_error.log;

  location / {
    client_max_body_size 0;
    gzip off;

    ## https://github.com/gitlabhq/gitlabhq/issues/694
    ## Some requests take more than 30 seconds.
    proxy_read_timeout      300;
    proxy_connect_timeout   300;
    proxy_redirect          off;

    proxy_http_version 1.1;

    proxy_set_header    Host                $http_host;
    proxy_set_header    X-Real-IP           $remote_addr;
    proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
    proxy_set_header    X-Forwarded-Proto   $scheme;

    proxy_pass http://gitlab-workhorse;
  }
}
复制代码
  1. 在nginx.conf上添加上
vim /usr/local/nginx/conf/nginx.conf
# 1.配置成root用户,gitlab代理权限问题
user root;

worker_processes  1
...

http {
    ...
    # g zip
    # 2.把配置文件包含进了
    include      /usr/local/nginx/conf/vhost/gitlab.xj.com.conf;
....
  1. 配置完成后检查./nginx -t 是否正常,没问题重新载入配置即可。
cd /usr/local/nginx/sbin/
./nginx  启动
./nginx -s stop  停止
./nginx -s quit  安全退出
./nginx -s reload  重新加载配置文件
ps aux|grep nginx  查看nginx进程
复制代码

修改目录权限

chown -R 777 /data/gitlab/data/gitlab-workhorse/
复制代码

主要参考资料

  1. docker安装gitlab后的配置修改
  2. docker安装部署gitlab,docker安装部署gitlab配置使用外部nginx
  3. Install Docker Engine on CentOS
  4. 镜像加速器

GitLab私有部署

  1. Centos7.6 (/boot 需要2G)
  2. gitlab-ce-12.5.2-ce.0.el7.x86_64.rpm

安装GitLab

yum localinstall gitlab-ce-12.5.2-ce.0.el7.x86_64.rpm

  1. 修改配置文件

修改配置

  1. Gitlab 邮箱配置
vim /etc/gitlab/gitlab.rb
# 将external_url 变量的地址修改为gitlab 所在centos 的ip 地址。
external_url 'http://gitlab.example.com'

# 因为修改了配置文件,故需要重新加载配置内容
gitlab-ctl reconfigure
gitlab-ctl restart

# 修改配置文件
vim /etc/gitlab/gitlab.rb

# 添加以下配置
gitlab_rails['time_zone'] = 'Asia/Shanghai'
gitlab_rails['gitlab_email_display_name'] = 'gitlab'
gitlab_rails['gitlab_email_from'] = 'hjxstart@163.com'
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.163.com"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "hjxstart@163.com"
gitlab_rails['smtp_password'] = "授权码"
gitlab_rails['smtp_domain'] = "smtp.163.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true
user["git_user_email"] = "hjxstart@163.com"

# 测试配置是否成功
gitlab-rails console

# 发送邮箱
Notify.test_email('hjxstart@163.com','test mail', 'test mail').deliver_now
  1. 第一次使用root 登陆
  • 在浏览器输入ip地址即可

Gitlab 使用流程

账号的申请

  1. 开发人员提供以下资料给管理员:姓名(用于展示用户项目);邮箱(用于接受密码接收推送通知等)
  2. 收到重置密码邮箱之后进行密码重置,密码需要设置8为以上,建议使用自己的姓名+数字组成
  3. 账号申请,组对应公司里开发团队
  4. 创建账号,分别创建用户pm(项目经理)、dev1(开发1)、dev2(开发2)、test1(测试一)。账号创建后默认密码会发送邮件,第一次登陆哟去修改密码
  5. 用户加入组: pm用户作为组的所有者

客户端安装

  1. 首先安装git
  2. 然后安装TortoiseGit

SSH key 使用

  1. 生成ssh key
  • 方法一:可视化创建ssh key, 在任意文件夹下点击右键,选择 Git GUI Here。在弹出的程序中选择主菜单的[Help] -> [Show SSH Key]
  • 方法二:命令行方式创建ssh key
# linux
# 默认为rsa加密算法
ssh-keygen -C "hjxstart@126.com" -f ~/.ssh/id_rsa -N '' -q
# -t: 指定为dsa加密算法; -f: 指定存放的位置; -C: 邮箱;-P 密码; -q: 静默模式
ssh-keygen -t dsa -f ~/.ssh/id_dsa -C "hjxstart@126.com" -P '' -q
# windows
ssh-keygen.exe -f ~/.ssh/id_rsa -C "hjxstart@126.com" -N '' -q
  1. 查看 SSH key
cat ~/.sshid_rsa.pub
  1. 添加 SSH key。
  • 打开Gitlab 登录自己的账号
  • 进入用户设置,找到SSHkeys
  • 点击右侧 Add SSH Key
  • 输入上一步生成的key
  • 点击Add key 即添加成功一个key

新建项目规则

  1. 创建项目组
  2. 使用之前创建的项目组。
  3. 进行添加用户。
  4. 项目经理指定开发计划
    app 需求 开发者 完成日期
    v1.0 首页 dev1 2.5
    新闻 dev1 2.7
    支付 dev2 2.7
    博客 dev2 2.8
  • 创建里程碑 lssues > Miletones > new Miletones (Title: v1.0; Description: 官网v1.0)
  • 分配任务 lssues > new lssues(Title:首页; Descripiton: 首页开发;Assignce(指派): dev1;Miletones: v1.0;结束时间)

项目检出check

# 1. 克隆项目
git clone 

# 2. 配置用户信息
git config --gloabl user.name dev1
git config --gloabl user.email dev1@126.com

# 3. 创建分支branch
git branch branchName

# 4. 代码提交Commit
git commit -m "我是提交描述"
# 提交时可以带上需要关闭的任务编号,确认请求会自动关闭问题
git commit -m "close #2"

# 5. 代码拉取Pull
git Pull

# 6. 代码推送Push
git push

# 7. 代码标签tag

# 8. 代码冲突解决

# 9. 创建忽略文件
.gitignore

# 10. 发出合并请求,先登录 dev1, Merge Requests > new merge request (选择 index分支)。
# Assignee: pm(指派给项目经理合并,权限); 里程碑 Mileestone(V1.0)

# 11. 项目经理登录确认合并请求

# 12. 项目经理可以去 issues 手动关闭任务

Gitlab备份与回复

备份管理

  1. 配置文件中加入 # vim /etc/gitlab/gitlab.rb
gitlab_rails['backup_path'] = '/data/backup/gitlab'
gitlab_rails['backup_keep_time'] = 604800
  1. 重置配置: gitlab-ctl reconfigure
  2. 如果自定义备份目录需要赋予git权限
mkdir /data/backup/gitlab -p
chown -R git.git /data/backup/gitlab
  1. 重置配置: gitlab-ctl reconfigure
  2. 手动备份
gitlab-rake gitlab:backup:create
  1. 查看备份
ls /data/backup/gitlab -ps

恢复管理

恢复是删除原有数据,恢复备份tar包中的数据。

  1. 先停止数据写入服务
gitlab-ctl stop unicorn
gitlab-ctl stop sidekiq
  1. 还原
# 1. 查看要还原的文件
ls /data/backup/gitlab -p
# 2. 还原,只需要写到时间戳就可以了1625903798_2021_07_10_12.5.2_gitlab_backup.tar
gitlab-rake gitlab:backup:restore BACKUP=1625903798_2021_07_10_12.5.2
# 3. 查看时间戳的时间
date -d @1625903798
  1. 设定计划划任务
定时任务Crontab中加入
0 2 * * * /usr/bin/gitlab-rake gitlab:backup:create
策略建议: 本地保留三到七天 在异地备份永久保存
手动备份测试: gitlab-rake gitlab:backup:create
# ls /data/backup/gitlab/
1576053273_2019_12_11_12.5.2_gitlab_backup.tar
注意 gitlab.rb 和 gitlab-secrets.json 两个文件包含敏感信息。
未被备份到备份文件中。需要手动备份

基于Jenkins 实现持续集成

持续集成(Continuous integration)

  1. 持续集成(CI)简介。持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员媒体至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽快地发现集成错误。许多团队发现这个过程可以大大减少集成的问题,让团队能够更快的开发内聚的软件。
  2. 没有持续集成。项目做模块集成的时候,发现很多接口都不通(浪费大量时间)。需要人手动去编译打包最新的代码(构建过程不透明)。发布代码,上线,基本靠手(脚步乱发)。
  3. 持续集成最佳实践。
  4. 持续集成的过程

持续交付(Continuous delivery, CD)

持续部署(Continuous Deployment, CD)

常用命令

  1. gitlab-ctl command
gitlab-ctl start # 启动所有服务
gitlab-ctl restart # 重启所有服务
gitlab-ctl stop # 关闭所有服务
gitlab-ctl status # 查看所有服务状态
gitlab-ctl tail	# 查看日志信息
gitlab-ctl service-list # 列举所有启动服务
gitlab-ctl  graceful-kill # 平稳停止一个服务
gitlab-ctl reconfigure # 修改配置文件之后,需要重新加载下
gitlab-ctl show-config # 查看所有服务配置文件信息
gitlab-ctl uninstall # 卸载这个软件
gitlab-ctl cleanse # 删除gitlab 数据,重新白手起家

目录

  1. 库默认存储目录:
    /var/opt/gitlab/git-data/repositories/rootopt/gitlab
  2. 应用代码和相应的依赖程序: /opt/gitlab
  3. 命令编译后的应用数据和配置文件,不需要人为修改配置后的应用数据和
    配置文件: /var/opt/gitlab: gitlab-ctl reconfigure:命令编译后的应用数据和
    配置文件,不需要人为修改配置
  4. 配置文件目录: /etc/gitlab
  5. 此目录下存放了gitlab各个组件产生的日志: /var/log/gitlab
  6. 备份文件生成的目录: /var/opt/gitlab/backups/

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以邮件至 hjxstart@126.com