简介:

以前介绍过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 快速入门

  1. 在项目中创建目录 .github/workflows 。
  2. 在目录.github/workflows 创建文件 github-actions-demo.yml
  3. 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 }}."
  1. 推送一下,不管你是客户端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自动续签,可惜玩坏了。能定时执行,手动执行,干什么就自己琢磨吧。