简介:
以前介绍过docker hub 直接连接github编译docker镜像,但是已经停止服务了,不知道企业会员还有没有。
那么以后我们就自己编译docker镜像了么?至少现在github被微软收购以后,财大气粗,服务器资源多的不要不要的。有了action这个东西。
用在自动化,持续化部署上面。那么我们就有了可以借鉴的地方了,持续化自动部署,很多时候是要编译镜像,上传仓库的。然后再……不懂了。
一:github action是什么
GitHub Actions 是 GitHub 的持续集成服务,于2018年10月推出。
GitHub 做了一个官方市场,可以搜索到他人提交的 actions。另外,还有一个 awesome actions 的仓库,也可以找到不少 action。
二:github action基本概念
GitHub Actions 有一些自己的术语。
(1)workflow (工作流程):持续集成一次运行的过程,就是一个 workflow。
(2)job (任务):一个 workflow 由一个或多个 jobs 构成,含义是一次持续集成的运行,可以完成多个任务。
(3)step(步骤):每个 job 由多个 step 构成,一步步完成。
(4)action (动作):每个 step 可以依次执行一个或多个命令(action)。
三:github action配置文件
GitHub Actions 的配置文件叫做 workflow 文件,存放在代码仓库的.github/workflows
目录。
workflow 文件采用 YAML 格式,文件名可以任意取,但是后缀名统一为.yml
,比如foo.yml
。一个库可以有多个 workflow 文件。GitHub 只要发现.github/workflows
目录里面有.yml
文件,就会自动运行该文件。
workflow 文件的配置字段非常多,详见官方文档。下面是一些基本字段。
四:GitHub Actions 快速入门
- 在项目中创建目录
.github/workflows
。 - 在目录
.github/workflows
创建文件github-actions-demo.yml
. - Copy the following YAML contents into the
github-actions-demo.yml
file:
name: GitHub Actions Demo
run-name: ${{ github.actor }} is testing out GitHub Actions 🚀
on: [push,workflow_dispatch]
jobs:
Explore-GitHub-Actions:
runs-on: ubuntu-latest
steps:
- run: echo "🎉 The job was automatically triggered by a ${{ github.event_name }} event."
- run: echo "🐧 This job is now running on a ${{ runner.os }} server hosted by GitHub!"
- run: echo "🔎 The name of your branch is ${{ github.ref }} and your repository is ${{ github.repository }}."
- name: Check out repository code
uses: actions/checkout@v3
- run: echo "💡 The ${{ github.repository }} repository has been cloned to the runner."
- run: echo "🖥️ The workflow is now ready to test your code on the runner."
- name: List files in the repository
run: |
ls ${{ github.workspace }}
- run: echo "🍏 This job's status is ${{ job.status }}."
- 推送一下,不管你是客户端git push 还是web页面提交,提交就好了。
点击Actions,就可以看到一个workflow run了,点击 run 里面的标题,进入日志查看。
再点下任务
echo都显示了。
五:dockerfile
FROM alpine:3.7
RUN apk add --no-cache samba-common-tools samba-server
RUN echo $'[global]\n\
netbios name = Samba\n\
workgroup = WORKGROUP\n\
server string = Samba Server\n\
map to guest = bad user\n\
[share]\n\
path = /share\n\
public = yes \n\
writable = yes\n\
create mask = 0765\n'\
>> /etc/samba/smb.conf
VOLUME /etc/samba \
/var/lib/samba
EXPOSE 137/udp \
138/udp \
139/tcp \
445/tcp
CMD nmbd -D && smbd -FS
六:build.yaml
name: build samba
on:
# 手动触发
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: 检出代码
uses: actions/checkout@v3
- name: Setup QEMU
uses: docker/setup-qemu-action@v1.0.2
- name: Setup Buildx
uses: docker/setup-buildx-action@v1.1.2
- name: Docker login
uses: docker/login-action@v1.8.0
with:
#设置两个secrets: docker的用户名和密码
username: "${{ secrets.DOCKERHUB_USERNAME }}"
password: "${{ secrets.DOCKERHUB_PASSWORD }}"
- name: 编译上传docker image
uses: docker/build-push-action@v2.4.0
with:
#Dockerfile的目录
context: ./samba
#编译的目标系统,为了方便玩客云,所以我编译了 arm/v7,amd64
platforms: linux/arm/v6,linux/arm/v7,amd64
push: true
#docker提交的名字
tags: "jackadam/samba:23.2.18,jackadam/samba:latest"
七:再来一个编译gitea的
这个是直接拉别人的代码编译的
name: Gitea
on:
workflow_dispatch:
jobs:
check:
runs-on: ubuntu-latest
outputs:
version: "${{ steps.check.outputs.result }}"
steps:
- name: Compare repo and image version
shell: bash
run: |
new="$(curl -sL https://api.github.com/repos/go-gitea/gitea/releases/latest | jq -r '.tag_name | values | sub("^v";"")')"
if [ -n "$new" ]; then
old="$(curl -sL https://hub.docker.com/v2/repositories/stelas/gitea-arm/tags/${new} | jq -r '.name | values')"
if [ -z "$old" ]; then
echo "version=$new" >> $GITHUB_ENV
fi
fi
- name: Return new version or cancel build
uses: actions/github-script@v3.1.1
id: check
with:
script: |
const { owner, repo } = context.repo
if (${{ env.version == null }}) {
const run_id = "${{ github.run_id }}";
await github.actions.cancelWorkflowRun({ owner, repo, run_id });
return 'false'
} else {
return "${{ env.version }}"
}
result-encoding: string
build:
needs: check
if: needs.check.outputs.version != 'false'
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2.3.4
with:
repository: go-gitea/gitea
ref: "v${{ needs.check.outputs.version }}"
- name: Setup QEMU
uses: docker/setup-qemu-action@v1.0.2
- name: Setup Buildx
uses: docker/setup-buildx-action@v1.1.2
- name: Docker login
uses: docker/login-action@v1.8.0
with:
username: "${{ secrets.DOCKERHUB_USERNAME }}"
password: "${{ secrets.DOCKERHUB_PASSWORD }}"
- name: Build and push images
uses: docker/build-push-action@v2.4.0
with:
context: .
platforms: linux/arm/v6,linux/arm/v7
push: true
tags: "jackadam/gitea-arm:${{ needs.check.outputs.version }},jackadam/gitea-arm:latest"
八:再来一个执行python的
name: 执行python
on:
push:
workflow_dispatch: # 手动触发
#和crontab一样的设置,不过是utc时间,自己减8小时,这个实际是18:30执行
schedule:
- cron: '30 10 * * *' # every day at midnight
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: 检出代码
uses: actions/checkout@v3
- name: 初始化Python
uses: actions/setup-python@v4
with:
python-version: 3.7
- name: 开始
run: |
echo pip install requests
pip install requests
user='${{ secrets.USER }}'
pwd='${{ secrets.PWD }}'
step='${{ secrets.STEP }}'
echo $user
echo $pwd
echo $step
python3 main.py $user $pwd $step
九:后记
这个玩法其实还是挺多的,以前用这个做过freenom自动续签,可惜玩坏了。能定时执行,手动执行,干什么就自己琢磨吧。