安利 GitHub action - 挺香的

青風百里發表於2020-05-02

首先安利一波 github action ,它是免費的功能,目前正在使用它來幫助我構建 docker image 映象。

我自己開發了一個個人部落格,現在基本上實現了自動化部署。目前的流程是這樣的:

  1. 本地修改程式碼
  2. git push
  3. github action 構建映象並把映象推送到騰雲 docker 映象倉庫
  4. 雲伺服器定時檢測 docker image 是否有更新,有則拉取映象,重新部署

基本上算是解放了勞動力了,每次修改功能,只需要推程式碼就可以,香。

關於構建

前端構建

我在專案中寫了一個 dockerfile


FROM node as builder

WORKDIR /srv

COPY ./ /srv

ARG BLOG_BACKEND_API

RUN npm install -g @quasar/cli \
  && npm install \
  && touch /srv/.env \
  && echo API=${BLOG_BACKEND_API} > /srv/.env \
  && quasar build -m ssr

FROM node:lts-alpine

WORKDIR /srv

COPY --from=builder /srv/dist/ssr /srv

RUN npm install

ENTRYPOINT [ "npm", "start"]

github action 可以基於此 dockerfile ,幫我跑 quasar build -m ssr ,打包我的 vue 程式碼。原本需要在本地打包,但是現在由 github action 幫我完成,省下了不少時間。

後端構建

依然是基於 dockerfile


FROM composer as builder

WORKDIR /srv

COPY ./ /srv

ARG SSH_PRIVATE_KEY

ARG TOKEN_FOR_COMPOSER

RUN mkdir /root/.ssh/ \
    && echo ${SSH_PRIVATE_KEY} > /root/.ssh/id_rsa \
    && chmod 600 /root/.ssh/id_rsa \
    && touch /root/.ssh/known_hosts \
    && ssh-keyscan github.com >> /root/.ssh/known_hosts \
    && composer config -g github-oauth.github.com ${TOKEN_FOR_COMPOSER} \
    && composer install --ignore-platform-reqs --no-dev

FROM php:7.4.4-apache

WORKDIR /srv

COPY --from=builder /srv /srv

RUN docker-php-ext-install pdo_mysql \
    && chown -R www-data:www-data /srv/storage \
    && cp ./run.sh /usr/local/bin/run \
    && chmod u+x /usr/local/bin/run \
    && apt-get update \
    && apt-get -y install vim \
    && a2enmod rewrite

CMD ["/usr/local/bin/run"]

此 dockerfile 是常規操作。跑 composer install 安裝依賴,完事後,安裝一些擴充套件,例如我安裝了 pdo_mysql ,然後開啟 apache rewrite ,最終構建起一個可以跑 laravel 的映象。

如何編寫 action 檔案

首先,應該新建一個 workflow 。在 Actions 選項卡頁面,即可新建一個 workflow,如圖,點選 New workflow 按鈕即可。

安利 GitHub action - 挺香的

然後編寫 yml 檔案。例如針對上面的前端構建,我寫了這樣一個 yml檔案

# 指定名字為 CI
name: CI

# 指定當 master 有 push 或者 pr 的時候執行
on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

# 指定 jobs 
jobs:
 # 第一個 job ,叫做 build
  build:
    # 指定跑在 ubuntu 上
    runs-on: ubuntu-latest

    # 每一個 job 又是由多個 steps 構成
    steps:
    # 這是官方提供的一個 action ,大概的作用可以理解為:把該倉庫的程式碼拉到該 ubuntu 上
    - uses: actions/checkout@v2

    # 定義一個名為 Build image 的step,並執行我指定的命令,這裡的命令是跑 docker build 指令,以構建映象。這裡有操作空間,可以幹其他事請,例如發個郵件什麼的。
    - name: Build image
      run: docker build . -t hkccr.ccs.tencentyun.com/qingfengbaili/blog-frontend --build-arg BLOG_BACKEND_API=${{ secrets.BLOG_BACKEND_API }}
    # 登入騰訊的 docker 映象倉庫
    - name: Login to tencnet docker image registry
      run: echo "${{ secrets.TENCENT_REGISTRY_PASSWORD }}" |  docker login --username=100011753229 hkccr.ccs.tencentyun.com --password-stdin
    # 把構建好的映象推送到騰訊倉庫
    - name: Push image to tencent docker image registry
      run: docker push hkccr.ccs.tencentyun.com/qingfengbaili/blog-frontend

上面程式碼中的 secrets.XXX 是一些祕鑰,github 為了保護你的祕鑰,提供了使用變數的辦法,我們可以在倉庫的 Settings -> Secrets 中定義變數,然後按照 ${{ secrets.XXX }} 的格式,即可拿到變數值。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

青風百里

相關文章