安利 GitHub action - 挺香的
首先安利一波 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 协议》,转载必须注明作者和本文链接
搭车安利一下自己的博客迁移到 Kubernetes 以及配置 CI/CD 的过程: