Github学习目标
- 了解git常用概念/命令/操作、分支操作:创建、合并、删除等
- 了解工作区、暂存区、本地仓库、远程仓库的概念、标签概念
- 了解github代码仓库,github action,参考GitHub Actions documentation
作业
① 写下对工作区、暂存区、本地仓库、远程仓库的理解,并阐述哪些命令可以使文件在这些区域内切换。
② 在自己的gihub账号下新建一个仓库,把Docker学习计划中的Python代码上传到该仓库。
- 不能直接合入master,需要创建一个新分支,并开启PR,请求 @Review
- 环境变量写入 .env中,并把文件 .env添加到忽略文件,不要上传
- 列出过程中使用到的git命令
③利用Github action实现合入主分支时,执行Docker build image,并打上review时评论的tag,推送到个人Dockerhub仓库, 实在遇到困难时,可以参考现有的CI/CD流程实现
④ 编写一个Runner,当合入主分支时,自动部署/更新到学习服务器上。参考 About self-hosted runners
Gibhub学习笔记
一、安装部署
Debian/Ubuntu Git 安装命令为:
$ apt-get install libcurl4-gnutls-dev libexpat1-dev gettext libz-dev libssl-dev
$ apt-get install git
$ git --version
git version 1.8.1.2
二、工作区、暂存区、仓库区、远程仓库、标签
Workspace: 工作区,就是你平时存放项目代码的地方
Index / Stage: 暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息
Repository: 仓库区(或版本库),就是安全存放数据的位置,这里面有你提交到所有版本的数据 ,其中HEAD指向最新放入仓库的版本
Remote: 远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换
标签的使用
# 添加标签
$ git tag v1.0.0
# 查看标签
$ git tag
v1.0.0
# 搜索标签
$ git tag -l v1.*
v1.0.0
# 删除标签
git tag -d v1.0.0
# 推送标签
git push –-tags
追加标签,分辨版本
datalab@datalabvm12:~/pyDemo$ git tag -a prtest2 7d9776d
datalab@datalabvm12:~/pyDemo$ git push origin prtest2
Enumerating objects: 1, done.
...
To github.com:Power099/pydocker-test.git
* [new tag] prtest2 -> prtest2
datalab@datalabvm12:~/pyDemo$
三、linux上传代码到github仓库
1.设置用户名和邮箱
datalab@datalabvm12:~/pyDemo$ git config --global user.name "Power099"
datalab@datalabvm12:~/pyDemo$ git config --global user.email "1342170594@qq.com"
datalab@datalabvm12:~/pyDemo$ git config --list
user.name=Power099
user.email=1342170594@qq.com
2.建立服务器和Github的SSH链接
(1)生成本地SSH Keys
使用 ssh-keygen -t rsa -C <密钥注释>"
命令生成密钥,-t 参数为密钥类型;-c 参数为密钥注释,一般填写自己的邮箱
datalab@datalabvm12:~/pyDemo$ ssh-keygen -t rsa -C "1342170594@qq.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/datalab/.ssh/id_rsa):
Created directory '/home/datalab/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/datalab/.ssh/id_rsa
Your public key has been saved in /home/datalab/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 1342170594@qq.com
The key's randomart image is:
+---[RSA 3072]----+
|..+oo.+o ..+ |
|.+.* o. . + . |
|XXXXXXXXXXXXXXXXX|
|*o+ o + . ..|
|+B o S . |
|XXXXXXXXXXXXXXXXX|
|.E. o o o |
|o. . o o . o |
|o . . . oo.|
+----[SHA256]-----+
之后会系统会提示key的保存位置(一般是~/.ssh目录)和指定口令,保持默认即可,连续三次回车之后系统会显示生成的密钥路径
(3)添加本地SSH Keys 到远程仓库
进入上一步显示的路径(到.ssh),使用 cat 命令复制目录下 id_rsa.pub 文件内的内容,然后添加到 Github 中
Github右上角头像->setting->SSH and GPG keys->new SSH key
title 标题可以随便填,key 粘贴在你电脑上生成的 key
(4)验证连接
ssh -T git@github.com
命令验证是否成功,如有以下显示则成功
datalab@datalabvm12:~/.ssh$ ssh -T git@github.com
The authenticity of host 'github.com (20.205.243.166)' can't be established.
ECDSA key fingerprint is XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'github.com,20.205.243.166' (ECDSA) to the list of known hosts.
Hi Power099! You've successfully authenticated, but GitHub does not provide shell access.
3.环境变量写入.env文件中,并把.env文件添加到忽略文件
(1)将环境变量写入.env文件中
datalab@datalabvm12:~/pyDemo$ cat .env
# mariadb pydocker
MARIADB_ROOT_PASSWORD=123456
MARIADB_USER=datalab
MARIADB_PASSWORD=123456
MARIADB_DATABASE=testdb
MARIADB_PORT=3307
MARIADB_HOST=10.80.28.13
docker-compose.yml文件
datalab@datalabvm12:~/pyDemo$ cat docker-compose.yml
version: "3"
services:
...
environment:
- MARIADB_USER
- MARIADB_DATABASE
- MARIADB_PASSWORD
- MARIADB_PORT
- MARIADB_HOST
...
(2)将.env文件写入.gitignore文件
datalab@datalabvm12:~/pyDemo$ cat .gitignore
# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
4.上传项目到指定远程分支
(1)进入项目根目录,并执行 git init
命令初始化Git
datalab@datalabvm12:~/pyDemo$ git init
Initialized empty Git repository in /home/datalab/pyDemo/.git/
(2)使用 git remote add origin [仓库地址]
命令关联远程仓库:
datalab@datalabvm12:~/pyDemo$ git remote add origin git@github.com:Power099/pydocker-test.git
其中 origin为远程仓库别名,后期上传代码直接使用别名上传代码,就不需要每次输入仓库地址了。
使用 git remote -v
命令查看远程仓库地址及名称
datalab@datalabvm12:~/pyDemo$ git remote -v
origin git@github.com:Power099/pydocker-test.git (fetch)
origin git@github.com:Power099/pydocker-test.git (push)
(3)将本地代码添加到本地Git缓存区
git add .
Git 的 add 有三种形式:
- git add . :他会监控工作区的状态树,使用它会把工作时的所有变化提交到暂存区,包括文件内容修改(modified)以及新文件(new),但不包括被删除的文件。
- git add -u :他仅监控已经被add的文件(即tracked file),他会将被修改的文件提交到暂存区。add -u 不会提交新文件(untracked file),(git add --update的缩写)
- git add -A :是上面两个功能的合集(git add --all的缩写)
(4)将缓存区内容添加到本地仓库
通过如下命令将本地缓存区的内容添加到本地仓库并添加注释:
datalab@datalabvm12:~/pyDemo$ git commit -m "pydocker"
[master (root-commit) 8d342ba] pydocker
7 files changed, 301 insertions(+)
create mode 100644 Dockerfile
create mode 100644 README.md
create mode 100644 docker-compose.yml
create mode 100644 hello.py
create mode 100644 py_mariadb.py
create mode 100644 requirements.txt
create mode 100644 wait-for
(5)推送新分支与数据到远端仓库
(需提前Github创建master分支,否则新建分支会替代master变为default分支)
使用 git checkout -b [Branch Name]
命令来创建一个分支:
git push [alias] [branch]
命令将你的 [branch] 分支推送成为 [alias] 远程仓库上的 [branch] 分支,实例如下。
datalab@datalabvm12:~/pyDemo$ git push origin brtest
Enumerating objects: 9, done.
Counting objects: 100% (9/9), done.
Delta compression using up to 8 threads
Compressing objects: 100% (7/7), done.
Writing objects: 100% (9/9), 3.58 KiB | 3.58 MiB/s, done.
Total 9 (delta 0), reused 0 (delta 0)
To github.com:Power099/pydocker-test.git
* [new branch] brtest -> brtest
(6)将远程仓库内容更新到本地
git pull origin
5.开启Pull Requests,请求 @Review
拉取你要@Review的成员:Setting->collaborators->Add people
网页打开Github仓库->Pull requests->Compare & pull requests->右侧设置Assignees和Reviewers
6.Git把当前分支上的修改转移到其他分支上
①先在当前分支commit
git add .
git commit -m "CV-596-Yield-histogram-statistics:test 01"
[CV-596-Yield-histogram-statistics e04b299] CV-596-Yield-histogram-statistics:test 01
6 files changed, 192 insertions(+), 6 deletions(-)
create mode 100644 tests/dao/test_machine_group_dao.py
②获取本次commit的ID或者开头的hash码e04b299
git rev-parse HEAD
③切换到其他分支
git checkout CV-640-Configure-machine-group
④在新分支上执行 cherry-pick
git cherry-pick e04b299
⑤所有修改过的代码已提交到了当前新分支
四、[Actions]合入主分支时推送到DockerHub个人仓库
GitHub Actions 供了一个高效易用的 CI/CD(持续集成、持续部署)工作流,帮助我们自动构建、测试、部署我们的代码。
1.Commond fields
github.event.issue.title
github.event.issue.body
github.event.pull_request.title
github.event.pull_request.body
github.event.comment.body
github.event.review.body
github.event.review.state
github.event.review_comment.body
github.event.pages.*.page_name
github.event.commits.*.message
github.event.head_commit.message
github.event.head_commit.author.email
github.event.head_commit.author.name
github.event.commits.*.author.email
github.event.commits.*.author.name
github.event.pull_request.head.ref
github.event.pull_request.head.label
github.event.pull_request.head.repo.default_branch
github.head_ref
2.完整代码
name: Docker Image CI
on:
pull_request_review:
types:
- submitted
- edited
jobs:
build:
if: ${{ github.event.review.state == 'approved' && contains(github.event.review.body, 'release-') && github.event.pull_request.base.ref == 'master' }}
runs-on: ubuntu-latest
steps:
- name: Checkout Source
uses: actions/checkout@v3
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Login to Docker Hub
uses: docker/login-action@v2
with:
username: airasuka
password: ${{ secrets.DOCKER_HUB_PWD }}
- name: Build and push
uses: docker/build-push-action@v4
with:
push: true
tags: airasuka/pydocker:${{ github.event.review.body }}
3.逐句理解
事件(event)命名
name: Docker Image CI
设置触发器,在遇到pull_request_review 事件 submitted或edited时启动工作流,多个触发器在 任一条件触发 时都会启动工作流
on:
pull_request_review:
types:
- submitted
- edited
作业(job),添加if语句筛选 审查状态为通过 && 审查评论包含’release-’ && 拉取请求的合并分支是master
jobs:
build: # 作业命名,自定义
if: ${{ github.event.review.state == 'approved' && contains(github.event.review.body, 'release-') && github.event.pull_request.base.ref == 'master' }}
runs-on: ubuntu-latest
作业步骤(steps)
steps:
actions/开头表明引用官方的action方法,方法库可以在右方直接搜索,也可以查看 Marketplace
如果下文中需要引用官方action,则需要加入步骤actions/checkout@v3,其中v3为版本号
- name: Checkout Source
uses: actions/checkout@v3
与上一步同理,如果需要引用docker官方合作的action方法需要加以下两步
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
登录DockerHub,其中secert变量可以保护私密信息以 *** 的形式输出
设置secrets变量:Repository->Settings->Secrets and variables
secrets调用案例:${{ secrets.DOCKER_HUB_PWD }}
- name: Login to Docker Hub
uses: docker/login-action@v2
with:
username: airasuka
password: ${{ secrets.DOCKER_HUB_PWD }}
构建与推送,tag格式:账号名/仓库名(镜像名):标签,更详细的调用见 Build and push Docker images
- name: Build and push
uses: docker/build-push-action@v4
with:
push: true
tags: airasuka/pydocker:${{ github.event.review.body }}
4.运行测试
(可选)因为触发设定是拉取评论+合入主分支,可以在Repository->Setting->Branches->add branch protection rule中设置master分支规则Require a pull request before merging->require number of approvals before merging 即在合并前必须设置一个审阅人,但是必须在组织内或公开仓库
pull_requests->添加审阅人->切换审阅人账号->Add your review->审阅->评论->批准
五、编写Runner,当合入主分支时自动部署/更新到服务器上
1.部署runner
Repository->Setting->Actions->Runners->New self-hosted runner,在本机上按提示代码运行命令,完成连接
About self-hosted runners
linux架构参考:
# 查看系统的架构
file /lib/systemd/systemd
/lib/systemd/systemd: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0,
# 比如我的64位就选择x64
2.根据你的需求编写yml文件
.github/workflow/deploy.yml 文件
name: Deploy on server
on:
push:
branches: [ "master" ]
jobs:
deploy:
runs-on: self-hosted
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Run tests
run: |
cd /home/datalab/pyDemo
git pull origin master
git pull origin brtest
docker build -t pydocker .
docker-compose up -d
docker-compose down
查看运行结果
2023-08-25 03:30:12Z: Running job: deploy
2023-08-25 03:30:38Z: Job deploy completed with result: Succeeded
^CExiting...
Runner listener exit with 0 return code, stop the service, no retry needed.
Exiting runner...
datalab@datalabvm12:~/pyDemo/actions-runner$ cd ..
datalab@datalabvm12:~/pyDemo$ ls
Dockerfile README.md Runner-test.txt actions-runner docker-compose.yml py_mariadb.py requirements.txt wait-for
datalab@datalabvm12:~/pyDemo$ cat Runner-test.txt
1
2 # 文件内容已更新
3.将自托管运行器应用程序配置为服务
您可以将自托管运行器应用程序配置为服务,以便在计算机启动时自动启动运行器应用程序
1.如果自托管运行器应用程序当前正在运行,请停止该应用程序。
2.使用以下命令安装服务:
sudo ./svc.sh install
或者,该命令采用可选user参数来以不同用户身份安装服务。
./svc.sh install USERNAME
3.启动服务
使用以下命令启动服务:
sudo ./svc.sh start
3.检查服务的状态
使用以下命令检查服务的状态:
sudo ./svc.sh status
有关查看自托管运行器状态的更多信息,请参阅“监控自托管运行器并进行故障排除”。
4.停止服务
使用以下命令停止服务:
sudo ./svc.sh stop
5.卸载服务
如果服务当前正在运行,请停止该服务。
使用以下命令卸载该服务:
sudo ./svc.sh uninstall
学习参考
Git教程
【Git】(1)—工作区、暂存区、版本库、远程仓库
#超详细# linux下 使用 Git 将代码上传到指定分支
Creating a pull request from a fork
如何在 GitHub 提交第一个 pull request
git学习–GitHub上如何进行PR(Pull Request)操作
Features·Code review
如何在GitHub上给项目提PR(Pull Request)
分配议题和拉取请求到其他 GitHub 用户
What is .env ? How to Set up and run a .env file in Node?
Github Actions
GitHub Actions,卧槽!牛批!
gitflow流程示例
Awesome Actions
Comment Pull Request - GitHub Actions
GitHub Actions security
查看Linux系统架构的命令,查看linux系统是哪种架构:AMD、ARM、x86、x86_64、pcc 或 查看Ubuntu的版本号