GitHub Actions 自動化 Node.js 程序

image

關於前言

關於前置知識node

  • 一點點 node
  • 一點點 docker
  • 一點點 git

關於本文的內容:git

  • 使用 Docker 部署應用
  • 使用 GitHub Action 持續集成 Node 應用到 Docker Hub

請預先準備一個 node 的 hello world 的程序,node 官網有提供最簡單的例子github

關於 node 的 docker 鏡像

docker 鏡像化現有應用, 須要一個 dockerfile.dockerignore,如下是例子內的 dockerfiledocker

# 使用父鏡像
FROM node:current-slim

# 設置工做目錄
WORKDIR /usr/src/app

# 將文件從主機複製到當前位置
COPY package.json .

# 影像文件中運行命令
RUN npm install

# 描述容器運行時監聽的端口
EXPOSE 6060

# 在容器中運行的命令
CMD [ "npm", "start" ]

# 將應用程序的其他源代碼從您的主機複製到映像文件系統
COPY . ./

dockerfile 複製了 package.json ,運行 npm install ,並啓動了端口號 6060 的 node 服務shell

可使用如下 docker 指令來生成 http://localhost:6060 的服務express

# 生成 docker image
docker build -t na-example .
# 運行 docker image
docker run -dp 6060:6060 --name na-example na-example

關於 Github Action 自動化的流程

大體指望的流程以下:npm

  1. git push 最新代碼
  2. GitHub Action 開始運行
  3. docker build 最新代碼鏡像
  4. docker login 默認登錄 https://hub.docker.com/
  5. docker push 推送鏡像

GitHub Action 能夠本身項目內 Action 項目內選擇開源的 workflow 生成,選擇 docker 的 workflow ,會在項目內生成 .github/workflows/docker.yml 文件,本項目是從 docker 的 workflow 衍生的json

name: Docker

on:
  push:
    # Publish `main` as Docker `latest` image.
    branches:
      - main
    # Publish `v1.2.3` tags as releases.
    tags:
      - v*

  # Run tests for any PRs.
  pull_request:
    branches:
      - main

env:
  IMAGE_NAME: na-example
  DOCKER_USERNAME: ${{secrets.DOCKER_USERNAME}}
  DOCKER_PASSWORD: ${{secrets.DOCKER_PASSWORD}}

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2
      - name: Build image
        run: docker build -t $IMAGE_NAME .

      - name: Log into DockHub
        run: docker login -u ${{secrets.DOCKER_USERNAME}} -p ${{secrets.DOCKER_PASSWORD}}

      - name: Push image to DockHub
        run: |
          IMAGE_ID=$DOCKER_USERNAME/$IMAGE_NAME

          # 轉換成小寫
          IMAGE_ID=$(echo $IMAGE_ID | tr '[A-Z]' '[a-z]')

          # 從版本中刪除 github-ref Or github-sha 前綴
          VERSION=$(echo "${{ github.sha }}" | sed -e 's,.*/\(.*\),\1,')

          # 從標籤名稱中刪除 v 前綴
          # [[ "${{ github.ref }}" == "refs/tags/"* ]] && VERSION=$(echo $VERSION | sed -e 's/^v//')

          # Use Docker `latest` tag convention
          [ "${{ github.ref }}" == "main" ] && VERSION=latest

          # 保留前 7 位
          VERSION=${VERSION:0:7}

          # 打印 IMAGE_ID
          echo IMAGE_ID=$IMAGE_ID
          # 打印 VERSION
          echo VERSION=$VERSION

          docker tag $IMAGE_NAME ${IMAGE_ID}:$VERSION

          docker push $IMAGE_ID:$VERSION

解析如下這個文件ubuntu

line 1-10:當推送代碼至 main 分支或 tag 中有關鍵字 v 的時候,就會觸發工做流app

line 12-15:工程流內拉取的分支便是 main

line 17-20:定義工做流內的自定義環境變量

line 24runs-on 工做流的運行環境

line 26-27:工做流步驟,以及工做流運行環境

line 28-32:生成 docker 鏡像以及登錄 docker.hub

line 34-60:運行 shell 腳本,條件定義 imagetag,而後上傳至 docker.hub

Secrets

使用 Secrets 做爲 env 變量,須要經過 GitHub 進行設置,項目內 Setting -> Secrets 進行建立便可

PS:比較優秀的事是,即使是相關字符串,在 GitHub Action 內也是 * 號顯示的

關於遇到的問題

Q:關於 node 項目使用 127.0.0.1 或 localhost 做爲啓動 IP 生成 docker image 化後,運行後沒法訪問

A:因爲 127.0.0.1 或 localhost 是指向鏡像內的 IP,非對外 IP,若是須要對外訪問,可把啓動 IP 修改位 0.0.0.0

Q:關於 GitHub Action 默認的環境變量

A:可參考 Context and expression syntax for GitHub Actionsenvironment-variables

關於小結

本文項目全部代碼均從 na-example 粘貼而來

感謝閱讀


關於參考

相關文章
相關標籤/搜索