开发与发布 GitHub Actions(Docker部分)的过程

首先

GitHub Actions非常方便。个人项目基本上可以使用它来满足需求,因为每月可免费使用2000分钟。它支持Docker或JavaScript开发,对于后端和前端都很容易上手。

由于已经有官方的日语文档,所以请您确认最新信息,请查看此处链接。
我个人认为简要概述整个流程会更易理解,所以我写了这篇文章。
我认为介绍action.yml的作用和创建验证CI的方法会很有帮助。
我还写了一些详细部分,但对于具体的Action实现工作来说可能没有帮助,所以您可以不用阅读它们。

这篇文章的前提

    • Dockerを利用して開発する前提です.JavaScriptでの開発は扱いません.

 

    Dockerにある程度詳しいことを前提としています.

导致开发的背景。

    • CI上でElasticSearchを起動したかったが,公式のActionがまだ利用したいバージョンに対応していなかった

 

    • 利用しているプラグインをインストールした状態でテストしたかったが,こちらも公式が未対応だった

 

    なので,上記2点を改善したアクションを自分で開発することにした.

手順的概述

    1. 创建一个新的仓库

创建 action.yml 文件(定义将要创建的 Action 接受哪些参数)

创建 Dockerfile 文件
创建在容器启动时运行的脚本
定义用于测试开发的 Action 的 CI 工作流程
发布到市场商店中。

细节

创建一个新的存储库

    • 新しいrepositoryを作ります(対象読者には説明不要と思われるので省略)

 

    • READMEを追加せよと公式にはありますが,なくても動きます.もちろん公開するわけなので,あったほうがベター.英語だとよりベターでしょう.

 

    下記は一例です
# elasticsearch-github-actions

setup elasticsearch in your github actions' workflow

## Usage
steps:
- name: Configure sysctl limits
  run: |
    sudo swapoff -a
    sudo sysctl -w vm.swappiness=1
    sudo sysctl -w fs.file-max=262144
    sudo sysctl -w vm.max_map_count=262144

- uses: miyataka/elasticsearch-github-actions@1
  with:
    stack-version: '7.6.2'
    plugins: 'analysis-kuromoji analysis-icu'

创建action.yml(定义接收哪些参数的Action将要创建)

    今回開発したものを引用します
name: 'Run Elasticsearch with Plugins'         # actionの名前,マケプレで表示される.
description: 'Elasticsearch with Plugins'      # actionの説明,マケプレで表示される.
author: 'miyataka'                             # 自分のGitHub IDなど

branding:                                      # マケプレのアイコンを設定する
  icon: 'database'
  color: 'red'

inputs:                                        # Actionを実際にCIで使うときに,渡してほしいパラメータを定義する
  stack-version:
    description: 'The version of Elasticsearch'
    required: true
  plugins:
    description: 'Elasticsearch plugin strings'
    required: false
    default: ''

runs:
  using: 'docker'
  image: 'Dockerfile'
  env:
    STACK_VERSION: ${{ inputs.stack-version }} # inputでもらったパラメータを環境変数に設定してコンテナにわたす
    PLUGINS: ${{ inputs.plugins }}

创建Dockerfile

    • やっていることはシンプルです.entrypoint.shをイメージに追加しているだけ.

 

    今回諸事情でdocker in dockerをやるので,ベースイメージは内部でdockerコマンドを使えるdocker:stableです
FROM docker:stable
RUN apk add --update bash
COPY entrypoint.sh /entrypoint.sh

ENTRYPOINT ["/entrypoint.sh"]

创建在容器启动时执行的脚本。

    • さきほど登場したentrypoint.shを実装します

 

    hello worldでもなんでもいいのですが,説明の都合上今回開発したものを引用します
#!/bin/bash

set -euxo pipefail

# 必須にした引数が存在するかチェック
if [[ -z $STACK_VERSION ]]; then
  echo -e "\033[31;1mERROR:\033[0m Required environment variable [STACK_VERSION] not set\033[0m"
  exit 1
fi

docker network create elastic

PLUGINS_STR=`echo ${PLUGINS} | sed -e 's/\n/ /g'` # 引数に含まれている改行文字を置換
MAJOR_VERSION=`echo ${STACK_VERSION} | cut -c 1`  # メジャーバージョンを取得

PLUGIN_INSTALL_CMD=""

# pluginsを複数インストールするケースがあるのでfor文でコマンドを組み立てる
if [ "x${PLUGINS_STR}" != "x" ]; then
    ARRAY=(${PLUGINS_STR})
    for i in "${ARRAY[@]}"
    do
        PLUGIN_INSTALL_CMD+="elasticsearch-plugin install --batch ${i} && "
    done
fi

# single node only
if [ "x${MAJOR_VERSION}" == 'x6' ]; then # メジャーバージョンによって起動オプションを分岐する.
  docker run \
    --rm \
    --env "node.name=es1" \
    --env "cluster.name=docker-elasticsearch" \
    --env "cluster.routing.allocation.disk.threshold_enabled=false" \
    --env "bootstrap.memory_lock=true" \
    --env "ES_JAVA_OPTS=-Xms1g -Xmx1g" \
    --env "xpack.security.enabled=false" \
    --env "xpack.license.self_generated.type=basic" \
    --ulimit nofile=65536:65536 \
    --ulimit memlock=-1:-1 \
    --publish "9200:9200" \
    --detach \
    --network=elastic \
    --name="es1" \
    --entrypoint="" \
    docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION} \
    /bin/sh -vc "${PLUGIN_INSTALL_CMD} /usr/local/bin/docker-entrypoint.sh"
elif [ "x${MAJOR_VERSION}" == 'x7' ]; then
  docker run \
    --rm \
    --env "node.name=es1" \
    --env "cluster.name=docker-elasticsearch" \
    --env "cluster.initial_master_nodes=es1" \
    --env "discovery.seed_hosts=es1" \
    --env "cluster.routing.allocation.disk.threshold_enabled=false" \
    --env "bootstrap.memory_lock=true" \
    --env "ES_JAVA_OPTS=-Xms1g -Xmx1g" \
    --env "xpack.security.enabled=false" \
    --env "xpack.license.self_generated.type=basic" \
    --ulimit nofile=65536:65536 \
    --ulimit memlock=-1:-1 \
    --publish "9200:9200" \
    --detach \
    --network=elastic \
    --name="es1" \
    --entrypoint="" \
    docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION} \
    /bin/sh -vc "${PLUGIN_INSTALL_CMD} /usr/local/bin/docker-entrypoint.sh"
fi

# 上記で起動したコンテナに対して,curlで死活確認するコンテナを立ち上げる
docker run \
  --network elastic \
  --rm \
  appropriate/curl \
  --max-time 120 \
  --retry 120 \
  --retry-delay 1 \
  --retry-connrefused \
  --show-error \
  --silent \
  http://es1:9200

sleep 10

echo "Elasticsearch up and running"

定義针对本次开发的Action自身进行测试的CI工作流程。

    • すでにActionを使った事がある場合にはご存知でしょうが,.github/workflows/*.ymlを配置するとCIを実行してくれますね.

 

    今回開発したAction自体も思ったとおりに動くか検証するためのCIを作りました
name: Elasticsearch GitHub Action

on: [push]

jobs:
  run-action:
    name: Start Elasticsearch
    runs-on: ubuntu-latest
    strategy:
      matrix:
        elasticsearch: ["6.4.3", "7.6.2"]
    steps:
      - name: Checkout
        uses: actions/checkout@v1

      - name: Configure sysctl limits
        run: |
          sudo swapoff -a
          sudo sysctl -w vm.swappiness=1
          sudo sysctl -w fs.file-max=262144
          sudo sysctl -w vm.max_map_count=262144

      - name: Start Elasticsearch                     # 重要なのはこの部分
        uses: ./
        with:
          stack-version: ${{ matrix.elasticsearch }}
          plugins: |
            analysis-kuromoji
            analysis-icu

      - name: Elasticsearch is reachable
        run: |
          curl --verbose --show-error http://localhost:9200

公开于市场场所

publish-github-action-to-markeplace-button.png

参考和补充信息

    • 引用したrepositoryはこちらです

https://github.com/miyataka/elasticsearch-github-actions

複数バージョンに対応するためのPRを公式に対して出しています.マージされるといいなぁ.

https://github.com/elastic/elastic-github-actions/pull/8

最后

虽然已经有许多动作已经被公开了,但还有许多未能触及到痒处的感觉。
开发开源软件仍然是一个蓝海。让我们一起开发和公开,追求更高效的开发效果!

广告
将在 10 秒后关闭
bannerAds