使用Ansible搭建团队的开发环境(Visual Studio Code和IntelliJ)
由于之前的环境中有一台不太强大的Windows个人电脑和一台功能强大的Linux服务器,因此我们使用Docker创建了开发环境镜像,以便新加入的团队成员可以立即以相同的配置开始工作。
-
- IDEはEclipse。
-
- プラグインをinstallIUオプションで追加。
- フォーマッタ等の設定した結果が保存されるファイルを特定し、その設定を出力するワークスペース作成シェルを作成。
目前我們的自席上有一台配置相當不錯的CentOS 7 PC,因為沒有其他可自由使用的伺服器,所以我決定使用Ansible來搭建開發環境,同時也藉此機會將IDE改為IntelliJ。
安装Ansible
# yum install epel-release
# yum install ansible
# ansible --version
ansible 2.8.1
Ansible角色:IntelliJ
首先,我试着找到解决类似问题的公司,GantSign有限公司提供了解决方案。他们提供了插件添加和格式设置功能,非常适合我需要的。
安装
看一下Ansible Galaxy的页面,上面列出了安装命令,直接执行它。
$ ansible-galaxy install gantsign.intellij-plugins
$ ls ~/.ansible/roles/
gantsign.intellij
但是考虑到以后的事情,按照Ansible Galaxy的规范,将所需的角色记录在文件中以备使用。
- src: gantsign.intellij
这样一来,其他人就能一眼看出你是如何利用外部角色的。
ansible-galaxy install -r requirements.yml
就算有多个角色,也能一次安装完成。
创建Playbook
Ansible 角色:根据 IntelliJ 的 README.md 设定参数。
- hosts: develops
pre_tasks:
- include: tasks/java.yml
roles:
- role: gantsign.intellij
intellij_default_maven_home: '/usr/share/apache-maven'
users:
- username: "{{ ansible_user_id }}"
intellij_jdks:
- name: '1.8'
home: '/usr/lib/jvm/java-1.8.0-openjdk'
- name: '11'
home: '/usr/lib/jvm/java-11-openjdk'
intellij_default_jdk: '11'
# 使用しないプラグイン(まだSubversionを使うシチュエーションがある)
intellij_disabled_plugins:
- com.intellij.uiDesigner
- org.jetbrains.android
- TestNG-J
- hg4idea
- AntSupport
- DevKit
# フォーマッタ(最近は2スペースのインデントが好み)
intellij_codestyles:
- name: GoogleStyle
url: https://raw.githubusercontent.com/google/styleguide/gh-pages/intellij-java-google-style.xml
intellij_default_codestyle: GoogleStyle
# 追加するプラグイン
intellij_plugins:
- Lombook Plugin
- in.1ton.idea.spring.assistant.plugin
-
- ansible_user_idはAnsibleのドキュメントに記載されていた変数で、ansible-playbookコマンドの–userオプションで指定されたリモートユーザ名になる。ユーザを指定する意味は、IntelliJの本体はデフォルトで/opt/idea配下に格納されるが、設定やプラグインはユーザホーム配下に格納されるから。
-
- 不要なプラグインは、手動でインストールしたIntelliJの/.Idea*/config/disabled_plugins.txtを参考にすればプラグインIDが判明する。
- 一方、追加するプラグインのIDは、README.mdにxmlstarletを使ってリストを取得する方法があるものの、イマイチ良く判らなかったので、GitHub上のプラグインのソースから抜き出した。例えばLombokならplugin.xmlのidタグの値を使用する。
为了安全起见,我在下面列出了Java和Maven的安装定义。
- name: install java
become: yes
yum:
name: '{{ packages }}'
vars:
packages:
- java-11-openjdk-devel
- java-11-openjdk-jmods
- java-11-openjdk-src
- java-11-openjdk-javadoc
- name: alternatives java
become: yes
command: alternatives --set java java-11-openjdk.x86_64
- name: install maven repository
become: yes
get_url:
url: http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo
dest: /etc/yum.repos.d/epel-apache-maven.repo
- name: install maven
become: yes
yum:
name: apache-maven
将IntelliJ软件界面改为日语显示
考虑到很多人包括我自己都不擅长英语,因此在Pleiades上将其汉化成日语。
根据所说,Ansible会按照pre_tasks → roles → tasks的顺序进行处理;因此将其添加到tasks中。
- Ansible Galaxyから取得したRoleとRoleの間に処理を挟みたい場合、どうすればいいのかという疑問は保留。
tasks:
- name: IntelliJ日本語化
stat:
path: "{{ ansible_user_dir }}/{{ ansible_local.intellij.general.user_dirname }}/config/jp.sourceforge.mergedoc.pleiades"
register: stat_pleiades
- name: IntelliJ日本語化
get_url:
url: http://ftp.jaist.ac.jp/pub/mergedoc/pleiades/build/stable/pleiades.zip
dest: /tmp/pleiades.zip
when: not stat_pleiades.stat.exists
- name: IntelliJ日本語化
unarchive:
src: /tmp/pleiades.zip
dest: /tmp
remote_src: yes
when: not stat_pleiades.stat.exists
- name: IntelliJ日本語化
shell: mv /tmp/plugins/jp.sourceforge.mergedoc.pleiades "{{ ansible_user_dir }}/{{ ansible_local.intellij.general.user_dirname }}/config/"
when: not stat_pleiades.stat.exists
- name: IntelliJ日本語化
stat:
path: "{{ ansible_user_dir }}/{{ ansible_local.intellij.general.user_dirname }}/config/idea64.vmoptions"
register: stat_idea64_vmoptions
- name: IntelliJ日本語化
shell: cp "{{ ansible_local.intellij.general.home }}/bin/idea64.vmoptions" "{{ ansible_user_dir }}/{{ ansible_local.intellij.general.user_dirname }}/config/"
when: not stat_idea64_vmoptions.stat.exists
- name: IntelliJ日本語化
lineinfile:
dest: "{{ ansible_user_dir }}/{{ ansible_local.intellij.general.user_dirname }}/config/idea64.vmoptions"
line: "{{ item }}"
with_items:
- -Xverify:none
- "-javaagent:{{ ansible_user_dir }}/{{ ansible_local.intellij.general.user_dirname }}/config/jp.sourceforge.mergedoc.pleiades/pleiades.jar"
-
- IntelliJのユーザホーム配下に作成されるフォルダは固定じゃないが、gantsign.intellijがansible_local.intellij.general.user_dirname変数にフォルダ名を格納してくれるので、それを使う。
- Pleiadesのインストール手順だとGUIでVMオプションを指定するのだが、この設定が格納される~/.Idea*/config/idea64.vmoptionsファイルはインストール直後は存在しなかった。ファイルを丸々コピーしてしまうのは、IntelliJのデフォルト設定が変更になった場合とかを考えるとモヤモヤするので、いろいろ足掻いてみた。するとIntelliJのインストールフォルダ配下にオリジナルのidea64.vmoptionsが存在していたので、これをコピーしてVMオプションを追記した。
Ansible 角色:Visual Studio Code
由于GantSign有发布这方面的信息,所以我按照类似的步骤添加了角色。
- role: gantsign.visual-studio-code
users:
- username: "{{ ansible_user_id }}"
visual_studio_code_extensions:
- ms-ceintl.vscode-language-pack-ja
- jebbs.plantuml
- editorconfig.editorconfig
visual_studio_code_settings: {
"plantuml.render": "PlantUMLServer",
"plantuml.server": "http://www.plantuml.com/plantuml",
}
-
- visual_studio_code_settingsにはキーバリュー形式で設定値を指定する。ちょっと昔は設定ファイルが生のJSONファイルだったからキーも簡単に判ったけど、今はGUIになって判らない、とか思ったけど、[Editor: Tab Size]とかの項目名にカーソルを当てると歯車アイコンが現れて、キーが取得できた。
- 仕事で使うならplantuml.serverは自前で建てたPlantUML Serverを指定した方が無難かも。
进行
然后,在hosts文件的[develops]部分中写入目标主机,并在Ansible执行期间避免询问密码,执行命令。
ansible-playbook -i hosts -u ${user} site.yml
- 自分はssh-copy-idで公開鍵を適用対象ホストに配布、かつリモートユーザがパスワードなしでsudoできるようにしました。このあたりはAnsible Vaultを調査する必要がありそう。