운영에서 정기적인 프로그램 리노베이션 자동화

12998 단어 게임개발
Happy Elements 주식회사 카카리아 스튜디오 Advent Calendar 2016의 22일째의 기사입니다.
담당은 @ryooo 입니다. 잘 부탁드립니다.

소개



게임 서비스를 운영하고 있으면 정기적인 이벤트 페스티벌 등의 운영 태스크가 있습니다.
모든 파라미터가 마스터화되어 있으면 데이터 투입만으로 실시할 수 있습니다만, 다양한 사정으로부터 그렇게 되어 있지 않고, 소스 파일상에서 필요한 대응도 몇개인가 있습니다.

그러한 속인적이 되기 쉬운 구현 업무를 자동화해, 엔지니어는 신기능 개발 등의 보다 가치를 낳는 작업에 조금이라도 커밋할 수 있으면 하는 툴의 소개입니다.

※ 소스의 완전한 공개까지는 되어 있지 않고, 본고에서도 여러가지 사랑하고 있습니다만 용서해 주세요.

무엇을 할 수 있는가



input (설정 파일 준비)



소스 파일 수정을 위한 변수 정보가 포함된 설정 파일(yml)


process(rake 작업에 흘리면)





output (프로그램을 수정합니다)



수정된 프로그램


※ 실제로는 설정 파일의 push를 트리거에 CI로 움직이는 것이 좋다고 생각합니다.

전제



자신의 팀은 기본적으로 다음 워크플로에서 이벤트를 개발하고 있습니다.
① 이벤트에 대한 브랜치 작성
② 이벤트에 필요한 프로그램을 수정한다
③ 플래너가 설정한 파라미터와 디자이너가 작성한 이미지를 커밋
그 후 리뷰 테스트 릴리스가 됩니다.

이번 소개하고 있는 것은, 상기의 ②를 실시하기 위한 툴이 됩니다.

구현 소개



개요



설정 파일 (yml)과 템플릿 파일 (erb)에서 리노베이션 후 소스 코드 생성
리노베이션 후 소스 코드를 다음 세 가지 중 하나로 출력
1. 파일로 출력
2. 소스 파일의 제자리에 있는 소스 코드 바꾸기
3. 소스 파일의 제자리에 추가

파일로 출력



템플릿 파일





구현 예


yml = YAML.load("冒頭で紹介したymlの設定ファイル")
yml[:configs].each do |config|
  erbs = YAML.load("前述したテンプレートファイル")
  # ymlの設定ファイル内容をhashで読み込み、OpenStructのインスタンスを通して、bindingとしてerbに流し込む
  result_code = ERB.new(erbs['migrate']).result(OpenStruct.new(config).instance_eval {binding})
  # result_codeをファイルに出力(割愛)
end

출력되는 소스 코드


class EventHoge20161231 < ActiveRecord::Migration
def change

stage_count = 2
monster_ids = [1, 2, 3]
name = 'イベント○○'

stage_count.times do |i|
  Stage.create({
    :name => "#{name} ステージ#{i}",
  })
end

monster_ids.each do |monster_id|
  Monster.create({
    :id => monster_id,
  })
end

end
end

※ seeds.rb에서도 migrate에서도 좋지만 migrate라고 이런 느낌이 듭니다.

소스 파일에서 제자리의 소스 코드 바꾸기



템플릿 파일





소스 파일의 지정



미리, 소스에는 치환 범위를 코멘트로 기재해 둡니다.
# dev.event_hoge.consts start
EVENT_RELEASED_AT = Time.parse("2016/11/30 15:00:00")
# dev.event_hoge.consts end

구현 예


new_code = ERB.new(erbs['program_gsubs'][k]).result(OpenStruct.new(config).instance_eval {binding})

new_code = new_code.gsub(%Q{'}, %Q{"}).gsub(%Q{\/}, %Q{\\/})
from = "# dev\.#{type}\.#{k} start"
to   = "# dev\.#{type}\.#{k} end"

script = <<-EOS
  find #{Rails.root}/app -type f -name '*.rb' -print0 |
  xargs -0 perl -0pi -e 's/#{from}(.*?)#{to}/#{from}\n#{new_code}\n#{to}/s'
EOS
`#{script}`

출력되는 소스 코드



주석의 start ~ end 범위를 템플릿 파일의 구현에 따라 바꿉니다.
 # dev.event_hoge.consts start
-EVENT_RELEASED_AT = Time.parse("2016/11/30 15:00:00")
+EVENT_RELEASED_AT = Time.parse("2016/12/31 15:00:00")
 # dev.event_hoge.consts end

소스 파일의 제자리에 추가



템플릿 파일





소스 파일의 지정


monster_ids = []
# dev.event_hoge.monster_ids append

구현 예


new_code = ERB.new(erbs['program_appends'][k]).result(OpenStruct.new(config).instance_eval {binding})

new_code = new_code.gsub(%Q{'}, %Q{"}).gsub(%Q{\/}, %Q{\\/})
append = "# dev\.#{type}\.#{k} append"

script = <<-EOS
  find #{Rails.root}/app -type f -name '*.rb' -print0 |
  xargs -0 perl -0pi -e 's/#{append}/#{new_code}\n#{append}/s'
EOS
`#{script}`

출력되는 소스 코드



코멘트의 append의 전행에, 템플릿 파일의 구현에 따른 프로그램을 추기합니다.
 monster_ids = []
+monster_ids << [1, 2, 3]
 # dev.event_hoge.monster_ids append

마지막으로



Happy Elements 주식회사 카카리아 스튜디오에서는, 함께 만들기를 하는 동료를 모집하고 있습니다!

물건 만들기를 좋아하는 분은 부디 부담없이 응모하십시오.

카카리아 스튜디오 채용 정보

한 사람 한 사람의 치카라를 최대한으로 끌어낼 수 있는 이런 불가능한 환경과 체제, 문화가 있으면 최고의 제조를 이어갈 것이라고 우리는 믿고 있습니다. 카카리아 스튜디오의 멤버로서 우리와 함께 일하고 싶은 동료를 모집하고 있습니다.

좋은 웹페이지 즐겨찾기