首先安利一波 github action ,它是免費的功能,目前正在使用它來幫助我構建 docker image 映象。
我自己開發了一個個人部落格,現在基本上實現了自動化部署。目前的流程是這樣的:
- 本地修改程式碼
- git push
- github action 構建映象並把映象推送到騰雲 docker 映象倉庫
- 雲伺服器定時檢測 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 按鈕即可。
然後編寫 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 協議》,轉載必須註明作者和本文連結